6.1. 概述

在本章中,我们将进入构建环境,并真正开始构建 LFS 系统。 换句话说,我们 chroot 到前一章构建的临时迷你 Linux 系统中, 进行一些最后的准备,然后开始安装各软件包。

软件的安装过程是简单直接的。 尽管很多时候可以把安装说明写得更短、更通用, 我们还是选择为每个包提供完整的安装流程,以尽量减小出错的可能。 学习 Linux 系统工作原理的关键就是要知道每个包的作用, 以及您(或者系统)为什么需要它。

我们不推荐在编译中使用优化, 编译优化可以使程序跑得稍微快一点, 但也可能在编译或运行的过程中带来问题。 如果一个软件包在打开优化时无法编译,试着关闭优化再编译它。 即使一个软件包在打开优化时可以编译, 由于源代码和编译工具的复杂相互作用,仍然存在编译不正确的风险。 另外请注意,除本书明确说明外, 设定 -march-mtune 是未经验证的, 它们可能在工具链软件包(Binutils、GCC 和 Glibc)中引发问题。 使用编译优化带来的微小性能增益往往不值得冒编译错误的风险, 因此我们建议第一次构建 LFS 的读者不要使用自定义的优化选项。 即使不用优化,得到的系统仍然会运行得很快,而且会很稳定。

[注意]

译注

软件包的配置系统会使用 -O2-O3 等作为默认的基本优化参数, 它们是经软件包作者检验可用的。 因此,不使用自定义优化参数也不会编译出非常慢的系统。

必须严格按照本章给出的顺序安装软件包, 才能保证没有程序意外地获得指向 /tools 的路径, 甚至将这样的路径硬编码到程序中。因此, 不要同时构建多个软件包,这可能节约时间(特别是在双 CPU 机器上), 但往往会导致某个程序包含一个硬编码的,指向 /tools 的路径, 结果删除该目录后程序不能工作。

在安装指令之前,每个页面都提供了软件包的基本信息, 包括其内容的简要描述,以及构建过程大概需要的时间和磁盘空间。 在安装指令之后,有一个包含该软件包提供的所有程序和库的清单 (以及对它们的简要描述)。

[注意]

注意

对于拥有可用的测试套件的软件包,第 6 章中给出的 SBU 值和需要的磁盘空间包含了运行测试套件需要的时间和磁盘空间。

6.1.1. 关于库

一般来说,LFS 作者不推荐构建和安装静态库,它们是为了某些在现代 Linux 系统中早已过时的原因而存在的。 另外,将静态库链接到程序中是有害的, 如果需要更新这个库以解决安全问题, 所有使用该静态库的程序都要重新链接。程序对静态库的使用并不是显然的, 甚至可能搞不清有哪些相关程序需要链接(或不知道如何重新链接)。

在第 6 章的安装过程中,我们删除或者禁止安装多数静态库。 一般来说,向 configure 传递 --disable-static 就可以禁用静态库, 但某些情况下需要其他手段。在极个别情况下, 特别是对于 Glibc 和 GCC, 静态库对于一般的软件包构建过程仍然很关键,就不能禁用静态库。

关于库的更详细讨论,可以参阅 BLFS 手册中的 Libraries: Static or shared? 一节。