6.1. 简介

在本章中,我们会进入构建环境开始认真地构建 LFS 系统了。我们将 chroot 到之前准备好的临时迷你 Linux 系统,做一些最后的准备工作,然后就开始安装软件包。

安装软件很简单。尽管很多时候安装指令能更短而且更具通用性,但我们还是选择为每个软件包都提供完整的指令,以减小引起错误的可能性。了解 Linux 系统如何工作的关键就是知道每个软件包的作用以及为什么你(或系统)需要它。

我们不建议在编译时使用优化。这虽然可以让程序运行得快那么一点点,但是却也有可能增加编译难度,以及在运行时出问题。如果在打开优化后编译失败,请试一下关闭优化编译看看。就算打开优化通过了编译,考虑到源代码和编译工具之间的复杂交互,仍然存在编译不正确的风险。还有需要注意 -march-mtune 选项除了本书指定的值都未经测试。这有可能导致工具链软件包(Binutils、GCC 和 Glibc)发生问题。对比使用编译优化带来的好处与风险,这样做经常是得不偿失。第一次构建 LFS 系统还是推荐不要使用自定义优化。这样构建出来的系统一样会运行得很快,于此同时还很稳定。

本章里安装软件包的顺序需要严格遵守,这是为了保证不会有程序意外地依赖与 /tools 路径的硬链相关的目录。同样的理由,不要同时编译不同的软件包。并行地编译也许能节省一点时间(特别是在双 CPU 电脑上),但是它可能会导致程序里存在包含到 /tools 目录的硬链接,这样的话在这个目录移除后程序就不能正常工作了。

在安装指令之前,每个页面都提供了关于软件包的信息,包括其中所包含内容的精确描述,构建需求的大致时间,以及在过程中需求磁盘空间的大小。在安装指令之后,是一个该软件包即将安装的程序和库(及概要说明)的列表。

[Note]

Note

第六章里软件包的 SBU 数值和所需磁盘空间包含了可能存在的测试套件数据。

6.1.1. 关于库

总的来说,LFS 的编辑们并不推荐构建和安装静态库。许多静态库的初衷已经赶不上现在的 Linux 系统了。而且将静态库链接到程序还有不好之处。假设库更新需要移除一个安全问题,所有使用该静态库的程序都需要重新链接到新的库。由于静态库并不会总那么明显,有哪些相关的程序(以及需要链接的程序)很可能都不知道。

第六章的程序,我们移除或禁止了大部分静态库的安装。通常通过在 configure 命令中使用 --disable-static 项,便可以做到。有些情况下,可能用到其他代替的办法。当然也有少数情况,特别是 glibc 和 gcc 使用的静态库在软件包的构建过程中是必不可少的。

更多关于库的讨论,请参考 BLFS 中 库:静态还是共享? 章节。