总结下这几天来用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 增加系统所需要的其它文件夹及文件
建立文件夹:#mkdir dev etc lib mnt proc var tmp
建立编立可执行脚本文件:
进入_install/etc目录,建立inittab文件,编写脚本内容如下:
#This is run first excep when booting in single-user mode.
::sysinit:/etc/init.d/rcS
#/bin/sh invocatioins on selected ttys
#Start an "askfirst" shell on the console(whatever that may be)
::askfirst:-/bin/sh
#Stuff to do when restarting the init process
::restart:/sbin/init
#Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
进入_install/etc目录,建立init.d目录,进入init.d目录,建立rcS文件,内 容如下:
#!/bin/sh
#This is the 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/shm tmpfs 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 user specified script
cd /dev
ln -s /dev/fb/0 fb0
ln -s vc/0 tty0
ln -s vc/1 tty1
ln -s vc/2 tty2
mknod -m 660 mtd0 c 90 0 #标红色的偶数0/2/4表示可读可写,mtd0/1/2代表了1f00/01/02,对
mknod -m 660 mtd1 c 90 2 #mtd0/1/2的操作==对1f00/01/02的操作
mknod -m 660 mtd2 c 90 4
mknod -m 660 1f00 b 31 0
mknod -m 660 1f01 b 31 1
mknod -m 660 1f02 b 31 2
(具体还得根据对Nandflash的分区情况进行)
保存退出,运行#chmod 777 rc.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 initial console
解决办法:
cd /dev
mknod console c 5 1