完全是什么都不懂,经理大概说了下也没整明白就开始做.终于今天上午做了个能跑起来的...泪流满面啊~下面把学习总结给贴上来. 根文件系统主要包括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 Compiler prefix=/usr/local/arm/3.4.1/bin/ (这里是添加编译器路径,如果没有export到PATH环境变量里,则可以在这里添加)
Installation Options ---> [*]Don't use /usr
其他的设置可以根据需要来,这里就默认了(不过后面编译会出错一些,然后相应的修改或者干脆去掉那些用不着的)
1.5.make (下面是我make中出现的错误与解决) 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. 保存,继续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 继续make
Error 3. In file included from networking/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/etc rootfs 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还是什么的,里面的命令可以好好看看学学,基本上就是制做文件系统的全过程. |
|
来自: langhuayipian > 《linux文件系统》