1 busybox 源码下载
从busybox官方主页http://www.busybox.net,下载busybox源码,目前最新版本为busybox-1.23.0.tar.bz2
#tar –jvxf busybox-1.23.0.tar.bz2
进入解压后的busybox源码目录
#cdbusybox-1.23.0
2 busybox编译及安装
编译busybox主要配置以下两个方面:
-
busybox的安装目录
-
busybox的交叉编译器
步骤跟编译linux内核时很像
#makemenuconfig
出现一个图形界面,如图1所示
图1
选择BusyboxSettings,如图2。这里可以对编译、安装以及调试等模式进行配置。
图2
配置安装路径选择InstallationOptions-->Busybox installationprefix输入自定义的安装目录,这里安装在/home/smdt/rootfs,如图3,图4所示。
图3
图4
【注】如果不指定安装目录,则busybox将默认在busybox源码目录下生成一个_install目录。
然后选择BuildOptions,对交叉编译器以及编译方式进行配置。如图5所示
图5
其中的第一项是BuildBusybox as a static binary(nosharedlibs),如果选择上,则busybox将以静态形式进行编译,否则将以动态方式编译。此外,还需要对交叉编译环境进行配置,选择其中的CrossCompilerPerfix,输入交叉编译器的前缀,我们的嵌入式平台上使用的是arm-linux-gnueabihf-的交叉编译工具。如图6所示
图6
这里我们先选择静态编译,动态方式的稍后再讲,注意Buildwith Large File Support (for accessing files > 2GB)不要选(默认是选上的),否则编译后会出现如下错误:
miscutils/lib.a(readahead.):Infunction ‘readahead_main’
readahead.(.text.readahead_main+0×70):undefinedreference to ‘readahead’
collect2:ldreturned 1 exit status
make:***[busybox_unstripped ]Error 1
另外,除了上述图形化界面设置交叉编译器的方式外,也可以直接在busybox的目录下打开Makefile文件,修改CROSS_COMPILE?=arm-linux-gnueabihf-即可。
#make
#makeinstall
此时在/home/smdt/rootfs/下可以看到一共有3个目录和一个文件,分别是:bin、sbin和usr目录以及linuxrc文件。如图7所示。
图7
3添加etc目录及基本配置文件
参考一个正常的linux系统将会发现,此时busybox建立的文件系统还缺少很多文件。如果用这个作为文件系统,将是无法运行的。生成这些配置可以选择的方法有2种,一种是直接从一个正常运行的系统中拷贝,另一种是借助于busybox的examples。显然,选择第二种会容易的多,我们直接拷贝examples/bootfloopy/etc到install目录下。
#cp–a -R /home/smdt/busybox-1.23.0/examples/bootfloppy/etc/examples/bootfloppy/etc/home/smdt/rootfs
4添加dev目录及基本设备文件
调试时要通过串口发送消息到终端显示。因此串口控制台和终端2个设备文件是必不可少的。
#mkdirdev
#mknoddev/console c 5 1
#mknoddev/ttyS0 c 4 64
其中console,ttyS0的主次设备可以通过自己ubuntu系统下ls-l 得到,如下所示:
smdt@smdt-System-Product-Name:/$ls -l /dev/ttyS0
crw-rw----1 root dialout 4, 64 1月1917:47 /dev/ttyS0
同样的方法建立fb0
#mknoddev/fb0 c 29 0
5.添加其他常用目录
可以选择home、root、proc、mnt、lib、var、opt、tmp。
#mkdirroot home lib tmp mnt sys proc opt
#mkdirusr/lib usr/bin
此时,一个基本的文件系统的功能就已经完成了。
6将文件系统做成roofs.img
//初始化一个名为rootfs.img大小为1024M的内存,其中if=inputfile of=output file bs代表一个block的大小,默认为512bytes,count代表block的数量
#ddif=/dev/zero of=./rootfs.img bs=512 count=2097152
//格式化该内存空间
#mkfs.ext4./rootfs.img
//挂载该内存空间到/mnt
#mount-t ext4 rootfs.img /mnt
//复制刚才做的文件系统的内容到/mnt下
#cp-R -a /home/smdt/rootfs/* /mnt
//卸载该设备
#umount/mnt
7 测试中可能遇到的问题
可能会遇到如下问题,系统登录后终端上会不断打印:
cannotopen /dev/ttyS2:No such file or directory.
原因出在/etc目录下的inittab文件,我们看一下其内容:
::sysint:/etc/init.d/rcS
::respawn:-/bin/sh
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount–a -r
这条语句表示在第3个虚拟终端打开一个无须登录验证的shell。而我们之前没有建立这个tty2设备,因此会出错。解决的办法有2个:一是屏蔽该语句,二是建立该设备节点。我们选择将其屏蔽。