DIY一个实用的miniLAPP服务器(x86版)(1)


先决条件

本文的读者应当至少手动安装过一次 LFS ,如果你没有做过 LFS ,这篇文章很可能不适合你,请先按照《Linux彻底定制指南》做一遍 LFS 。另外,如果你对编译优化也很感兴趣,那么《GCC编译优化指南》也很值得一读。

目标

youbest兄的大作《5M大小的Apache服务器》和其续篇《600K的Apache服务器》将LFS的精神发挥到了极致,令人叹为观止!然而许多实用主义者(包括我在内)也只能叹为观止而已,因为这样的服务器由于过分追求小巧而变得不太实用,基本上不能在实践中用于生产目的。

鉴于上述原因,本文打算制作一个既实用又小巧的 Linux + Apache + PHP + PostgreSQL + OpenSSH + Iptables 服务器,并且实用优先于小巧。尽管实用优先于小巧,但是与基于普通发行版搭建的LAPP服务器相比仍然相当Mini(本文制作出来的最终系统核心部分大约15MB[其中体积较大的文件有:bzImage约1MB、postgres约3.5MB、libphp5.so约4.6MB、libc.so约1.3MB、libcrypto.so约1.1MB],总体积大约150MB),因此我把它称为”miniLAPP”服务器。当然,除了小巧,灵活和高效也重要,这在本文中主要体现在:㈠对软件包进行最大限度的自定义配置,㈡在保证稳定的前提下进行编译优化。

为了避免纠缠于各种复杂的硬件环境(它不是重点所在),本文将在 VMware Workstation 5.5.5 上建立一个虚拟机。具体如下:Intel 440BX 主板,athlon-xp处理器(如果你的CPU与我不同,那么只要将本文中所有的”athlon-xp”都替换成你的CPU型号即可,具体可以参考Gentoo Safe Cflags),512M内存(最低384MB),100M网卡(PCnet32),4G硬盘(BusLogic SCSI 0:0),CDROM(IDE 1:0 lfslivecd-x86-6.3-r2160-min.iso 仅供安装)。

网络环境:ip:192.168.10.33/24 ,broadcast:192.168.10.255 ,gateway:192.168.10.250 ,没有DNS 。如果你的环境与此不同,请自行调整相应的ip命令。

思路

基本上,小巧和实用是有冲突的,因为越要求实用就越需要各种功能,也就越无法保证小巧。为了解决这个问题,本文采用了”核心+扩展”的思路。所谓”核心”是指保证服务器正常运行必须使用的资源,比如:libc, init, httpd, postgres, libphp, sshd … 以及各种设备文件、配置文件等等。所谓”扩展”是指非运行时必须的资源,比如:top, cat, gcc … 等等,主要用于服务器维护。

解决方案是将”核心”部分安装在”/”目录下,使其在服务器一起动的时候就能够使用,而将”扩展”部分安装在”/usr”目录下,并且”/usr”位于独立的分区上,仅在需要使用的时候才手动挂载,使用完毕以后再手动卸载。

事实上,对于绝大多数软件包而言,所需要的只是其中的一小部分而已,因此,绝大部分软件包的主体都位于”/usr”目录下,仅将必须的某些部分安装到”/”下。

另一个问题是使用静态连接还是使用动态共享库?从小巧的目标来看,似乎应当使用静态连接,但是考虑到:

追求小巧并非第一重要,此处”Mini”的含义并非偏重于磁盘空间,而是尽可能减少不必要的程序和组件。

动态连接的程序可以在内存中共享库文件,而静态连接的程序则无法实现。考虑到此服务器可能扩展为提供 DNS, FTP, Mail, Proxy 等其它服务,静态连接将导致运行时占用更多的内存。

因此本文决定采用常规的动态连接。更多关于静态连接的害处,可以参考”Static Linking Considered Harmful“一文。


相关内容

    暂无相关文章