基于busybox的根文件系统制作作者:李飞,武金虎,石颖博来源:《电脑知识与技术》2010年第17期摘要:Busybox是构建嵌入式Linux文件系统的必备软件,它是所有文件和设备节点的起始点,是决定系统能否正常启动的关键。
通过busybox-1.1.3为例,进行配置、编译、安装等过程,从而形成简单的根文件系统映像文件,为以后嵌入式Linux系统的移植打下了良好的开端。
关键词:Busybox;嵌入式Linux;Linux操作系统;根文件系统;cramfs 文件系统中国分类号:TP316.81文献标识码:A文章编号:1009-3044(2010)17-4655-02Making Root File System Based on BusyboxLI Fei, WU Jin-hu, SHI Ying-bo(College of Computer Science and Information, Guizhou University, Guiyang 550025, China)Abstract: Busybox is an essentiaL software to buiLd an embedded Linux fiLe system. It is the starting node point of aLL the fiLes and devices and the key whether the system can have a normaL start. Taking busybox-1.1.3 for exampLe, making a simpLe root image system fiLe by configuration compiLation and instaLLation Lays a good foundation for migration of the embedded Linux system.Key words: busybox; embedded linux; Linux OS; root file system; cramfs file system1 根文件系统结构根文件系统是所有文件和设备节点的起始点,包括系统所必须的各种工具软件、库文件、脚本、配置文件等一系列的文件。
一个基本的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为例,完成的源代码可从下载,压缩包大小为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,这里可以对编译、安装以及调试等模式进行配置。
然后选择BuiLd Options,对交叉编译器以及编译方式进行配置。
其中的第一项是BuiLd Busybox as a static binary(no shared Libs),如果选择上,则busybox将以静态形式进行编译,否则将以动态方式编译。
此外,还需要对交叉编译环境进行配置,选择其中的Cross CompiLer Perfix,输入交叉编译器的前缀,我们的嵌入式平台上使用的是arm-linux-的交叉编译工具,如图2。
接下来,配置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 rootfscd rootfs再建立相应的文件夹,并在etc目录下建立init.d文件夹。
mkdir dev etc home Lib mnt proc sbin sys tmpvar usr准备系统启动时所需要的文件:linuxrc、rcS、inittab、fstab。
这里,我们以脚本的形式直接给出:1)linuxrc文件#!/bin/shecho "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/usbexec /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 -r4)fstab文件none/procprocdefauLts0 0none/dev/ptsdevptsmode=06220 0tmpfs/dev/shmtmpfsdefauLts0 0将inittab和fstab两个文件放到rootfs/etc/目录下。
最后,将-instaLL目录中先前打包的文件解压缩至rootfs目录中,再进入rootfs的上一级目录,使用mkcramfs制作文件系统:./mkcramfs rootfs xxxxx.cramfs。
至此,一个完整简单的根文件系统就制作成功了。
5 结论一般构建文件系统的方式是从原有的文件系统进行剪裁和修补。
但是使用最新的busybox 制作全新的文件系统并不复杂,甚至更加简便,对启动脚本的配置也更加灵活和自由。
至此,本文完整的给出了制作根文件系统的方法,对于嵌入式领域的开发和Linux系统的裁剪移植都有重要的意义。
参考文献:[1] 孙天泽,袁文菊.嵌入式设计及Linux驱动开发指南——基于ARM9处理器[M].2版.北京:电子工业出版社,2007:154-170.[2] 陈铁军.嵌入式Linux2.6在s3c2410上的移植技术探析[J].微计算机信息,2007(11).[3] 毛德操,胡希明.Linux内核源代码情景分析[M].杭州:浙江大学出版社,2001:78-153.[4] DANLETL P B,MARCO C.深入理解Linux内核[M].陈莉君,冯锐,牛欣源,译.北京:中国电力出版社,2001:207-346.[5] 嵌入式系统接口设计与Linux驱动程序开发[M].北京:北京航空航天大学出版社,2006:213-304.[6] 熊伟,董金明.嵌入式Linux中根文件系统的实现[J].电子测量技术,2007.[7] 郑桦.嵌入式Linux文件系统的设计与实现[D].武汉理工大学,2004:66-87.。