用busybox构建根文件系统及出错总结

来源:互联网 发布:雅思词汇 知乎 编辑:程序博客网 时间:2024/05/18 01:59

         总结下这几天来用busybox构建根文件系统出现的一些问题,总的来说比较重要的就是配置busybox的过程,必须要知道哪些是需要的,是必须加载的,否则当内核启动后加载文件系统会出现非人类所能理解的问题。所以只要我们知道哪些基本的配置项是必须的,保证我们的文件系统能正常加载后,其它的一些命令可以根据 自己的实际情况自己添加就行了。废话少说,下面开始进行配置busybox吧,本人使用的是最新的busybox1.16.2版本。

 

           1 正确配置busybox(可能本人理解有误,有些可能也不是必须项,只是出于解决问题的角度来进行此配置)

 

           输入:#make menuconfig后出现类似配置linux kernel的界面,然后你就可以按下面几个选项进行配置了。

 

            Init Utilities --->

                init

                这个init项一定要选上,用busybox来初始化系统

 

            Login/Password Management Utilities --->

                 Use internal password and group functions rather than system functions

                 这个如果不选上,busybox识别不了lib下的libness, 然后解析不了uid...后果很严重


            Shell --->下

                    选择ash

                    job control

                    这个必须选上,否则无法ctrl+c

 

            Busybox Settings -> Build Options -->

                  Build BusyBox as a static binary (no shared libs)

                  我不知道为什么,大家都选择的是编译成静态的形式,据说若是编译成动态的话有时加载会比较麻烦(有待确认,知道的人告诉一声)

 

            General Configuration

                  Show verbose applet usage messages

                   Support for SUID/SGID handling

                   Runtime SUID/SGID configuration via /etc/busybox.conf 

 

 

            Installation Options

                  Don't use /usr
                  (./_install) BusyBox installation prefix

              这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接.

 

           以上我认为必须的配置项完成后,下面就可以针对自己的实际情况配置添加自己所需要的命令。

 

           2 编译busybox 1.16.2

           当上述的基本配置项+其余可选项都配置完后就可以进行编译了,编译也是相当简单的。主要进行以下几个步骤:

            make

            make CONFIG_PREFIX=./../ install               

            注意:CONFIG_PREFIX是指定编译后生成的文件系统存放的路径。

 

           3 增加系统所需要的其它文件夹及文件

           建立文件夹:#mkdirdev etc lib mnt proc var tmp

 

          建立编立可执行脚本文件:

           进入_install/etc目录,建立inittab文件,编写脚本内容如下:

             #This isrun first excep when booting in single-user mode.

             ::sysinit:/etc/init.d/rcS

            #/bin/shinvocatioins on selected ttys

            #Start an"askfirst" shell on the console(whatever that may be)

           ::askfirst:-/bin/sh

            #Stuff todo when restarting the init process

           ::restart:/sbin/init

           #Stuff todo before rebooting

          ::ctrlaltdel:/sbin/reboot

 

           进入_install/etc目录,建立init.d目录,进入init.d目录,建立rcS文件,内容如下:

          #!/bin/sh

           #This isthe first script called by init process

          /bin/mount -a

          exec /usr/etc/rc.local

         保存退出,运行

          #chmod 777 rcS  //改变文件权限

 

          进入_install/etc目录,  建立fstab文件,内容如下:

          none   /proc   proc   defaults   0 0

          tmpfs   /dev/shmtmpfs  defaults   0 0

 

          进入_install/etc目录,  建立profile文件,文件内容如下:

          #/etc/profile

          PATH=/bin:/sbin:/usr/bin:/usr/sbin

          LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

          export PATH LD_LIBRARY_PATH

        注:profile用于设置shell的环境变量,shell启动时会读取/etc/profile来设置环境变量

 

          进入_install/usr目录, 建立etc目录

           进入_install/usr/etc目录,建立rc.local文件,内容哪下:

          #!/bin/sh

          #add userspecified script

           cd/dev

            ln -s/dev/fb/0 fb0

             ln -svc/0 tty0

           ln -svc/1 tty1

            ln -svc/2 tty2

 

          mknod-m 660 mtd0 c 90 0  #标红色的偶数0/2/4表示可读可写,mtd0/1/2代表了1f00/01/02,对

          mknod -m660 mtd1 c 90 2  #mtd0/1/2的操作==对1f00/01/02的操作

          mknod -m660 mtd2 c 90 4

         mknod -m660 1f00 b 31 0

          mknod -m660 1f01 b 31 1

          mknod -m660 1f02 b 31 2

  (具体还得根据对Nandflash的分区情况进行)

        保存退出,运行#chmod 777rc.local  //改变文件的执行权限

 

       建立嵌入式系统库:

     #cp/home/linux/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/arm-softfloat- 

     linux-gnu/lib  _install/ -a

     #cd_install/lib

    删除所有的目录以及静态库(.a文件)

    减肥减小库的体积,运行:

    #arm=softfloat-linux-gnu-strip *.so

--------------------------------------------------------------配置完成---------------------------------------------------------------------

 

 

按照以上配置和建立余下的文件后,根文件系统就制作成功了。然后把上述制作好的文件系统copy到NFS文件系统主目录下,后面需要做的工作就是通过内核启动时自动的加载它,前提是PC机必须要配置好TFTP服务器和NFS网络文件系统才行,然后运过设定内核的启动参数bootargs,让其加载根文件系统,如果能够mount成功就可以正常进入我们的根文件系统了。

 

1 设置bootargs内核启动参数

  本人是这样设定的:

set bootargs noinitrd init=/linuxrc mem=64M console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.0.94:/home/cpc/nfs ip=192.168.0.100

 具体含义相信大家都知道,就不解释啦!如果不出差错,系统就能够正常加载了。

 

2 遇到的一些问题:

(1)加载根文件系统时出现:

 Free memory :112K

request_module: runaway loop modprobe binfmt-464c

request_module: runaway loop modprobe binfmt-464c

request_module: runaway loop modprobe binfmt-464c

request_module: runaway loop modprobe binfmt-464c

request_module: runaway loop modprobe binfmt-464c

.......

此问题困扰了我2天,妈妈的,让我心情大为不爽。不过最终还是解决了,只要不放弃,问题是总能解决的,关键是时间问题啊。出现此现象的原因在于系统无法执行linuxrc。问题出在busybox,由于我的linuxrc的首句是#!/bin/sh,也就是由sh来解析该脚本文件,但是我的busybox生成的bin文件下根本没有sh命令,当然无法执行。解决方法是重新配置busybox,在shell---->Choose your default shell(ash)---->下选中ash,然后make,最后在make加上ARCH=arm和CROSS_COMPILE=arm-linux-(建议使用绝对路径,我一直这么用),即使在Makefile中已经指定了ARCH和CROSS_COMPILE,这是网上一位同仁给的建议,否则有可能遇到一些问题,比如我这次遇到的request_module: runaway loop modprobe binfmt-464c      

呵呵,郁闷吧!!!不过问题终归解决了,庆幸下吧!说实在的,本人对此问题超郁闷!

 

(2)加载根文件系统时出现:

Warning:unable to open initialconsole

 

解决办法:

         cd /dev

         mknod console c 5 1