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 系统之前,我们建议您阅读下列材料:
-
Software-Building-HOWTO https://tldp.org/HOWTO/Software-Building-HOWTO.html
这是一份关于在 Linux 环境编译和安装“常规的”Unix 软件包的详细指南。虽然这份文档比较老,但是它较好地总结了编译和安装软件的基本技巧。
-
Beginner’s Guide to Installing from Source https://moi.vonos.net/linux/beginners-installing-from-source/
这份指南很好地总结了从源代码编译软件的基本技能和技巧。
LFS and Standards
LFS 的结构尽可能遵循 Linux 的各项标准。主要的标准有:
-
Linux Standard Base (LSB) Version 5.0 (2015)
LSB 由四个独立的规范组成:Core、Desktop、Runtime Language 和 Imaging。Core 和 Desktop 规范中一些部分是架构相关的。另外,还有两个处于试用阶段的规范:Gtk3 和 Graphics。LFS 试图遵循 LSB 对前一节讨论的 IA32 (32 位 x86) 和AMD64 (x86_64) 架构的要求。
注意
许多人不认同 LSB 的要求。定义 LSB 的主要目的是保证专有软件能够在满足 LSB 的系统上正常安装并运行。然而 LFS 是基于源代码的,用户完全知道自己需要什么软件包;您可以选择不安装 LSB 要求的一些软件包。
”从零开始“创建一个能够通过 LSB 认证测试的完整系统是可行的,但需要安装大量超过 LFS 范畴的额外软件包。在 BLFS 中可以找到这些软件包的安装说明。
LSB 要求的,由 LFS 提供的软件包
- LSB Core: Bash, Bc, Binutils, Coreutils, Diffutils, File, Findutils, Gawk, Grep, Gzip, M4, Man-DB, Ncurses, Procps, Psmisc, Sed, Shadow, Tar, Util-linux, Zlib
- LSB Desktop: 无
- LSB Runtime Languages: Perl, Python
- LSB Imaging: 无
- LSB Gtk3 和 LSB Graphics (试用): 无
LSB 要求的,由 BLFS 提供的软件包
- LSB Core: At, Batch (At 的一部分), Cpio, Ed, Fcrontab, LSB-Tools, NSPR, NSS, PAM, Pax, Sendmail (或 Postfix,或 Exim), time
- LSB Desktop: Alsa, ATK, Cairo, Desktop-file-utils, Freetype, Fontconfig, Gdk-pixbuf, Glib2, GTK+2, Icon-naming-utils, Libjpeg-turbo, Libpng, Libtiff, Libxml2, MesaLib, Pango, Xdg-utils, Xorg
- LSB Runtime Languages: Libxml2, Libxslt
- LSB Imaging: CUPS, Cups-filters, Ghostscript, SANE
- LSB Gtk3 和 LSB Graphics (试用): GTK+3
LSB 要求的,LFS 和 BLFS 均不提供的软件包
- LSB Core: 无
- LSB Desktop: Qt4 (但提供了 Qt5)
- LSB Runtime Languages: 无
- LSB Imaging: 无
- LSB Gtk3 和 LSB Graphics(试用): 无
Rationale for Packages in the Book
LFS 的目标是构建一个完整且基本可用的系统 —— 包括所有再次构建 LFS 系统本身所需的软件包 —— 以便用户在这个相对较小的系统基础上,根据自己的选择,定制一个更完整的系统。但是,LFS 并不是最小可用系统。严格来说,LFS 中一些软件包并不是必须安装的。下面列出了选择每个软件包的理由。
-
Acl
这个软件包包含管理访问控制列表 (ACL) 的工具,用来对文件和目录提供细粒度的访问权限控制。
-
Attr
这个软件包包含管理文件系统对象的扩展属性的程序。
-
Autoconf
这个软件包提供能根据软件开发者提供的模板,自动生成配置源代码的 shell 脚本的程序。如果修改了软件包的构建过程,一般需要该软件包的支持才能重新构建被修改的软件包。
-
Automake
这个软件包包含能根据软件开发者提供的模板,自动生成 Makefile 的程序。如果修改了软件包的构建过程,一般需要该软件包的支持才能重新构建被修改的软件包。
-
Bash
这个软件包为系统提供一个 LSB core 要求的 Bourne Shell 接口。它是较为常用的 shell 软件包,且具有一定的的扩展能力,因此在各种 shell 软件包中选择了它。
-
Bc
这个软件包提供了一个任意精度数值处理语言。在编译 Linux 内核时需要该软件包。
-
Binutils
该软件包提供链接器、汇编器,以及其他处理目标文件的工具。编译 LFS 系统中的大多数软件包都需要这些程序。
-
Bison
这个软件包包含 yacc (Yet Another Compiler Compiler) 的 GNU 版本。一些 LFS 程序的编译过程需要该软件包。
-
Bzip2
这个软件包包含用于压缩和解压缩文件的程序。许多 LFS 软件包的解压需要该软件包。
-
Check
这个软件包提供其他程序使用的测试环境。
-
Coreutils
这个软件包包含一些用于查看和操作文件和目录的基本程序。这些程序被用于在命令行下管理文件,以及每个 LFS 软件包的安装过程。
-
DejaGNU
这个软件包提供用于测试其他程序的框架。
-
Diffutils
这个软件包包含用于显示文件或目录之间的差异的程序。这些程序可以被用于创建补丁,很多软件包的编译过程也需要该软件包。
-
E2fsprogs
这个软件包提供用于处理 ext2, ext3 和 ext4 文件系统的工具。它们是 Linux 支持的最常用且久经考验的文件系统。
-
Eudev
这个软件包是一个设备管理器,它随着系统中硬件设备的增加或移除,动态地控制 /dev 目录中设备节点的所有权,访问权限,文件名,以及符号链接。
-
Expat
这个软件包提供一个相对轻量级的 XML 解析库。Perl 模块 XML::Parser 需要该软件包。
-
Expect
这个软件包包含一个自动和其他交互程序交互的脚本执行程序。一般用它测试其他程序。
-
File
这个软件包包含用于判定给定文件类型的工具。一些软件包的构建脚本需要它。
-
Findutils
这个软件包提供用于在文件系统中寻找文件的程序。它被许多软件包的编译脚本使用。
-
Flex
这个软件包包含用于生成词法分析器的程序。它是 lex (lexical analyzer) 程序的 GNU 版本。许多 LFS 软件包的编译过程需要该软件包。
-
Gawk
这个软件包提供用于操作文本文件的程序。它是 awk (Aho-Weinberg-Kernighan) 的 GNU 版本。它被许多其他软件包的构建脚本使用。
-
GCC
这是 GNU 编译器的集合。它包含 C 和 C++ 编译器,以及其他一些在 LFS 中不会涉及的编译器。
-
GDBM
这个软件包包含 GNU 数据库管理库。LFS 的另一个软件包 Man-DB 需要该软件包。
-
Gettext
这个软件包提供用于许多其他软件包的国际化和本地化的工具和库。
-
Glibc
这个软件包包含主要的 C 语言库。Linux 程序没有该软件包的支持根本无法运行。
-
GMP
这个软件包提供数学库,这些库支持用于任意精度算术的函数。编译 GCC 需要该软件包。
-
Gperf
这个软件包提供一个能够根据键值集合生成完美散列函数的程序。Eudev 需要该软件包。
-
Grep
这个软件包包含在文本中搜索指定模式的程序。它被多数软件包的编译脚本所使用。
-
Groff
这个软件包提供用于处理和格式化文本的程序。它们的一项重要功能是格式化 man 页面。
-
GRUB
这个软件包是 Grand Unified Boot Loader。Linux 可以使用其他引导加载器,但 GRUB 最灵活。
-
Gzip
这个软件包包含用于压缩和解压缩文件的程序。许多 LFS 软件包的解压需要该软件包。
-
Iana-etc
这个软件包包含网络服务和协议的描述数据。网络功能的正确运作需要该软件包。
-
Inetutils
这个软件包提供基本网络管理程序。
-
Intltool
这个软件包提供能够从源代码中提取可翻译字符串的工具。
-
IProute2
这个软件包提供了用于 IPv4 和 IPv6 网络的基础和高级管理程序。和另一个常见的网络工具包 net-tools 相比,它具有管理 IPv6 网络的能力。
-
Kbd
这个软件包提供键盘映射文件,用于非美式键盘的键盘工具,以及一些控制台字体。
-
Kmod
这个软件包提供用于管理 Linux 内核模块的程序。
-
Less
这个软件包包含一个很好的文本文件查看器,它支持在查看文件时上下滚动。许多软件包使用它对输出进行分页。
-
Libcap
这个软件包实现了用于访问 Linux 内核中 POSIX 1003.1e 权能字功能的用户空间接口。
-
Libelf
Elfutils 项目提供了用于 ELF 文件和 DWARF 数据的工具和库。该软件包的大多数工具已经由其他软件包提供,但使用默认 (也是最高效的) 配置构建 Linux 内核时,需要使用该软件包的库。
-
Libffi
这个软件包实现了一个可移植的高级编程接口,用于处理不同的调用惯例。某些程序在编译时并不知道如何向函数传递参数,例如解释器在运行时才得到函数的参数个数和类型信息。它们可以使用 libffi 作为解释语言和编译语言之间的桥梁。
-
Libpipeline
Libpipeline 提供一个能够灵活、方便地操作子进程流水线的库。Man-DB 软件包需要这个库。
-
Libtool
这个软件包包含 GNU 通用库支持脚本。它将共享库的使用封装成一个一致、可移植的接口。在其他 LFS 软件包的测试套件中需要该软件包。
-
Linux Kernel
这个软件包就是操作系统。我们平常说的 “GNU/Linux” 环境中的 “Linux” 就指的是它。
-
M4
这个软件包提供通用的文本宏处理器。它被其他程序用作构建工具。
-
Make
这个软件包包含用于指导软件包编译过程的程序。LFS 中几乎每个软件包都需要它。
-
Man-DB
这个软件包包含用于查找和浏览 man 页面的程序。与 man 软件包相比,该软件包的国际化功能更为强大。该软件包提供了 man 程序。
-
Man-pages
这个软件包提供基本的 Linux man 页面的实际内容。
-
Meson
这个软件包一个自动化软件构建过程的工具。它的设计目标是最小化软件开发者不得不用于配置构建系统的时间。该软件包在构建 Systemd 和很多 BLFS 软件包时是必要的。
-
MPC
这个软件包提供用于复数算术的函数。GCC 需要该软件包。
-
MPFR
这个软件包包含用于多精度算术的函数。GCC 需要该软件包。
-
Ninja
这个软件包提供一个注重执行速度的小型构建系统。它被设计为读取高级构建系统生成的输入文件,并以尽量高的速度运行。Meson 需要该软件包。
-
Ncurses
这个软件包包含用于处理字符界面的不依赖特定终端的库。它一般被用于为菜单系统提供光标控制。一些 LFS 软件包需要该软件包。
-
Openssl
这个软件包包含关于密码学的管理工具和库,它们为 Linux 内核等其他软件包提供密码学功能。
-
Patch
这个软件包包含一个通过 补丁 文件修改或创建文件的程序。补丁文件通常由 diff 程序创建。一些 LFS 软件包的编译过程需要该软件包。
-
Perl
这个软件包是运行时语言 PERL 的解释器。几个 LFS 软件包的安装和测试过程需要该软件包。
-
Pkg-config
这个软件包提供一个查询已经安装的库和软件包的元数据信息的程序。
-
Procps-NG
这个软件包包含用于监控系统进程的程序,对系统管理非常有用。另外 LFS 引导脚本也需要该软件包。
-
Psmisc
这个软件包提供一些显示当前运行的系统进程信息的程序。这些程序对系统管理非常有用。
-
Python 3
这个软件包提供了一种在设计时强调代码可读性的解释性语言支持。
-
Readline
这个软件包是一组库,提供命令行编辑和历史记录支持。Bash 需要该软件包。
-
Sed
这个软件包可以在没有文本编辑器的情况下编辑文本文件。另外,许多 LFS 软件包的配置脚本需要该软件包。
-
Shadow
这个软件包包含用于安全地处理密码的程序。
-
Sysklogd
这个软件包提供用于记录系统消息的程序,这些消息包括内核或者守护进程在异常事件发生时的提示。
-
Sysvinit
这个软件包提供init程序,在 Linux 系统中它是其他所有进程的祖先。
-
Tar
这个软件包提供存档和提取功能,几乎每个 LFS 软件包都需要它才能被提取。
-
Tcl
这个软件包包含在测试套件中广泛使用的工具控制语言 (Tool Command Language)。
-
Texinfo
这个软件包提供用于阅读、编写和转换 info 页面的程序。许多 LFS 软件包的安装过程需要使用它。
-
Util-linux
这个软件包包含许多工具程序,其中有处理文件系统、终端、分区和消息的工具。
-
Vim
这个软件包提供一个编辑器。由于它与经典的 vi 编辑器相兼容,且拥有许多强大的功能,我们选择这个编辑器。编辑器的选择是非常主观的。如果希望的话,读者可以用其他编辑器替代它。
-
Wheel
该软件包提供一个 Python 模块,该模块是 Python wheel 软件包标准格式的参考实现。
-
XML::Parser
这个软件包是和 Expat 交互的 Perl 模块。
-
XZ Utils
这个软件包包含用于压缩和解压缩文件的程序。在所有这类程序中,该软件包提供了最高的压缩率。该软件包被用于解压 XZ 或 LZMA 格式的压缩文件。
-
Zlib
这个软件包包含一些程序使用的压缩和解压缩子程序。
-
Zstd
这个软件包提供一些程序使用的压缩和解压缩子程序。它具有较高的压缩比,以及很宽的压缩比/速度权衡范围。
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.5。man 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 系统构建完成后,也要继续关注安全公告并修复列出的所有安全缺陷。