用busybox作简单的文件系统(一)

来源:互联网 发布:构件柱模板的算法 编辑:程序博客网 时间:2024/06/05 14:26

转载文章做个记号,谢谢分享~~~~~~~~~~~~~~~~~~~~~~~~

http://blog.sina.com.cn/s/blog_6de4c6c30100tixd.html

我的文件系统就是参照这个制作的,虽然有些内容不全,但是起码能转起来了。用NFS测试过

利用BusyBox做一个简单的根文件系统
1、下载BusyBox源代码包 http://busybox.net/
2、找个地方解压缩包,例如tar -xjvf busybox-1.00.tar.bz2
3、进入busybox的文件夹,使用make menuconfig进入设置
[attach]244[/attach]
4、在build options中有一些选项要注意
Build BusyBox as a static binary (no sharedlibs):如果选择了这个选项,那么BusyBox将被静态编译,也就是不需要动态链接库的支持就能运行,但是这样会使编译后文件的体积增大。
Do you want to build BusyBox with a CrossCompiler:如果你的busybox将要运行机器与编译主机的体系结构不同,比如s3c2410是ARM,与我们的X86主机芯片系统结构不一样,那么这个一定要选上,并且在Cross Compiler prefix中写上交叉编译器的名字,比如ARM用arm-linux-
[attach]245[/attach]
5、在Installation Options中 BusyBox installation prefix就是在编译完后运行makeinstall 时,busybox将被安装的地址。
[attach]246[/attach]
6、其它的选项按照默认选项就行,当然自己也可以看看有没有需要,把其它一些命令加入到编译选项中来
7、完成后保存,然后运行make
8、编译没有问题后运行make install这样编译好的busybox就会自动安装到BusyBox installationprefix中,一般是三个文件夹bin sbin usr和一个文件linuxrc。这样busybox的编译就完成了
9、准备一个空文件夹将BusyBox installationprefix中的东西拷过来,另外再建几个linux需要的文件夹
lib
dev
etc
home
proc
root
tmp
var
mnt
10、在etc文件夹下建一个目录init.d,并且在其中建立一个空文件rcS,在rcS中加上以下内容
#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

#
     Trap CTRL-C &c only in this shell so we caninterrupt subprocesses.
#
trap ":" INT QUIT TSTP

/bin/mount -t proc none/proc
11、如果你的busybox是静态编译的,那么一个简单的能使用的根文件系统就这样完成了,但是这个文件系统中没有glibc的动态链接库,除了busybox以外的软件,如果对glibc有依赖,但是又没有静态编译的的话就无法运行。但如果所有的软件都用静态编译的话,那这个文件系统将很大。所以一般推荐软件不要使用静态编译,而使用一个库。
12、如果你不是用静态编译的,那么你需要编译好的glibc的动态链接库。在一般的交叉编译器中都带有已经编译好的库,直接拷过来就行了。一般在交叉编译器的lib或arm-linux/lib中

2编译busybox
 
      2004年10月中旬,busybox的1.00稳定版终于推出了,完整的源代码可以从http://www.busybox.net下载,压缩包大小为1.3MB左右。将源码解压之后,进入到busybox1.00目录中,运行makemenuconfig可以打开它的编译界面。这个界面和Linux内核编译有些接近,如图1所示。
在这个菜单界面中除了可以对最终编译到可执行文件中的命令进行选择外,还有很多其他设置也是非常重要的。下面三个目录是很多人都会感兴趣的:

Build Options--->
Installation Options --->
Login/Password Management Utilities --->

       在Build Options里面有是否使用交叉编译的选项(Do you want to build BusyBox with aCross Compiler)。如果要对其他平台进行编译就要选择它并设置相应的编译程序前缀。
 
      在Installation Options里面可以设置安装的路径,即设置为新文件系统的根目录。当然也可以用缺省的_install目录,安装之后再复制到新文件系统中去。
 
      在设置Login/Password ManagementUtilities的时候,为了免去配置glibc的麻烦,最好设置使用busybox自己的password和shadow文件的功能(Useinternal password and group functions rather than systemfunctions)。
 
      busybox提供的命令无疑比较全面,但它的缺省配置还不能构成一个功能比较完备的文件系统。必须要添加的命令有Login/PasswordManagementUtilities里面的getty、login和passwd,这些命令从前是由另外一个软件包tinylogin所提供的。当然,如果不需要一个交互的登录界面,这些命令也可以去掉。通过设定内核参数init=/bin/sh可以在系统启图1busybox的编译配置界面动后直接得到一个shell。
 
       tlenetd命令是一个远程登录服务程序,把它编译进busybox中会为将来的调试提供很多的方便。当然也可以通过串口终端的方式管理嵌入式设备,但网络登录的方式却更为方便。
 
      设置完毕后保存、退出,执行make; makeinstall命令,busybox将在未来的根文件系统中建立/usr、/bin、/sbin等目录。从中可以看到,编译好的busybox可执行文件和其他应用命令的符号链接。典型的busybox文件大小在动态链接的情况下是300KB左右,静态链接为800 KB左右,用它实现的文件系统完全可以控制在1MB以下。但就目前为止,得到的还不是一个完整可用的文件系统,必须要在这个基础上添加一些必要的文件,让它可以工作。


3完善文件系统
3.1需要增加的文件
 
      参考一个正常的Linux系统就会发现,busybox建立的文件系统还缺少很多文件。下面三行命令建立了常见UNIX系统中包含的一些目录,虽然它们不全是必需的,但建立它们更符合标准一些。这些命令都是在新文件系统的根目录中执行的,第三条命令的执行还必须要有root权限。

mkdir mnt root var tmpproc boot etc lib
mkdir /var/{lock,log,mail,run,spool}
chown 0:0R *

如果busybox采用了动态链接的方式编译,还需要把busybox所需要的动态库:libcrypt.so.1、libc.so.6、ldlinux.so.2放到lib目录中。最好按照标准的方式建立相应的文件和链接,可以参考下面的列表:

-rwxrwxrwx192519ld-2.3.2.so
lrwxrwxrwx 111ld-linux.so.2 -> ld-2.3.2.so
-rwxrwxrwx 1 1190032libc-2.3.2.so
lrwxrwxrwx 113libc.so.6 -> libc-2.3.2.so
-rwxr-xr-x 118348libcrypt-2.3.2.so
lrwxrwxrwx 117libcrypt.so.1 ->libcrypt-2.3.2.so

3.2编写 etc文件夹下的文件
 
      etc文件夹是许多系统配置文件保存的地方。这些文件非常重要,如果配置错误,就可能影响系统的启动。busybox源代码example/bootfloopy/etc目录中的文件算是一个简单的例子,可以把其中的文件拷贝过来作为基础。(在example/bootfloopy目录中的一些脚本和文档也很值得阅读)
 
      首先inittab文件是系统启动后所访问的第一个脚本文件,后续启动的文件都由它指定。这个文件的格式和普通微机Linux上的inittab是有区别的,其具体含义可以参考busybox的文档。下面是一个比较简单的例子:

::sysinit:/etc/init.d/rcS
tty0::respawn:/sbin/getty 38400 tty0
tty2::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount ar
::shutdown:/bin/mount / o remount,ro

      其中第一行指定了系统的启动脚本为/etc/init.d/rcS;第二行指定在第一个虚拟终端打开一个登录会话;第三行指定在第三个虚拟终端打开一个无须登录验证的shell;第四行指定了当按下ctrl+alt+del组合键时的执行命令;最后两行指定了关机时执行的操作。
fstab文件定义了文件系统的各个“挂接点”,需要与实际的系统相配合。一个简单的fstab文件如下:proc/procprocdefaults00
/dev/hda1/ext2rw,noauto01
devpts/dev/ptsdevptsdefaults00

其中第三行是为UNIXPTYs准备的,telnetd要用到。
profile文件是终端登录之后首先运行的脚本,这里可以不去管它。我们比较关心的是系统在无人登录的情况下有哪些程序要执行。从inittab文件可以看出系统启动之后要运行/etc/init.d/rcS脚本,需要启动的程序和需要进行的设置都可以写在这里面。一个可能的rcS文件如下:

#! /bin/sh
echo e ''Starting System''
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.0.100
hostname F /etc/hostname
/bin/mount / o remount,rw
/bin/mount /proc
/bin/mount /dev/pts
/usr/sbin/telnetd
dmesg > /var/log/dmesg

为了满足终端登录用户验证的要求,etc目录下还需要有passwd、group和shadow(在编译busybox时如果不选择shadow功能将不需要这个文件)。这些文件至少要包含root用户的定义,如下所示:

passwd:
root:x:0:0:root:/root:/bin/sh
group:
root:x:0:
shadow:
root::12179:0:99999:7:::

其中,如果shadow(对于不支持shadow的系统则是passwd)文件的第一个冒号和第二个冒号之间没有内容,表示这个用户登录不需要密码。如果需要设定密码或者增加新的登录用户,就可以参考开发主机上的相应文件,或者在目标系统启动之后用passwd命令和adduser命令完成。
 
      最后还可以给目标机起一个名字,在/etc目录下建立文件hostname,将起好的名字写到里面。前面介绍的启动脚本rcS,通过hostname命令把文件的内容设置为机器名。


4测试新的文件系统
 
      文件系统的安装随着应用环境的不同差别比较大。在嵌入式环境中,一般只要通过特殊的打包工具将文件系统打包,并烧录到非易失性存储器中就可以了。例如,对于JFFS2类型的文件系统就可以用mkfs.jffs2命令生成文件系统的映像。
 
      文件系统安装之后重新启动目标设备,应该就可以使用新建立的文件系统了。如果系统启动失败,则可以通过内核消息查找错误的原因。如果错误信息提示不能正确挂载文件系统,问题可能出在启动引导装载程序(bootloader)上。文件系统比较容易出问题的是用户的验证和动态链接库的加载。最简单的检测办法是把busybox编译为静态链接并设置内核参数init=/bin/sh来躲开对用户登录的验证。


首先将下载的 busybox-1.1.3-tar.bz2解压到一个目录中,然后在里面运行以下的命令,对源代码进行配置:

[root@redhat9busybox-1.1.3]# make menuconfig

相信有过编译内核经验的人对这个界面应该很熟悉,在这个莱单里可以对 BusyBox的编译方式进行选择,例如是静态编译还是动态编译,是使用 glibc 还是 uClibc 等;也可以选择你所需要的applet。

如果你的操作系统是 Red Hat Linux9.0 那么有两个问题你需要注意一下:

不要选择使用 Support NSASecurity Enhanced Linux;
如果选择了 Linux Ext2 FS Progs 下的任何一个 applet,那么就必须更新你的 make,make-3.81可以是一个选择。

完成配置后,接下来就容易了:

[root@redhat9busybox-1.1.3]# make dep
[root@redhat9 busybox-1.1.3]# make
[root@redhat9 busybox-1.1.3]# make install

正常编译完成后,在当前源代码目录下会生成一个_install 子目录,里面包含编译好的 busybox 和一些指向它的符号连接。

 

3 使用说明
调用 BusyBox 中的 applet 有三种方法(以 ls 命令为例):

给 busybox 带参数 busyboxls
硬连接 ln busybox ls
ls 

符号连接 ln -s busybox ls
ls 

第三种是最常用的方法,因为在 _install目录中就已经做好了全部的符号连接。

有了 busybox及其符号连接之后,还需要做一些附加工作才能将 BusyBox 作为操作系统使用:

原创粉丝点击