使用Busybox1.13.3制作yaffs2根文件系统

    技术2022-05-20  59

    使用Busybox1.13.3制作yaffs2根文件系统(hlhq转) 2009-09-25 21:53 2009-09-13 14:42(从hlhq转来)

    准备工具1:mkyaffs2image

    用途:用来制作目标文件系统映像。

    工具2:busybox

    用途:生成目标文件系统。网上有对它的介绍。

    以上工具均来自友善之臂http://www.arm9.net/download.asp。交叉编译工具arm-linux-gcc4.3.2。(在此衷心感谢资源、资料提供者)

    制作过程:

    选定 busybox-1.13.3.tgz这个版本, 以静态方式编译, 即生成的 busybox 不需要共享库的支持就能运行。这样做我们就不需要布署程序库了。缺点是自己写的 arm-linux 程序在这个根文件系统中是不能运行的,因为缺少共享程序库的支持。不过不用担心,通过在目标机里以挂接 NFS 的方式, 将宿主机的 arm-linux-gcc 编译器的库文件挂到 arm-linux 的 /lib 下, 就可完美的运行我们自己的程序了。

    现在开始制作静态链接库的根文件系统。

    1、准备根文件系统

    在机器上建立rootfs的文件夹

    #mkdir rootfs

    在rootfs中建立linux系统中典型的文件夹

    #cd rootfs

    #mkdir root home bin sbin etc dev usr lib tmp mnt sys proc

    #mkdir usr/lib usr/bin

    #pwd

    /home/su/rootfs

    2、解压源码包

    #tar xzvf busybox-1.13.3.tgz

    #cd busybox-1.13.3

    3、修改 Makefile,

    #vi Makefile

    将Makefile中的

    CROSS_COMPILE ?=

    改为

    CROSS_COMPILE ?= arm-linux-

    4、定制 busybox

    选择busybox下全部的可执行程序

    #make defconfig

    进到配置选项

    #make menuconfig

    设置静态编译方式

    Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)

    Busybox Settings ---> Install Options ---> 中输入建立根文件系统的文件所在的路径/home /rootfs。

    其它的默认。

    确保 [*] Build BusyBox as a static binary (no shared libs) 被选中,保存退出

    5、执行 make 编译

    #make

    编译通过, busybox 被生成了, 然后执行

    #make install

    busybox 就被安装到指定的路径下了/home /rootfs,这时可发现rootfs下多了个liunxrc的文件,bin、sbin下也多了很多文件。用ls –l命令查看其中的一个文件,可发现其是链接到busybox的一个连接符,所以我们之后在目标机上运行的命令大多都会调用busybox这个文件的。

    若之前忘了指定路径,默认生成到临时目录busybox-1.13.3/_install 下了。

    6、编写配置/etc下的初始化程序(可省略)

    最简单的做法是把busybox-1.9.2/examples/bootfloppy/etc下的全部文件拷到目标文件的etc目录下

    #cd /home/su/busybox-1.9.2/examples/bootfloppy/etc

    #cp –rf * /home/su/rootfs/etc

    也可自己写这些文件。

    7、把rootfs做成镜像

    #./mkyaffs2image 2 rootfs rootfs.yaffs2

    8、把rootfs.yaffs2 烧写到目标机中。

    9、运行目标机

    这时会遇到一个错误信息:

    Can’t open tty2

    Can’t open tty3

    Can’t open tty4

    解决办法:把/rootfs/etc/ inittab 文件的第三行“tty2::askfirst:-bin/sh”删除掉。

    返回到第7步重做。

    10、其他操作

    1)用 chmod 777 linuxrc改变linuxrc属性,否则可能无法执行。

    2)运行时提示Warning :unable to open an initial console.

    原来问题是,取消了Devfs后,不会自动生成设备了,也就没有null和console,就不能启动。解决方法:

    在rootfs/dev/下:

    mknod -m 660 null c 1 3

    mknod -m 660 console c 5 1

    OK了.

    ------------------------------------------------------------------------------------------

    现实中,动态编译的方法更适合工程的需要,所以一般是采用动态的方法编译根文件系统的。若选择动态编译的办法,大体方法还是一样的,存在一些不同之处是:

    不同之处之1是:

    进到配置选项

    #make menuconfig

    选择动态方式

    Busybox Settings ---> Build Options ---> [*] Build Shared libbusybox

    不同之处之2是(最大的不同之处):

    编译完成后,需进到rootfs目录的lib中,往里面添加一些库文件

    #cd /home/su/rootfs/lib

    这里有点麻烦,我怎么知道需要什么库文件的支持呢?

    最简单的办法是把arm-linux-gcc 3.3.2下的整个lib库拷进来,简单省事。但是这么做存在一个问题,做出的根文件系统非常大。

    另一个办法是:

    #cd /home/su/rootfs/bin

    #arm-linux-readelf -d busybox | grep Shared

    这样就可以显示出系统运行起来需要什么库文件,再把相应的库文件拷到/home/su/rootfs/lib下。一般而言,系统库用到两个:动态链接器ld-linux.so和c函数库Glibc,Glibc包括:

    ld-linux:动态链接库,必需

    libc: 标准c函数库,必需

    libm: 数学库,一般需要

    libdl: 用于动态装载共享库,较少用到

    libcrypt: 加密附加库,需要认证的程序用到,较少用

    libpthread: POSIX线程库,一般需要

    如果需要某个函数库,我们可以将这些库和对应的符号链接拷到目标根文件系统的/lib目录下。简单起见,应该使用-d选项或-a选项调用cp命令,这样可保留完整的符号链接信息。

     

    例:

    #cp –a libc.so.6 /home/su/rootfs/lib/

    为了减少运行时库的大小,我们应该使用交叉编译版本即arm-linux-gcc 的strip工具来处理根文件系统的库文件,把二进制文件中的包含的符号表和调试信息删除掉。

    例:

    #arm-linux-strip /home/su/rootfs/lib/*.so

    交叉编译器4.3.2的lib哪里觅??

    之前将usr/local/arm/4.3.2/arm-non-linux-gnueabi/libc/lib下的*.so文件一股脑儿copy到rootfs/lib/下,结果下载后返回“Kernel panic - not syncing: Attempted to kill init!”出错信息。后来终于想到可能是库链接出问题,重新复制usr/local/arm/4.3.2/arm-non-linux-gnueabi/libc/armv4t/lib下的文件,问题解决!

    后记:被动态编译库文件问题折磨了很久,希望本文对大家有点帮助。本文源于网友文章+自身实践,在此未提供引用部分出处,见谅。


    最新回复(0)