动手做一个迷你型Linux操作系统

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

本文要构建的这个迷你型的Linux 系统只能在一台特定的单机上运行,如果读者朋友们有兴趣的话,在这个系统的基础上加以改进,是可以构建出通用的、可以在大多数常规PC 机上即插即用的系统来的。但是这已经不在本文的话题之内了,读者朋友们如果有兴趣,可以通过我的电子邮件和我讨论其中的细节问题。

我们的目标Linux 系统运行在一台普通的Intel 386 PC 机上,可以有硬盘,也可以不要硬盘,而用Flash Disk 来代替。如果是用Flash 盘的话,需要能够支持从Flash 盘启动,而且Flash 盘的大小要在16M 字节或者以上。我们希望用户一开机启动,就直接进入X Window 图形界面,运行事先指定好的程序。不需要用户输入用户名和密码进行登录。

我们设定的这个目标有点像一个X Terminal 终端工作站。稍加改进,还可以做成干脆无盘的形式,也就是说,连16M 的Flash 盘也不要了。不过,这也超出了本文的话题了。读者朋友们如果有兴趣,可以来信和我进行讨论。

系统启动

因为我们要考虑从Flash 盘进行启动,所以我们选择用LILO 作为我们的Boot Loader,而不选用GRUB。这是考虑到GRUB 有较强的对硬盘和文件系统的识别能力,而Flash 盘到底不是标准的硬盘,并且我们选用的文件系统GRUB 又不一定认识,搞不好的话GRUB 反会弄巧成拙。而LILO 就简单的多了,它在硬盘开始的MBR 写入一个小程序,这个小程序不经过文件系统,直接从硬盘扇区号,读出Kernel Image 装入内存。这样,保险系数就大大增加。并且也给了我们自由选用文件系统的余地。那么,我们要如何安装LILO 呢?

首先,我们要找一块普通的800M 左右的IDE 硬盘,连在目标机器的IDE 线上。这样在我们的目标机器上,IDE1 上挂的是Flash 盘,IDE2 上挂的是一块工作硬盘。我们用标准的步骤在IDE2 的标准硬盘上装上一个Debian

GNU/Linux 系统。当然,如果读者朋友们手头没有Debian,也可以装Red Hat 系统。装好工作系统之后,要首先做一些裁减工作,把不必要的Service 和X Window 等等东西都删掉。这样做的目的是增进系统启动速度,因为我们在后面的工作中,肯定要不停的重新启动机器,所以启动速度对我们的工作效率是很关键的。

装好工作系统之后,在Falsh 盘上做一个Ext2 文件系统,这个用mke2fs 这个命令就可以完成。由于Flash 盘是接在IDE1 上的,所以在Linux 里面,它的身份是/dev/hda。本文作者在操作的时候,把整个Flash 盘划分了一个整个的分区,所以,调用mke2fs 的时候,处理的是/dev/hda1。读者朋友们应该可以直接在/dev/hda 上做一个Ext2 文件系统,而不用事先分区。

在Flash 盘上做好了文件系统之后,就可以把一个编译好的内核映像文件vmlinuz 拷贝到Flash 盘上了。注意,必须要先把这个vmlinuz 映像文件拷贝到Flash 盘上,然后才能在Flash 盘上安装LILO。不然的话,LILO 到时候可是会LILILILI 打结巴的,因为它会找不到Kernel Image 在Flash 盘上的位置的,那样的话Flash 盘也就启动不起来了。还有,如果读者朋友们在Flash 盘上用的是一个压缩的文件系统的话,到时候LILO 也会出问题,它虽然能正确的找到Kernel Image 在硬盘上的起始位置,但是它却没有办法处理被文件系统重新压缩过的这个Kernel Image,不知道该如何把它展开到内存中去。

把Kernel Image 拷贝过去以后,我们就可以动手编辑一份lilo.conf 文件,这份文件可以就放在工作系统上就行了。但是注意在lilo.conf 中索引的文件名的路径可要写对。这些路径名都是在工作系统上看上去的路径名。比如,如果Flash 盘Mount 在/mnt 目录下面,那么,在lilo.conf 中,vmlinuz 的路径名就是/mnt/vmlinuz。注意这一点千万不要搞错。不然的话,如果一不小心把工作系统的LILO 给破坏掉了,那就麻烦了。编辑好了lilo.conf,然后再运行lilo 命令,注意,要告诉它用这个新的lilo.conf 文件,而不要用/etc/lilo.conf。

安装好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

有了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 的体积就可以进一步缩小了。

相关文档
最新文档