前言 来来回回编译LFS不知道多少次了,总觉得都是这个步骤,出来的东西也都差不多,所以就想玩点变化的,这次想做一个功能单一,但体积要非常小巧的LFS出来。
听说过有人把httpd的系统做到只有5M大小,我也想尝试一下,所以这次要做的是一个只有简单的http功能的系统,方法其实并不复杂,制作出来的系统体积虽然不算大,但功能也很有限,只是用来研究用可以,如果用来实际应用还需要增加许多东西。
在下文中并没有给出详细的命令,只是给了一个方法和需要注意的一些地方,这是为了能让读者亲手制作一下,这样才能最大程度的获得知识。
如果你有兴趣可以继续看下去。
原理 其实很简单,就是按照Linux启动的顺序只放需要的东西,其它东西一律不装。
启动过程 介绍Linux启动过程的文章有很多,所以我这里就不多说了,不过这个启动过程也是我们制作系统的过程,按照Grub->Kernel->INIT
制作工具链 制作这个“小”系统当然也需要一个工具链,目的和LFS是一致的,但必须要支持静态编译才行,当然这个工具链可以按照LFS的步骤制作,但还有另一种更快速的方法就是在完成了工具链glibc的编译后就可以开始制作这个小系统了。
建立目录 在完成了工具链的制作后就可以开始建立必要的目录了,这步也可以完全按照LFS中的建立过程建立,也可以用省事的方法,你只需要建立/boot/grub、/etc、/dev、/bin、/sbin/init、/var/log就可以了。
编译GRUB 编译GRUB只需要./configure && make就可以了,不需要make install,因为这个最终的LFS在运行过程中并不需要grub这套工具的支持,我们编译它只是为了能够建立起bootloader而已,所以只需要复制stage1和stage2以及支持启动盘的文件系统的xxfs_stage1_5到/boot/grub中,再使用grub/grub命令来启动grub的环境,这部分可以参考LFS中的grub这部分,最后建立/boot/grub/menu.lst文件就可以了,现在可以删除state1和xxfs_stage1_5了,因为已经不需要了。
编译Kernel 这步十分重要也很关键,编译选择中不要使用模块支持,因为要缩小体积就把需要的选上,并将其编译进内核,这样大概编译完成后的Kernel也就1M多,不过这里要注意的是一定要选上需要使用的文件系统,磁盘的驱动以及使用的网卡驱动(因为需要支持http所以必须要支持网络)。这次我用的kernel是2.6.14.2的版本
UDEV UDEV用来建立/dev下的设备驱动,这里我们可以有两种方式来使用它,一种是在编译完成后直接用udevstart来建立好/dev下面的内容,还有一种方法则是LFS的标准方式,在运行目标系统的时候建立/dev下的内容,这里为了减少系统体积使用了第一种方式,这样就可以在启动时减少一步。
INIT 通常INIT是包含在sysinit这个包中的,但我们这个系统是不需要这么复杂的INIT,因为INIT不一定要是二进制可执行的文件,使用可执行的脚本也是可以的,所以只需要建立一个脚本文件来代替INIT就可以了,在脚本中加入启动网络和http的脚本即可。这里要注意的是init必须具备可执行的属性。
BASH 因为INIT是使用脚本的方式,那么就必须要安装一个支持他的脚本的SHELL,这里我选择了LFS标准的BASH,这里我们用静态编译的方法来编译BASH,然后将编译好的bash复制到目标系统的目录中,然后将sh的连接指向该文件即可
iproute2 一个有http支持的系统没有网络设置是不可能的,这里我使用LFS6以后使用的iproute2,静态编译它之后只需要使用它的ip这个文件即可。在INIT中加入启动网络的命令即可。
Apache 这个当然是用来做http服务的,同样静态编译它,然后只需要复制httpd到/bin目录下即可,不过要建立一个httpd.conf文件,当然你还要根据httpd.conf中的设置在相应的目录下放置网页文件。
在INIT中加入启动httpd的命令这样就完成了这个系统的制作。
启动 现在可以重新启动了,如果你的内核配置得当,启动的速度应该是相当快的。
另外找台机器打开浏览器输入配置给这太机器的地址,看看能不能看到你的页面。
成品下载 采用的是linux-2.6.14.3的内核和Apache-2.0.55实现的系统,通过GCC-4.0.2进行编译,静态库来自Glibc-2.3.6
下载后解压缩后形成一个VMWare5.0支持的完整目录,直接用VMWare5启动即可。
采用DHCP来设置IP地址的,在完成启动后会有地址提示,根据提示的地址进行访问即可。
结束语 我用这个方法制作了一个用Apache来提供httpd的系统,最后不算上文件系统本身占据的空间,这些文件大概就只有5M多一些,其实这个并不是最小的,因为是使用了LFS使用的标准的程序包和一些自己写的脚本,所以体积要稍微大一些,如果使用比如uclibc和busybox这样的包,这个系统还可以做的更小,这篇文章的目的就是为了研究裁减LFS而写的,文中难免有错,如果发现还望谅解,并给予指正,如果能起到抛砖引玉的作用,那就值了。
作者:youbest(冲天飞豹)
2005-11-29