1 根文件系统结构
根文件系统是所有文件和设备节点的起始点,包括系统所必须的各种工具软件、库文件、脚本、配置文件等一系列的文件。一个基本的Linux根文件系统包含有以下的目录:dev、proc、bin、etc、usr、Lib、temp、var、usr等等目录。其中dev是设备文件节点目录,proc是挂载proc文件系统所用的目录,bin目录下面包含了系统的基本命令,etc目录是系统启动脚本所在的目录,Lib是系统默认的动态链接库目录,usr是用户目录,temp是临时目录,用来保存临时文件,var目录包含系统运行时要改变的数据。以上都是根文件系统所必须的目录
2 Busybox简介
熟练嵌入式Linux的朋友对busybox一定不会陌生,它是标准Linux工具的一个单个可执行实现,被形象的称为嵌入式Linux系统中的“瑞士军刀”,因为它将许多常用的UNIX工具和命令结合到一个单独的可执行程序中。虽然busybox中的这些工具相对于GNU常用工具功能有所简化,但对于嵌入式系统来说这已经足够了。同时,busybox仅仅需要几百KB的空间资源就能实现大量的Linux命令(如Ls,cat,cp等),节省系统空间容量,使用简洁方便,不需裁剪就可以直接将其应用于嵌入式系统的根文件系统。
Busybox 开放源代码,遵守GPL协议,本文以虚拟机为载体,以busybox-1.1.3为例,完成的源代码可从http://www.busybox.net下载,压缩包大小为1.3M左右。
3 配置busybox
首先,建立交叉编译环境,使用arm-linux- 3.3.2版本,特别要主要arm-linux- 编译工具和busybox1.1.3版本的对应,不同的对应可能会出现许多意想不到的错误。
安装arm-linux-3.3.2 ,在根目录下解压即可tar –jxvf arm-linux-gcc-3.3.2.tar.bz2
检查是否生成/usr/locaL/arm 目录,若生成说明安装完成。
其次,修改环境变量export PATH=$PATH:/usr/locaL/arm/3.3.2/bin/:
并将busybox-1.1.3源代码解压后,进入busybox目录:
#tar –jvxf busybox-1.1.3.tar.bz2
#cd busybox-1.1.3
#make menuconfig
出现一个图形界面,如图1,选择Busybox Settings,这里可以对编译、安装以及调试等模式进行配置。
<img onload="if(this.width>600)makesmallpic(this,600,1800);" src="http://www.mesworld.cn/upload_files/article/112/1_20100721110737_g3uhf.jpg" title="1.JPG" height="350" width="444" border="0">
然后选择BuiLd Options,对交叉编译器以及编译方式进行配置。
其中的第一项是BuiLd Busybox as a static binary(no shared Libs),如果选择上,则busybox将以静态形式进行编译,否则将以动态方式编译。此外,还需要对交叉编译环境进行配置,选择其中的Cross CompiLer Perfix,输入交叉编译器的前缀,我们的嵌入式平台上使用的是arm-linux-的交叉编译工具,如图2。
<img onload="if(this.width>600)makesmallpic(this,600,1800);" src="http://www.mesworld.cn/upload_files/article/112/1_20100721120736_ec87y.jpg" title="2.JPG" height="344" width="449" border="0">
接下来,配置busybox过程中的几个重要选择:
1)在GeneraL Configuration中,选择“Support for devfs”选项
2)在Linux System UtiLities选项中,“Support Loopback mounts”和“Support for the oLd /etc/mtab fiLe”2个选项应该选中
3)在SheLL选项中,应该选中默认sheLL:ash,否则不会生成sh,导致不能解释脚本文件。
最后运行命令:
#make
#make instaLL
将默认在busybox源码目录下生成一个_instaLL目录。到此,busybox基本上可以功成身退了。我们需要的就是busybox编译出来的这个_instaLL目录。进入_instaLL目录,可以看到一共有3个目录和一个文件,分别是:bin、sbin和usr目录以及linuxrc文件。删除linuxrc文件,将其他的目录打包。查看_instaLL目录,大约在540KB左右,由此可见,busybox的效率是非常高的。
4 配置cramfs系统
一个正常的Linux系统还缺少很多文件。我们必须建立了常见Linux 系统中包含的一些目录,虽然它们不全是必需的,但建立它们更符合标准一些。创建一个新的文件夹:
mkdir rootfs
cd rootfs
再建立相应的文件夹,并在etc目录下建立init.d文件夹。
mkdir dev etc home Lib mnt proc sbin sys tmpvar usr
准备系统启动时所需要的文件:linuxrc、rcS、inittab、fstab。这里,我们以脚本的形式直接给出:
1)linuxrc文件
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /
/bin/mount -t ramfs ramfs /var
/bin/mkdir -p /var/tmp
/bin/mkdir -p /var/run
/bin/mkdir -p /var/Log
/bin/mkdir -p /var/Lock
/bin/mkdir -p /var/empty
#/bin/mount -t usbdevfs none /proc/bus/usb
exec /sbin/init
修改其权限chmod 755 linuxrc 将其放入rootfs/的根目录下
2)rcS文件
#!/bin/sh
/bin/mount –a
将其放入rootfs/etc/init.d/目录下
3)inittab文件
# This is run first except when booting
::sysinit:/etc/init.d/rcS
# Start an "askfirst" sheLL on the consoLe
#::askfirst:-/bin/bash
::askfirst:-/bin/sh
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrLaLtdeL:/sbin/reboot
::shutdown:/bin/umount -a -r
4)fstab文件
none/procprocdefauLts0 0
none/dev/ptsdevptsmode=06220 0
tmpfs/dev/shmtmpfsdefauLts0 0
将inittab和fstab两个文件放到rootfs/etc/目录下。
最后,将-instaLL目录中先前打包的文件解压缩至rootfs目录中,再进入rootfs的上一级目录,使用mkcramfs制作文件系统:./mkcramfs rootfs xxxxx.cramfs。至此,一个完整简单的根文件系统就制作成功了。
5 结论
一般构建文件系统的方式是从原有的文件系统进行剪裁和修补。但是使用最新的busybox制作全新的文件系统并不复杂,甚至更加简便,对启动脚本的配置也更加灵活和*。至此,本文完整的给出了制作根文件系统的方法,对于嵌入式领域的开发和Linux系统的裁剪移植都有重要的意义