完全是什么都不懂,經(jīng)理大概說(shuō)了下也沒(méi)整明白就開(kāi)始做.終于今天上午做了個(gè)能跑起來(lái)的...淚流滿面啊~下面把學(xué)習(xí)總結(jié)給貼上來(lái). 根文件系統(tǒng)主要包括etc/,bin/,sbin/,lib/,proc/,dev/等根目錄,其他目錄可以根據(jù)應(yīng)用來(lái)增加,。 創(chuàng)建根文件系統(tǒng)使用了busybox工具,我用的是1.13.3版本,其實(shí)制作方法很簡(jiǎn)單,主要是環(huán)境要和編譯kernel的一樣,編譯鏈?zhǔn)裁吹?/strong>.我這個(gè)kernel是公司原來(lái)在cvs服務(wù)器上都做好了的,直接make就出來(lái)了,而我之前做kernel出了點(diǎn)問(wèn)題一直跑不起來(lái),所以為了趕學(xué)習(xí)進(jìn)度就直接用了這個(gè)kernel,因?yàn)槭遣沤佑|嵌入式,最開(kāi)始沒(méi)意識(shí)到這點(diǎn)的重要,浪費(fèi)了很多的時(shí)間,做出來(lái)卻沒(méi)法跑,或者出現(xiàn)各種錯(cuò)誤,后來(lái)反應(yīng)過(guò)來(lái)1天多點(diǎn)就弄好了. 1.編譯busybox
1.1解壓該包 tar -xvjf busybox-1.13.3.tar.bz2 cd busybox-1.13.3
1.2.修改Makefile 找到 CROSS_COMPILE ?= 修改為CROSS_COMPILE ?=arm-linux- (這里需要修改成編譯鏈名稱,我實(shí)際用的是xscale_be-)
找到 ARCH ?= $(SUBARCH) 修改為 ARCH ?= arm
1.3.進(jìn)行默認(rèn)配置 make defconfig
1.4.對(duì)配置信息進(jìn)行修改 make menuconfig
Busybox Settings ---> Build Options ---> [*]Build BusyBox as a static binry (no shared libs) (動(dòng)態(tài)或靜態(tài)網(wǎng)上各有討論,總體來(lái)說(shuō)在空間不緊張的時(shí)候使用靜態(tài),不容易出錯(cuò)) ()Cross Compiler prefix=/usr/local/arm/3.4.1/bin/ (這里是添加編譯器路徑,如果沒(méi)有export到PATH環(huán)境變量里,則可以在這里添加)
Installation Options ---> [*]Don't use /usr
其他的設(shè)置可以根據(jù)需要來(lái),這里就默認(rèn)了(不過(guò)后面編譯會(huì)出錯(cuò)一些,然后相應(yīng)的修改或者干脆去掉那些用不著的)
1.5.make (下面是我make中出現(xiàn)的錯(cuò)誤與解決) Error 1. In file included from miscutils/watchdog.c:13: /opt/montavista/pro/devkit/arm/xscale_be/target/usr/include/linux/watchdog.h:17: error: parse error before "__u32" /opt/montavista/pro/devkit/arm/xscale_be/target/usr/include/linux/watchdog.h:20: error: parse error before "identity" /opt/montavista/pro/devkit/arm/xscale_be/target/usr/include/linux/watchdog.h:21: error: parse error before '}' token make[1]: *** [miscutils/watchdog.o] Error 1 make: *** [miscutils] Error 2
解決: make menuconfig 去掉Miscellaneous Utilities -> watchdog. 保存,繼續(xù)make
Error 2. networking/brctl.c: In function `brctl_main': networking/brctl.c:186: error: `SIOCBRADDBR' undeclared (first use in this function) networking/brctl.c:186: error: (Each undeclared identifier is reported only once networking/brctl.c:186: error: for each function it appears in.) networking/brctl.c:186: error: `SIOCBRDELBR' undeclared (first use in this function) networking/brctl.c:202: error: `SIOCBRADDIF' undeclared (first use in this function) networking/brctl.c:202: error: `SIOCBRDELIF' undeclared (first use in this function) make[1]: *** [networking/brctl.o] Error 1 make: *** [networking] Error 2
解決: vi (busybox目錄)networking/brctl.c 添加下列 #define SIOCBRADDBR 0x89a0 #define SIOCBRDELBR 0x89a1 #define SIOCBRADDIF 0x89a2 #define SIOCBRDELIF 0x89a3 繼續(xù)make
Error 3. In file included from networking/ifenslave.c:105: 出現(xiàn)一大堆關(guān)于ifenslave的錯(cuò)
解決: make menuconfig 去掉networking -> ifenslave. 保存,繼續(xù)make
Error 4. networking/interface.c:818: error: `ARPHRD_INFINIBAND' undeclared here (not in a function) networking/interface.c:818: error: initializer element is not constant networking/interface.c:818: error: (near initialization for `ib_hwtype.type') make[1]: *** [networking/interface.o] Error 1 make: *** [networking] Error 2
解決: vi networking/interface.c 找到818行.type = ARPHRD_INFINIBAND, 改為.type = -1, 保存,繼續(xù)make
最后出來(lái)了一些警告,不過(guò)終于編譯通過(guò)了 1.6.make install 編譯出來(lái)的bin和sbin就在_install里面
2.構(gòu)建文件系統(tǒng)(部分需要root權(quán)限)
2.1.mkdir rootfs (后面文件系統(tǒng)就掛載在這里) 2.2.dd if=/dev/zero of=ucfs bs=1k count=6144 后面的6144是指解壓后6M大小的文件系統(tǒng),如果跑的時(shí)候報(bào)錯(cuò),說(shuō)明可能超過(guò)最大空間了. 2.3.losetup -e none /dev/loop0 e2fs如果loop0已被使用,,可以使用loop1等。 2.4.mke2fs -m 0 /dev/loop0 6144 2.5.mount -t ext2 /dev/loop0 ./rootfs/ 接下來(lái)進(jìn)入rootfs/目錄,可以看到里面已經(jīng)有了一個(gè)lost+found目錄.在rootfs/目錄中添加相關(guān)的文件和目錄,完成根文件系統(tǒng)的構(gòu)建. 2.6.cp –avrf (busybox目錄)/_install/* rootfs 2.7.cp –avrf (busybox目錄)/example/bootfloppy/etc rootfs etc里面的是啟動(dòng)init相關(guān)的設(shè)置,這里以最簡(jiǎn)單來(lái)設(shè)置,同時(shí)修改ect下inttab,保留前2行,如下 ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh 2.8.建立剩下需要的文件夾mkdir lib dev proc 2.9.復(fù)制lib庫(kù),這個(gè)要簡(jiǎn)單的話直接復(fù)制板子提供的文件系統(tǒng)里的lib即可,我就是直接復(fù)制的.如果沒(méi)有,則需要拷貝交叉編譯器中的uclibc庫(kù),進(jìn)入交叉編譯器的lib目錄,然后拷貝必要的庫(kù). 2.10.創(chuàng)建dev庫(kù),在busybox目錄/example/bootfloppy下有一個(gè)mkdevs.sh, sh mkdevs.sh rootfs/dev/ 可以用它來(lái)快捷建立需要的設(shè)備.也可以根據(jù)需要來(lái)使用mknod建立. 至此,最基本的基于ext2的根文件系統(tǒng)制作完成~ 2.11打包壓縮 umount /dev/loop0 losetup -d /dev/loop0 gzip -v9 e2fs
最后制作出來(lái)的e2fs.gz就是需要的了.
busybox的目錄下example里有個(gè)mkrootfs.sh還是什么的,里面的命令可以好好看看學(xué)學(xué),基本上就是制做文件系統(tǒng)的全過(guò)程. |
|
來(lái)自: langhuayipian > 《linux文件系統(tǒng)》