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


安装好 LILO 之后,我们可以立即重新启动,测试一下 。首先在 BIOS 里面,设置成从 IDE1 开始启动,如果我们看到 LILO 的提示符,按回车后还能看到 Kernel 输出的消息,这就算是 LILO 的安装成功了 。记得这个操作的方法,以后每次我们更新 Flash 盘上的 Kernel Image,都记得要更新 LILO 。也就是说,要重新运行一遍 lilo 命令 。
编译内核
试验成功 LILO 的安装以后,我们开始考虑编译一个新的内核 。当然,要编译新的内核,我们首先要进入我们的工作系统 。这里有两个办法进入工作系统,一是在 BIOS 里面设置从 IDE2 启动,当然,这就要求当初安装工作系统的时候,要把 LILO 安装在 /dev/hdb 上;另一个办法是还是从 IDE1 启动,不改变 BIOS 的设置,但是在看到 LILO 的提示符的时候,要键入 linux root=/dev/hdb1,最前面的 linux 是在 lilo.conf 里面定义的一个 entry,我们只采用这个 entry 所指定的 Kernel Image,但是用 /dev/hdb1 作为 root 文件系统 。两个办法可能有的时候一个比另一个好,更方便一些 。这就要看具体的情况了 。不过,它们的设置并不是互相冲突的 。
在编译内核的时候,由于我们的内核是只有一台机器使用的,所以我们应该对它的情况了如指掌;另外一方面,为了减低不必要的复杂性,我们决定不用 kernel module 的支持,而把所有需要的东西直接编译到内核的里面 。这样编译出来的内核,在一台普通的 586 主板上,把所有必要的功能都加进去,一般也不到 800K 字节 。所以,这个办法是可行的 。而且减低了 init scripts 的复杂程度 。从运行方面来考虑,由于需要的 kernel 代码反正是要装载到内存中的,所以并不会引起内存的浪费 。
在我们的目标平台上,我们希望使用 USB 存储设备 。还有一点要注意的,就是对 Frame buffer 的支持 。这主要是为了支持 XFree86 。一般说来,如果我们的显卡是 XFree86 直接支持的,那当然最好,也就不需要 frame buffer 的内核支持 。但是如果 XFree86 不支持我们的显卡,我们可以考虑用 VESA 模式 。但是 XFree86 的 VESA 卡支持运行起来不太漂亮,还有安全方面的问题,有时在启动和退出 X Window 的时候会出现花屏 。所以我们可以采用 kernel 的 vesa 模式的 frame buffer,然后用 xfree86 的 linux frame buffer 的驱动程序 。这样一般就看不到花屏的现象了,而且安全方面也没有任何问题 。
devfs 也是我们感兴趣的话题 。如果 kernel 不使用 devfs,那么系统上的 root 文件系统就要有 /dev 目录下面的所有内容 。这些内容可以用 /dev/MAKEDEV 脚本来建立,也可以用 mknod 手工一个一个来建 。这个方法有其自身的好处 。但是它的缺点是麻烦,而且和 kernel 的状态又并不一致 。相反的,如果使用了 devfs,我们就再也不用担心 /dev 目录下面的任何事情了 。/dev 目录下面的项目会有 kernel 的代码自己负责 。实际使用起来的效果,对内存的消耗并不明显 。所以我们选择 devfs 。
busybox
【自己动手做一个迷你型Linux操作系统】有了 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 的体积就可以进一步缩小了 。

推荐阅读