思路

优质
小牛编辑
114浏览
2023-12-01

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

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

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

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

  1. 追求小巧并非第一重要,此处"Mini"的含义并非偏重于磁盘空间,而是尽可能减少不必要的程序和组件。
  2. 动态连接的程序可以在内存中共享库文件,而静态连接的程序则无法实现。考虑到此服务器可能扩展为提供 DNS, FTP, Mail, Proxy 等其它服务,静态连接将导致运行时占用更多的内存。

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