完全是什么都不懂,经理大概说了下也没整明白就开始做.终于今天上午做了个能跑起来的...泪流满面啊~下面把学习总结给贴上来.
根文件系统主要包括etc/,bin/,sbin/,lib/,proc/,dev/等根目录,其他目录可以根据应用来增加。
创建根文件系统使用了busybox工具,我用的是1.13.3版本,其实制作方法很简单,主要是环境要和编译kernel的一样,编译链什么的.我这个kernel是公司原来在cvs服务器上都做好了的,直接make就出来了,而我之前做kernel出了点问题一直跑不起来,所以为了赶学习进度就直接用了这个kernel,因为是才接触嵌入式,最开始没意识到这点的重要,浪费了很多的时间,做出来却没法跑,或者出现各种错误,后来反应过来1天多点就弄好了.
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-
(这里需要修改成编译链名称,我实际用的是xscale_be-)
找到
ARCH ?= $(SUBARCH)
修改为
ARCH ?= arm
1.3.进行默认配置
make defconfig
1.4.对配置信息进行修改
make menuconfig
Busybox Settings --->
Build Options --->
[*]Build BusyBox as a static binry(no shared libs)
(动态或静态网上各有讨论,总体来说在空间不紧张的时候使用静态,不容易出错)
()Cross Compilerprefix=/usr/local/arm/3.4.1/bin/
(这里是添加编译器路径,如果没有export到PATH环境变量里,则可以在这里添加)
Installation Options --->
[*]Don't use /usr
其他的设置可以根据需要来,这里就默认了(不过后面编译会出错一些,然后相应的修改或者干脆去掉那些用不着的)
1.5.make (下面是我make中出现的错误与解决)
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.
保存,继续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
继续make
Error 3.
In file included fromnetworking/ifenslave.c:105:
出现一大堆关于ifenslave的错
解决:
make menuconfig
去掉networking -> ifenslave.
保存,继续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,
保存,继续make
最后出来了一些警告,不过终于编译通过了
1.6.make install
编译出来的bin和sbin就在_install里面
2.构建文件系统(部分需要root权限)
2.1.mkdir rootfs (后面文件系统就挂载在这里)
2.2.dd if=/dev/zero of=ucfs bs=1k count=6144
后面的6144是指解压后6M大小的文件系统,如果跑的时候报错,说明可能超过最大空间了.
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/
接下来进入rootfs/目录,可以看到里面已经有了一个lost+found目录.在rootfs/目录中添加相关的文件和目录,完成根文件系统的构建.
2.6.cp –avrf (busybox目录)/_install/* rootfs
2.7.cp –avrf (busybox目录)/example/bootfloppy/etcrootfs
etc里面的是启动init相关的设置,这里以最简单来设置,同时修改ect下inttab,保留前2行,如下
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
2.8.建立剩下需要的文件夹mkdir lib dev proc
2.9.复制lib库,这个要简单的话直接复制板子提供的文件系统里的lib即可,我就是直接复制的.如果没有,则需要拷贝交叉编译器中的uclibc库,进入交叉编译器的lib目录,然后拷贝必要的库.
2.10.创建dev库,在busybox目录/example/bootfloppy下有一个mkdevs.sh,
sh mkdevs.sh rootfs/dev/
可以用它来快捷建立需要的设备.也可以根据需要来使用mknod建立.
至此,最基本的基于ext2的根文件系统制作完成~
2.11打包压缩
umount /dev/loop0
losetup -d /dev/loop0
gzip -v9 e2fs
最后制作出来的e2fs.gz就是需要的了.
busybox的目录下example里有个mkrootfs.sh还是什么的,里面的命令可以好好看看学学,基本上就是制做文件系统的全过程.
联系客服