如何自己动手做一个迷你型Linux操作系统( 二 )


busybox 有了 LILO 和 kernel image 之后,接下来,我们要安排 root 文件系统 。由于 flash 盘的空间只有 16M 字节,可以说,这是对我们最大的挑战 。这里首先要向大家介绍小型嵌入式 Linux 系统安排 root 文件系统时的一个常用的利器:BusyBox 。Busybox 是 Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首先开发,使用在 Debian 的安装程序中 。后来又有许多 Debian developers 贡献力量,这其中尤推 busybox 目前的维护者 Erik Andersen,他患有癌症,可是却是一名优秀的自由软件开发者 。Busybox 编译出一个单个的独立执行程序,就叫做 busybox 。但是它可以根据配置,执行 ash shell 的功能,以及几十个各种小应用程序的功能 。这其中包括有一个迷你的 vi 编辑器,系统不可或缺的 /sbin/init 程序,以及其他诸如 sed, ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat ... 等等这些都是一个正常的系统上必不可少的,但是如果我们把这些程序的原件拿过来的话,它们的体积加在一起,让人吃不消 。可是 busybox 有全部的这么多功能,大小也不过 100K 左右 。而且,用户还可以根据自己的需要,决定到底要在 busybox 中编译进哪几个应用程序的功能 。这样的话,busybox 的体积就可以进一步缩小了 。使用 busybox 也很简单 。只要建一个符号链接,比方 ln -s /bin/busybox /bin/ls,那么,执行 /bin/ls 的时候,busybox 就会执行 ls 的功能,也会按照 ls 的方式处理命令行参数 。又比如 ln -s /bin/busybox /sbin/init,这样我们就有了系统运行不可或缺的 /sbin/init 程序了 。当然,这里的前提是,你在 busybox 中编译进去了这两个程序的功能 。这里面要提出注意的一点是,busybox 的 init 程序所认识的 /etc/inittab 的格式非常简单,而且和常规的 inittab 文件的格式不一样 。所以读者朋友们在为这个 busybox 的 init 写 inittab 的时候,要注意一下不同的语法 。至于细节,就不在我们这里多说了,请大家参考 Busybox 的用户手册 。
从启动到进入 shell busybox 安装好以后,我们就可以考虑重新启动,一直到进入 shell 提示符了 。这之前,我们要准备一下 /etc 目录下的几个重要的文件,而且要把 busybox 用到的 library 也拷贝过来 。用 ldd 命令,后面跟要分析的二进制程序的路径名,就可以知道一个二进制程序,或者是一个 library 文件之间的互相依赖关系,比如 busybox 就依赖于 libc.so 和 ld-linux.so,我们有了这些知识,就可把动手把所有需要的 library 拷贝到 flash 盘上 。由于我们的 flash 盘说大不大,说小倒也不小,有 16M 字节之多 。我们直接就用 Glibc 的文件也没有太多问题 。如果读者朋友们有特殊的需要,觉得 Glibc 太庞大了的话,可以考虑用 uClibc,这是一个非常小巧的 libc 库,功能当然没有 Glibc 全,但是足够一个嵌入式系统使用了 。本文就不再介绍 uClibc 了 。库程序拷贝过来以后,我们就可以考虑系统启动的步骤了 。启动的时候,先是 lilo,接下来就是 kernel,kernel 初始化之后,就调用 /sbin/init,然后由 init 解释 /etc/inittab 运行各种各样的东西 。inittab 会指导 init 去调用一个最重要的系统初始化程序 /etc/init.d/rcS,我们将要在 rcS 中完成各个文件系统的 mount,此外,还有在 rcS 中调用 dhcp 程序,把网络架起来 。rcS 执行完了以后,init 就会在一个 console 上,按照 inittab 的指示开一个 shell,或者是开 gettylogin,这样用户就会看到提示输入用户名的提示符 。我们这里为了简单起见,先直接进入 shell,然后等到调试成功以后,再改成直接进入 X Window 。关于 inittab 的语法,我们上面已经提到过了,希望读者朋友们去查权威的 busybox 的用户手册 。这里,我们先要讲一下文件系统的构成情况 。

推荐阅读