完全是什么都不懂,經(jīng)理大概說了下也沒整明白就開始做.終于今天上午做了個(gè)能跑起來的...淚流滿面啊~下面把學(xué)習(xí)總結(jié)給貼上來.
根文件系統(tǒng)主要包括etc/,bin/,sbin/,lib/,proc/,dev/等根目錄,其他目錄可以根據(jù)應(yīng)用來增加。
創(chuàng)建根文件系統(tǒng)使用了busybox工具,我用的是1.13.3版本,其實(shí)制作方法很簡(jiǎn)單,主要是環(huán)境要和編譯kernel的一樣,編譯鏈?zhǔn)裁吹?/strong>.我這個(gè)kernel是公司原來在cvs服務(wù)器上都做好了的,直接make就出來了,而我之前做kernel出了點(diǎn)問題一直跑不起來,所以為了趕學(xué)習(xí)進(jìn)度就直接用了這個(gè)kernel,因?yàn)槭遣沤佑|嵌入式,最開始沒意識(shí)到這點(diǎn)的重要,浪費(fèi)了很多的時(shí)間,做出來卻沒法跑,或者出現(xiàn)各種錯(cuò)誤,后來反應(yīng)過來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)上各有討論,總體來說在空間不緊張的時(shí)候使用靜態(tài),不容易出錯(cuò))
()Cross Compilerprefix=/usr/local/arm/3.4.1/bin/
(這里是添加編譯器路徑,如果沒有export到PATH環(huán)境變量里,則可以在這里添加)
Installation Options --->
[*]Don't use /usr
其他的設(shè)置可以根據(jù)需要來,這里就默認(rèn)了(不過后面編譯會(huì)出錯(cuò)一些,然后相應(yīng)的修改或者干脆去掉那些用不著的)
1.5.make (下面是我make中出現(xiàn)的錯(cuò)誤與解決)
Error 1.
In file included frommiscutils/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 inthis function)
networking/brctl.c:186: error: (Each undeclared identifier is reportedonly once
networking/brctl.c:186: error: foreach function it appears in.)
networking/brctl.c:186: error: `SIOCBRDELBR' undeclared (first use inthis function)
networking/brctl.c:202: error: `SIOCBRADDIF' undeclared (first use in thisfunction)
networking/brctl.c:202: error: `SIOCBRDELIF' undeclared (first use inthis function)
make[1]: *** [networking/brctl.o]Error 1
make: *** [networking] Error 2
解決: vi (busybox目錄)networking/brctl.c 添加下列
#defineSIOCBRADDBR 0x89a0
#defineSIOCBRDELBR 0x89a1
#defineSIOCBRADDIF 0x89a2
#defineSIOCBRDELIF 0x89a3
繼續(xù)make
Error 3.
In file included fromnetworking/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
最后出來了一些警告,不過終于編譯通過了
1.6.make install
編譯出來的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ò),說明可能超過最大空間了.
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/
接下來進(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/etcrootfs
etc里面的是啟動(dòng)init相關(guān)的設(shè)置,這里以最簡(jiǎn)單來設(shè)置,同時(shí)修改ect下inttab,保留前2行,如下
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
2.8.建立剩下需要的文件夾mkdir lib dev proc
2.9.復(fù)制lib庫,這個(gè)要簡(jiǎn)單的話直接復(fù)制板子提供的文件系統(tǒng)里的lib即可,我就是直接復(fù)制的.如果沒有,則需要拷貝交叉編譯器中的uclibc庫,進(jìn)入交叉編譯器的lib目錄,然后拷貝必要的庫.
2.10.創(chuàng)建dev庫,在busybox目錄/example/bootfloppy下有一個(gè)mkdevs.sh,
sh mkdevs.sh rootfs/dev/
可以用它來快捷建立需要的設(shè)備.也可以根據(jù)需要來使用mknod建立.
至此,最基本的基于ext2的根文件系統(tǒng)制作完成~
2.11打包壓縮
umount /dev/loop0
losetup -d /dev/loop0
gzip -v9 e2fs
最后制作出來的e2fs.gz就是需要的了.
busybox的目錄下example里有個(gè)mkrootfs.sh還是什么的,里面的命令可以好好看看學(xué)學(xué),基本上就是制做文件系統(tǒng)的全過程.
聯(lián)系客服