策略与建议 我计划将这台便携式电脑用于写作以及远程访问我的功能更强大的桌面开发系统。因此,我需要系统具有网络支持、shell、象 vi 这样的文本编辑器、用于文档版本控制的 CVS 以及用于安全远程访问的 SSH。在资源方面,我有 12 MB 内存和 540 MB 硬盘可以使用。
因为进入了我还未完全研究过的领域,所以我选择了有许多小里程碑的途径。我在本文中采用了这种方法。经常出现的里程碑帮助我确定是否在解决问题方面有所进展;经常出现的里程碑在某一步骤不象所宣称的那样有效工作时,可以帮助您调试过程。我在本文中有好几处鼓励您,即使在系统还未完成时,也不妨试用一下您的系统。这些测试可以帮助您判断到那一点为止的工作是否正确。
我的第一点建议是不要考虑使用任何已建立的 Linux 分发版。我最初也希望通过安装现有的 Linux 分发版来避免从头开始工作。但很快发现它们都需要比可用资源更多的资源。即使 Slackware(长久以来一直以支持低内存系统著称)也至少需要 12 MB 内存才能安装分发版,即使在那样的情况下也工作得非常勉强。
在着手构建系统之前您可能需要考虑的一个可能性是从现有的“单磁盘” Linux 分发版 — 如 tomsrtbt(单磁盘应急软盘分发版)、Trinux(单磁盘 Linux 安全性工具箱)甚至 Tin Foil Hat Linux(被设计用于加密、签名和擦除文件的安全 Linux 分发版)— 开始,然后对其进行扩展。
在正式开始构建自己的系统以前,我研究了几个这样的迷你分发版本并从中学到了很多。尽管我研究的分发版中没有一个是专门面向资源有限的硬件(比如我的便携式电脑)的,但它们的确都有一个共同目标 — 将尽可能多的功能塞进尽可能小的空间。尽管它们为实现这一目标所做的许多权衡对我来说是不可接受的,但我注意到了 uClibc 和 BusyBox,最终我使用了这两者。
uClibc
每个 Linux 系统都需要一个 C 库。C 库提供了常用的文件操作(打开、读和写)、内存管理操作(malloc 和 free)和许多其它使一个 Linux 系统名副其实的函数。大多数 Linux 系统使用 Glibc。Glibc 是成熟的、经过良好测试的,并且正在积极的开发中。遗憾的是,它使用的内存数量相对也较多,对于我的机器来说是不可接受的。
我并不建议使用 Glibc,而建议使用 uClibc,这是一个现代的、稳定的、具有高度兼容性的 Glibc 替代品。uClibc 是针对嵌入式系统开发的,所以它力图成为完整但轻量级的 C 库。速度与大小之间的权衡最后由大小决定。尽管如此,在绝大多数情况下,针对 uClibc 编译的应用程序和工具与针对 glibc 编译的没有分别。uClibc 网站(请参阅参考资料)列出了超过一百个已知或已得到报告使用 uClibc 的应用程序。该列表包括象 Gzip 和 Lilo 这样的标准实用程序,以及象 Lame(MP3 编码器)和 Freeswan(VPN 实现)这样不太常用的实用程序。因为我通过运行在系统上的工具和应用程序的成熟度来衡量一个系统的有效性,所以对我来说,我选择的 C 库能支持我需要的工具是很重要的。
Dietlibc 是另一个可替代 Glibc 的 C 库。我的研究表明:尽管 Dietlibc 需要的内存比 uClibc 更少,但它是通过牺牲与 Glibc 的兼容性实现这一点的。最后,我选择使用 uClibc,因为它看起来能支持更多我需要使用的应用程序。
BusyBox
Linux 系统用户需要一个由数量丰富的命令行工具集组成的工作环境。因为逐一构建所有必需的工具似乎是一个很耗时间的任务,所以我再次借用嵌入式系统的经验,选择了 BusyBox,这是一个“样样皆通”的应用程序,它在一个二进制文件中提供了您希望在 Linux 系统中看到的大多数工具的实现。
通过使用 BusyBox,我保留了宝贵的资源并节省了大量的时间投入。我找不到象它这样的其它工具集。
组成部分及准备工作 要继续下去,您需要有权使用一个现有 Linux 系统 — 最好该系统运行所用的微处理器与您目标系统的是同一系列。一台运行 Linux 的老式便携式电脑是用于编写和编辑的极佳环境,但在编译软件包时它是无法与现代硬件竞争的。我们将使用现有的 Linux 系统来构建内核及支持软件,并创建引导目标系统进入 Linux 所必需的磁盘。将 Linux 安装在目标系统上之后,在把完成的产品转移到目标系统之前,我们将继续使用现有的系统来构建应用程序。我把现有的 Linux 系统称为“构建系统”,把另外那个 Linux 系统称为“目标系统”。
首先下载以下软件包(请参阅参考资料以获得链接):
linux-2.4.19.tar.gz(内核)
uClibc-0.9.15.tar.gz(C 库)
busybox-0.60.4.tar.gz(有用的命令行工具)
util-linux-2.11u.tar.gz(fdisk 可执行文件)
e2fsprogs-1.27.tar.gz(用于文件系统的创建)
lilo-22.3.2.tar.gz(引导装入程序,boot loader)
为了用 uClibc 构建和链接 BusyBox,您需要在目标系统的 /usr 目录中安装 uClibc 开发环境,因此您需要对该目录的写访问权。
该过程的一部分包含构建一个简单的根文件系统。我通过提供合适的根文件系统框架简化了这一步骤,同时提供的还有必需的配置文件和设备文件。您可以从参考资料下载该文件框架 skeleton.tar.gz。
您需要阅读并理解必要的文档,其中包括 README 和 INSTALL 文档。由于有太多的选项和特殊情况,所以无法在本文中介绍所有的排列组合。在以下几节中,我介绍了我推荐的配置。
让我们来构建内核。
构建 Linux 内核
构建一个有效的 Linux 内核而不更改缺省配置是可能的。但几个经过慎重考虑的更改将产生更适合我们需要的系统。特别地,我始终记得网络连接的需求。下表列出了我更改的选项,并就您可能希望对系统作的更改提出了建议。
内核配置 注:便携式电脑联网可能需要 PCMCIA 支持。较旧的便携式电脑不能支持较新的 Cardbus(32 位)卡,但那通常不成问题,因为仍有许多 16 位网卡有售。如果您计划通过电缆连接到网络,则需要在“PCMCIA network device support”下选择合适的驱动程序,这没有包括在上表中。我使用无线连接。许多 16 位 PCMCIA 卡使用 Hermes 芯片组。您可能需要稍稍更改配置以符合您的 PCMCIA 控制器芯片组和 PCMCIA 卡。
应配置内核以专门支持您的 CPU。如果您在新机器上为较旧的机器构建内核,那么需要选择适当的处理器,如 Intel 386 或 486。为了节省空间,您可能要禁用您认为不需要的一切选项,特别是 SCSI 支持。
以下是构建内核的步骤:
make xconfig
make dep
make bzImage
make modules
稍后我将描述如何安装内核。
构建 uClibc
构建 uClibc 比构建内核更有挑战性。uClibc 软件包构建两个相关组件。第一个组件是支持您目标系统的实用程序和应用程序的运行时库。第二个组件是一个开发环境。uClibc 开发环境使构建使用 uClibc 的实用程序和应用程序变得简单,甚至在本身不使用 uClibc 的系统上也是如此。uClibc 创建并安装用于 gcc 及相关工具的封装器。一旦安装了 uClibc 开发环境,您就可以针对 uClibc 而不是 glibc 来编译并链接大多数应用程序。
uClibc 配置 上表中的这三个选项使构建和安装象 SSH 和 NFS 这样的软件(如果您以后选择这么做的话)成为可能。您还需要指定 Linux 内核源文件的位置。
下面的步骤概述了如何构建 uClibc 软件包。采用这些步骤的前提是您已将压缩文档解压缩到名为 uClibc-0.9.15 的目录中:
cd uClibc-0.9.15
ln -s ./extra/Configs/Config.i386 ./Config
编辑 Config 文件。启用上表中指定的选项。
make
上面的指示信息假定您正为 Intel 微处理器构建 uClibc。如果您为别的微处理器构建 uClibc,则可在上面的步骤 2 中创建指向适当 Config 文件的链接。
make 命令构建软件包。为了用 uClibc 编译和链接其它实用程序和应用程序,您需要安装开发环境。make install 命令安装开发环境。
一旦安装了开发环境,您就可以通过更改 PATH 环境变量,使用 uClibc 开发工具来替代标准的基于 Glibc 的开发工具,如下所示:
export PATH=
/usr/bin:$PATH
一旦更改了 PATH 环境变量,您就会发现大多数开发命令(gcc、ld 和 ldd 等)如今指向 uClibc 封装器。但是命令仍应照常工作。在构建下面的任何软件之前正确设置 PATH 环境变量是非常重要的。
在我的 Redhat 7.3 系统上不能原封不动地构建 uClibc 的最新版本(版本 0.9.15)。用于定位 gcc 头的技术在发行版本 0.9.12 时有了变化。如果在您的系统上不能构建 uClibc,可以应用本文参考资料一节中提供的 uclibc 补丁程序。它将以前的技术移植到 uClibc 的最新发行版。
稍后我将描述如何在引导盘和根文件系统盘上安装运行时环境。
构建 BusyBox
如果有一个任务比其它任务更能简化从头构建 Linux 系统的过程的话,那就是构建和安装 BusyBox 软件包。BusyBox 是一个可执行文件,它提供许多其它常用命令行工具的功能,所有这些功能都合为一体。BusyBox 的文档声称构建一个有效系统所需要的全部就是 BusyBox 和“/dev、/etc 以及内核”— 而且他们没有开玩笑。
下表描述了您应对 Config.h 文件做的更改。