Skip to the content.

Foreword


Audience

从 1998 年起,我踏上了学习和深入理解 Linux 的旅程。当时我刚刚安装了我的第一个 Linux 发行版,并迅速被 Linux 背后的整个设计理念和哲学所折服。

为了完成一项工作,人们总是能提出很多不同的方法。对于 Linux 发行版来说,情况也是这样。多年来诞生了许多发行版,其中一些仍然生存,另外一些已经被其他发行版吸收,还有的已经消亡,成为我们的回忆。这些发行版各有特色,以满足它们的目标人群的需求。因为这些发行版都是已经存在的,能够达成同一目的的手段,我开始意识到并不需要将自己的思维约束在发行版这一种实现方法上。在发现 Linux 之前,我们只能忍受其他操作系统的种种不足,因为我们没有其他选择,操作系统的行为不以我们的意志为转移。然而,自由选择的理念随着 Linux 的诞生而出现。如果你不喜欢某种行为,就可以自由地改变它。这在 Linux 世界中甚至是受到鼓励的。

我曾经尝试了许多发行版,但无法做出最终决定。它们各有特色,都是很不错的系统。这里不存在对与错的问题,而是系统是否符合个人口味的问题。在各种选择中,看上去并没有一种发行版能完美地符合我的要求。因此我开始创造自己的 Linux 系统,以完全符合我的个人品味。

为了构建出真正属于我自己的系统,我决定从源代码编译所有东西,而不使用预先编译的二进制包。这个“完美的” Linux 系统将会兼具不同系统的优点,同时扬弃它们的不足。这个想法初听上去非常可怕。然而,我仍然坚信这个系统可以被构建出来。

在整理并解决了循环依赖和编译错误等问题后,我终于构建出自己定制的 Linux 系统。它完全可以工作,并且像当时的其他 Linux 系统一样完美可用。不同的是,这是我自己的创造,亲手组装出这样的系统是非常有成就感的。唯一能够让我更开心的事情是亲自编写一个软件系统。

当我向其他 Linux 社区成员推广我的目标和经验时,大家似乎对这些想法很有兴趣。显而易见,这些自行定制的 Linux 系统不仅能够满足用户的特殊需求,而且对于程序员和系统管理员来说是提高 Linux 技能的理想学习机会。随着越来越多的人对这一主题的关注,Linux From Scratch 项目诞生了。

这本 Linux From Scratch 手册是这一项目的核心内容,它将提供亲自设计和构建系统所需的背景知识和操作步骤。本书提供了一个构建能够正常工作的系统的样板,您可以自由地调整本书中的命令,来满足您自己的要求,这也是本项目的重要组成部分。您始终掌握自己的系统,我们只是在您起步时提供微小的帮助。

我真诚地祝愿您能够在您自己的 Linux From Scratch 系统上体验快乐,并享受拥有这样一个真正属于自己的系统所带来的各种乐趣。

Gerard Beekmans gerard@linuxfromscratch.org

您可能有许多阅读本书的理由。许多人首先会问: “为什么要不辞辛苦地手工从头构建一个 Linux 系统,而不是直接下载并且安装一个现成的?”

LFS 项目存在的一项重要原因是,它能够帮助您学习 Linux 系统的内部是如何运作的。构建 LFS 系统的过程将展示 Linux 系统的工作原理,以及其各组成部分的协作和依赖关系。最棒的是,有了这些经验,您将能够定制 Linux 系统,使其满足您独一无二的需求。

LFS 的另一个关键优势是,它允许您掌控您的系统,而不用依赖于其他人的 Linux 实现。在使用 LFS 时,您就像坐在驾驶座上一样,亲自掌控系统的各个部分。

LFS 允许您创建非常紧凑的 Linux 系统。在安装其他发行版时,您往往不得不安装一大堆永远不会用到或者意义不明的程序。它们会浪费系统资源。您可能以为,有了现代的大容量硬盘和高速 CPU,就不需要考虑资源浪费的问题。然而,在一些情况下,即使不考虑其他问题,仅仅存储空间的约束就十分紧张。典型的代表有可引导 CD,USB 启动盘,以及嵌入式系统。在这些领域中,LFS 是十分有用的。

自行定制的 Linux 系统在安全方面也具有优势。在从源码编译整个系统的过程中,您有机会审核所有的代码,并安装您需要的安全补丁。您不需要像往常那样等待其他人编译一个修复了安全漏洞的二进制包。另外,除非您亲自检查并应用了补丁,您无法保证新的二进制包在编译过程中没有出问题,并且正确修补了安全漏洞。

Linux From Scratch 的目标是构建一个完整并基本可用的系统。如果您不想从零构建您自己的 Linux 系统,那么您可能不会从本书提供的信息中受益。

此外,构建 LFS 系统还有很多好处,这里就不一一列举了。总而言之,学习仍然是最重要的使用 LFS 的原因。在您编译和使用 LFS 的实践过程中,您将学到很多威力巨大的信息和知识。

LFS Target Architectures

LFS 的主要目标架构是 AMD/Intel 的 x86 (32 位) 和 x86_64 (64 位) CPU。此外,如果对本书中的一些指令作适当的修改,它们也应该适用于 Power PC 和 ARM 架构的 CPU。无论在其中哪种 CPU 上,构建 LFS 都至少需要一个现有的 Linux 系统,例如已经构建好的 LFS 系统,Ubuntu,Rad Hat/Fedora,SuSE,或者其他支持您的硬件架构的发行版,后文中还会介绍其他前提条件。(另外,32 位发行版也能在 64 位的 AMD/Intel 计算机上正常运行,并作为 LFS 的构建环境。)

构建 64 位系统相较于 32 位系统而言只会获得很小的收益。例如,在使用 Core i7-4790 CPU 的 4 个 CPU 核心测试构建 LFS-9.1 时,我们得到的实验数据为:

架构 构建时间 系统大小
32 位 239.9 分钟 3.6 GB
64 位 233.2 分钟 4.4 GB

可以看出,在相同的硬件上,64 位系统的构建仅仅比 32 位快 3% (但占用的磁盘空间却大 22%)。如果您准备用 LFS 系统运行 LAMP 服务器,或者防火墙,那么 32 位 CPU 足以满足需求。然而,BLFS 中的一些软件包在构建或运行过程中可能需要超过 4GB 的内存,因此如果您准备将 LFS 作为桌面系统,LFS 作者推荐构建 64 位系统。

完全按照本书构建的 LFS 系统是一个“纯粹的” 64 位系统。换句话说,它只能运行 64 位可执行程序。构建一个“multi-lib” 系统需要将许多应用程序编译两次,一次编译为 32 位,另一次编译为 64 位。本书不提供这方面的内容,因为本书的教学目的是提供简洁的基本 Linux 系统的构建方法,讨论 multilib 会和这一目标发生冲突。一些 LFS/BLFS 编辑维护了 LFS 的 multilib 版本,可以在 https://www.linuxfromscratch.org/~thomas/multilib/index.html 查阅。但这是一个比较复杂的主题。

Prerequisites

构建 LFS 系统不是一项简单的任务。它需要您运用足够丰富的 Unix 系统管理知识来解决构建过程中的问题,并正确执行本书给出的命令。特别是,您至少需要知道如何使用命令行 (shell) 来复制或移动文件和目录,列出目录或文件的内容,以及切换当前工作目录。另外,我们预期您知道如何使用和安装 Linux 软件。

由于本书假定您至少具备上述基本技能,任何 LFS 支持论坛不太可能在这些领域为您提供帮助。关于这些基础知识的问题一般会被忽略 (或者被提供一份 LFS 背景知识预习书单作为答案)。

在您开始构建 LFS 系统之前,我们建议您阅读下列材料:

LFS and Standards

LFS 的结构尽可能遵循 Linux 的各项标准。主要的标准有:

注意

许多人不认同 LSB 的要求。定义 LSB 的主要目的是保证专有软件能够在满足 LSB 的系统上正常安装并运行。然而 LFS 是基于源代码的,用户完全知道自己需要什么软件包;您可以选择不安装 LSB 要求的一些软件包。

”从零开始“创建一个能够通过 LSB 认证测试的完整系统是可行的,但需要安装大量超过 LFS 范畴的额外软件包。在 BLFS 中可以找到这些软件包的安装说明。

LSB 要求的,由 LFS 提供的软件包

LSB 要求的,由 BLFS 提供的软件包

LSB 要求的,LFS 和 BLFS 均不提供的软件包

Rationale for Packages in the Book

LFS 的目标是构建一个完整且基本可用的系统 —— 包括所有再次构建 LFS 系统本身所需的软件包 —— 以便用户在这个相对较小的系统基础上,根据自己的选择,定制一个更完整的系统。但是,LFS 并不是最小可用系统。严格来说,LFS 中一些软件包并不是必须安装的。下面列出了选择每个软件包的理由。

Typography

为了使得本书更容易阅读,首先说明本书的排版惯例。本节包含本书中若干排版格式的示例。

./configure --prefix=/usr

类似上面这样排版的文字应当被绝对准确地输入,除非上下文另有说明。在解释命令的含义时,我们也用这种格式给出被解释的命令。

有时,我们会将一个逻辑行拆分成两行或者多行,此时行末需要使用反斜线。

CC="gcc -B/usr/bin/" ../binutils-2.18/configure \
  --prefix=/tools --disable-nls --disable-werror

请注意反斜线之后必须紧跟换行符。反斜线后如果存在空格或者制表符等其他空白字符,会导致不正确的结果。

install-info: unknown option '--dir-file=/mnt/lfs/usr/info/dir'

以上格式的文本 (等宽字体) 展示屏幕输出,通常是某个命令执行的结果。这种格式也用于展示文件名,例如 /etc/ld.so.conf。

注意:请配置浏览器以使用合适的等宽字体,以便区分 Il1 或 O0 的字形。

强调的文本

以上格式的文本在本书中被用于一些目的。主要目的是强调重点。

https://www.linuxfromscratch.org/

以上格式的文本是超链接,可能指向 LFS 社区内部或外部的页面。外部页面包括 HOWTO,下载地址,以及网站。

cat > $LFS/etc/group << "EOF"
root:x:0:
bin:x:1:
......
EOF

这种格式在创建配置文件时使用,第一行的命令告诉系统使用键盘输入的后续各行内容创建 $LFS/etc/group 文件,直到遇到文件结束序列 (EOF)。因此,通常应该将整段命令原封不动地输入。

*<需要替换的文本>*

不应该直接输入或复制粘贴这种尖括号包含的文本,而应该将其替换成合适内容。

[可选的文本]

方括号包含的文本是可选的,根据您的需要决定是否输入。

passwd(5)

以上格式被用于引用特定的手册 (man) 页面。数字表明页面来自系统手册中的某一节。例如,passwd 有两个 man 页面。LFS 安装命令将它们安装在 /usr/share/man/man1/passwd.1/usr/share/man/man5/passwd.5。当本书使用 passwd(5) 时,它特指 man 页面 /usr/share/man/man5/passwd.5man passwd 会显示它找到的第一个匹配 “passwd” 的 man 页面,即 /usr/share/man/man1/passwd.1。对于本例,您需要执行 man 5 passwd 才能阅读指定的 man 页面。多数 man 页面在各个章节中并不存在重名。因此,man *<程序名>* 一般是足够的。

Structure

本书被分为以下三个部分。

第一部分 - 引言

第一部分解释了一些安装 LFS 时的重要注意事项。同时,提供了本书的基本信息。

第二部分 - 准备工作

第二部分描述了如何进行构建的准备工作,包括分区、下载软件包、编译临时工具链等。

第三部分 - 构建 LFS 交叉工具链和临时工具

第三部分提供在最终构建 LFS 系统时需要使用的工具的构建方法。

第四部分 - 构建 LFS 系统

第四部分引导读者完成 LFS 系统的构建 — 逐个安装和编译所有需要的软件包,设定引导脚本,以及安装内核。得到的 Linux 系统是一个基本系统,在它之上可以继续编译其他软件,以扩展系统,更好地满足需求。在本书的最后,给出了一个便于使用的引用列表,包括本书中安装的所有软件、库和其他重要文件。

第五部分 - 附录

第五部分提供关于本书本身的信息,如缩写和用语,致谢,软件包依赖信息,LFS 引导脚本的代码清单,本书的许可和发行信息,以及软件包、程序、库和引导脚本的完整索引。

Errata and Security Advisories

用于构建 LFS 系统的软件处于不断更新和改进的过程中。在本书发布后,一些软件可能公布安全警告和漏洞修复补丁。为了确认本书提供的软件包版本或者构建命令是否需要修正 —— 以修复安全漏洞或其他 bug,请在开始构建 LFS 之前阅读 https://www.linuxfromscratch.org/lfs/errata/11.3/。请记录勘误表列出的所有修正项,并据此在构建过程中对本书相关章节给出的操作进行修正。

另外,Linux From Scratch 编辑维护了在手册发布后发现的安全缺陷列表。在进行构建前,请访问 https://www.linuxfromscratch.org/lfs/advisories/ 以检查是否存在需要处理的安全缺陷。请根据安全公告的建议,在构建过程中对本书相关章节给出的操作进行修正。另外,如果要将 LFS 系统实际用作桌面或服务器系统,那么即使在 LFS 系统构建完成后,也要继续关注安全公告并修复列出的所有安全缺陷。