1.Introduction.md
1.1 How to Build an LFS System
LFS 系统必须在一个已经安装好的 Linux 发行版 (如 Debian、OpenMandriva、Fedora 或者 openSUSE) 中构建。这个安装好的 Linux 系统 (称为宿主) 提供包括编译器、链接器和 shell 在内的必要程序,作为构建新系统的起点。请在安装发行版的过程中选择“development” (开发) 选项,以保证系统包含这些工具。
您也可以选择不安装一个单独的发行版,而是使用某个商业发行版的 LiveCD。
本书的第 2 章描述了如何创建一个新的 Linux 本地分区和文件系统,以在其中编译和安装新的 LFS 系统。第 3 章列举了在构建 LFS 系统的过程中必须下载的软件包和补丁,并解释了在新文件系统中存储它们的方法。第 4 章讨论工作环境的正确配置。请仔细阅读第 4 章,因为它解释了您在开始第 5 章及后续章节的工作前必须了解的一些重要问题。
第 5 章解释初始工具链 (binutils, gcc, 以及 glibc) 的安装过程,在安装过程中使用交叉编译技术,将新的工具与宿主系统完全隔离。
第 6 章向您展示如何使用刚刚构建的交叉工具链,交叉编译一些基本工具。
之后在第 7 章中,进入一个 “chroot” 环境,在其中使用刚刚构建的工具,继续构建 LFS 构建过程中需要的其余工具。
我们努力将新构造的系统从宿主发行版分离出来。这个过程看上去很繁琐,我们将会在工具链技术说明中完整地从技术上解释这样做的必要性。
在第 8 章中我们将构建完整的 LFS 系统。使用 chroot 环境的另一项优势是,在构建 LFS 的过程中,您可以继续使用宿主系统。这样,在等待软件包编译的过程中,您可以继续正常使用计算机。
为了完成安装,我们在第 9 章中进行系统的基本设置,在第 10 章中配置内核和引导加载器。最后,第 11 章包含在阅读完本书后继续体验 LFS 的相关信息。在完成本书的所有流程后,重启计算机即可进入新的 LFS 系统。
以上是 LFS 构建过程的简要介绍,针对特定步骤的详细信息将在之后章节以及软件包的简介中讨论。在您踏上 LFS 的构建之旅后,就能逐步理清这些目前看上去很复杂的步骤,每一步都将变得非常清晰。
1.2 What’s new since the last release
从 LFS 11.3 起,在构建 GCC 时启用 –enable-default-pie 和 –enable-default-ssp。它们能预防一些恶意攻击,但不能完美地保障系统安全。注意一些教科书假设并未使用这些选项,因此如果您在 LFS 系统上运行这些教科书中的示例,可能需要使用 GCC 选项 -fno-pie -no-pie -fno-stack-protection 禁用 PIE 和 SSP。
这里列出本书上一次发布之后发生变化的软件包。
已升级:
- Bash 5.2.15
- Bc 6.2.4
- Binutils-2.40
- Diffutils-3.9
- E2fsprogs-1.47.0
- Expat-2.5.0
- File-5.44
- Gawk-5.2.1
- Gettext-0.21.1
- Glibc-2.37
- Grep-3.8
- IANA-Etc-20230202
- Inetutils-2.4
- IPRoute2-6.1.0
- Less-608
- Libcap-2.67
- Libelf-0.188 (来自 elfutils)
- Libffi-3.4.4
- Linux-6.1.11
- Make-4.4
- Man-DB-2.11.2
- Man-pages-6.03
- Meson-1.0.0
- MPC-1.3.1
- MPFR-4.2.0
- Ncurses-6.4
- Ninja-1.11.1
- Openssl-3.0.8
- Procps-ng-4.0.2
- Psmisc-23.6
- Python-3.11.2
- Readline-8.2
- Sed-4.9
- Shadow-4.13
- SysVinit-3.06
- Tcl-8.6.13
- Texinfo-7.0.2
- Tzdata-2022g
- Vim-9.0.1273
- wheel-0.38.4
- XZ-Utils-5.4.1
- Zlib-1.2.13
- Zstd-1.5.4
已添加:
- grub-2.06-upstream_fixes-1.patch
- readline-8.2-upstream_fix-1.patch
已移除:
- zstd-1.5.2-upstream_fixes-1.patch
1.3 Changelog
这是 Linux From Scratch 手册的 11.3 版本,发布于 2023 年 3 月 1 日。如果该版本已经发布了六个月或更久,可能已经发布了更好的新版本。如果要查询是否有新版本,通过 https://www.linuxfromscratch.org/mirrors.html 访问一个 LFS 镜像站。
下面是本书自上一版本发布以来的更新日志。
更新日志记录:
-
2023 年 3 月 1 日
- [bdubbs] - LFS-11.3 发布。
-
2023 年 2 月 19 日
- [xry111] — 为 GRUB 应用补丁,以修复被 e2fsprogs-1.47.0 触发的一项问题。修复 #5219。
-
2023 年 2 月 13 日
- [bdubbs] — 更新到 man-pages-6.03。修复0 #5216。
-
2023 年 2 月 11 日
-
2023 年 2 月 7 日
-
2023 年 2 月 2 日
-
2023 年 2 月 1 日
-
2023 年 1 月 15 日
-
[thomas] — 在移除调试符号时,将 libsframe 加入 online_usrlib。strip 会使用 libsframe.so.0.0.0。
-
[bdubbs] — 更新到 iana-etc-20230109。处理 #5006。
-
[bdubbs] — 更新到 binutils-2.40。修复 #5198。
-
[bdubbs] — 更新到 bc-6.2.2。修复 #5192。
-
[bdubbs] — 更新到 linux-6.1.6。修复 #5193。
-
[bdubbs] — 更新到 man-db-2.11.2。修复 #5196。
-
[bdubbs] — 更新到 mpfr-4.2.0。修复 #5195。
-
[bdubbs] — 更新到 ncurses-6.4。修复 #5194。
-
[bdubbs] — 更新到 xz-5.4.1。修复 #5197。
-
-
2023 年 1 月 1 日
- [thomas] — 从 mpc 构建过程中删除过时的 sed 命令。
-
2022 年 12 月 31 日
-
2022 年 12 月 15 日
-
[bdubbs] — 在第 8 章中,确保更新 gawk 的一个硬链接。修复 #5180。
-
[bdubbs] — 更新到 iana-etc-20221209。处理 #5006。
-
[bdubbs] — 更新到 vim-9.0.1060。处理 #4500。
-
[bdubbs] — 更新到 iproute2-6.1.0。修复 #5184。
-
[bdubbs] — 更新到 xz-5.4.0。修复 #5183。
-
[bdubbs] — 更新到 bash-5.2.15。修复 #5182。
-
[bdubbs] — 更新到 psmisc-23.6。修复 #5181。
-
[bdubbs] — 更新到 mpc-1.3.0。修复 #5178。
-
[bdubbs] — 更新到 python3-3.11.1。修复 #5177。
-
[bdubbs] — 更新到 procps-ng-4.0.2。修复 #5176。
-
-
2022 年 12 月 1 日
- [bdubbs] — 更新到 linux-6.0.11 (安全更新)。修复 #5175。
-
2022 年 12 月 1 日
-
[bdubbs] — 更新到 iana-etc-20221122。处理 #5006。
-
[bdubbs] — 更新到 xz-5.2.9。修复 #5174。
-
[bdubbs] — 更新到 tzdata-2022g。修复 #5172。
-
[bdubbs] — 更新到 texinfo-7.0.1。修复 #5173。
-
[bdubbs] — 更新到 tcl-8.6.13。修复 #5170。
-
[bdubbs] — 更新到 meson-0.64.1。修复 #5169。
-
[bdubbs] — 更新到 linux-6.0.10。修复 #5171。
-
[bdubbs] — 更新到 gawk-5.2.1。修复 #5168。
-
-
2022 年 11 月 22 日
-
2022 年 11 月 10 日
-
[bdubbs] — 修复 make-4.4 中的错误。修复 #5160。
-
[bdubbs] — 更新到 wheel-0.38.4 (Python 模块)。修复 #5155。
-
[bdubbs] — 更新到 texinfo-7.0。修复 #5159。
-
[bdubbs] — 更新到 sysvinit-3.05。修复 #5153。
-
[bdubbs] — 更新到 shadow-4.13。修复 #5161。
-
[bdubbs] — 更新到 sed-4.9。修复 #5157。
-
[bdubbs] — 更新到 meson-0.64.0。修复 #5156。
-
[bdubbs] — 更新到 linux-6.0.7。修复 #5154。
-
[bdubbs] — 更新到 elfutils-0.188。修复 #5152。
-
[bdubbs] — 更新到 bc-6.1.1。修复 #5151。
-
[bdubbs] — 更新到 bash-5.2.9。修复 #5158。
-
-
2022 年 11 月 1 日
-
[bdubbs] — 更新到 openssl-3.0.7 (安全更新)。修复 #5132。
-
[bdubbs] — 更新到 iana-etc-20221025。处理 #5006。
-
[bdubbs] — 更新到 tzdata-2022f。修复 #5148。
-
[bdubbs] — 更新到 Python3-3.11.0。修复 #5145。
-
[bdubbs] — 更新到 procps-ng-4.0.1。修复 #5141。
-
[bdubbs] — 更新到 man-pages-6.01。修复 #5140。
-
[bdubbs] — 更新到 man-db-2.11.0。修复 #5139。
-
[bdubbs] — 更新到 make-4.4。修复 #5149。
-
[bdubbs] — 更新到 linux-6.0.6。修复 #5142。
-
[bdubbs] — 更新到 libffi-3.4.4。修复 #5144。
-
[bdubbs] — 更新到 inetutils-2.4。修复 #5147。
-
[bdubbs] — 更新到 expat-2.5.0。修复 #5132。
-
-
2022 年 10 月 17 日
- [bdubbs] — 更新到 linux-6.0.2 (安全更新)。修复 #5138。
-
2022 年 10 月 15 日
-
[bdubbs] — 更新到 iana-etc-20221007。处理 #5006。
-
[bdubbs] — 更新到 vim-9.0.0739。处理 #5006。
-
[bdubbs] — 加入 readline 和 bash 的上游修复补丁。修复 #5131.
-
[bdubbs] — 更新到 zlib-1.2.13。修复 #5137。
-
[bdubbs] — 更新到 man-pages-6.00。修复 #5136。
-
[bdubbs] — 更新到 gettext-0.21.1。修复 #5130。
-
[bdubbs] — 更新到 iproute2-6.0.0。修复 #5127。
-
[bdubbs] — 更新到 meson-0.63.3。修复 #5129。
-
[bdubbs] — 更新到 Python-3.10.8。修复 #5133。
-
[bdubbs] — 更新到 xz-5.2.7。修复 #5133。
-
[bdubbs] — 更新到 tzdata-2022e。修复 #5134。
-
[bdubbs] — 更新到 linux-6.0.1。修复 #5135。
-
-
2022 年 10 月 4 日
- [renodr] — 更新到 Linux-5.19.13。如果您的笔记本电脑使用 Intel GPU,请立即将 Linux-5.19.12 更新到该版本,以防止损坏屏幕。修复 #5125。
-
2022 年 10 月 1 日
-
[bdubbs] — 更新到 iana-etc-20220922。处理 #5006。
-
[bdubbs] — 更新到 tzdata-2022d。修复 #5119。
-
[bdubbs] — 更新到 readline-8.2。修复 #5121。
-
[bdubbs] — 更新到 linux-5.19.12。修复 #5115。
-
[bdubbs] — 更新到 libffi-3.4.3。修复 #5116。
-
[bdubbs] — 更新到 libcap-2.66。修复 #5120。
-
[bdubbs] — 更新到 bc-6.0.4。修复 #5114。
-
[bdubbs] — 更新到 bash-5.2。修复 #5122。
-
-
2022 年 9 月 22 日
- [bdubbs] — 更新到 expat-2.4.9 (安全更新)。修复 #5117。
-
2022 年 9 月 20 日
- [bdubbs] — 在为 chroot 准备虚拟文件系统时,调整依赖于宿主系统 /dev/shm 配置的命令。
-
2022 年 9 月 15 日
-
[bdubbs] — 更新到 file-5.43。修复 #5113。
-
[bdubbs] — 更新到 linux-5.19.8。修复 #5111。
-
[bdubbs] — 更新到 gawk-5.2.0。修复 #5108。
-
[bdubbs] — 更新到 meson-0.63.2。修复 #5106。
-
[bdubbs] — 更新到 ninja-1.11.1。修复 #5103。
-
[bdubbs] — 更新到 bc-6.0.2。修复 #5102。
-
[bdubbs] — 修复 eudev 报告的 udev 规则安装位置。修复 #5112。
-
[bdubbs] — 移除 egrep 和 fgrep 中导致一些软件包测试失败的警告。
-
[bdubbs] — 删除空的 binutils man 页面。修复 #5100。
-
-
2022 年 9 月 10 日
- [pierre] — 在构建 GCC 时使用
--enable-default-pie和--enable-default-ssp选项。其原因和一些测试结果记录在 #5107 中。
- [pierre] — 在构建 GCC 时使用
-
2022 年 9 月 7 日
-
2022 年 9 月 1 日
- [bdubbs] - LFS-11.2 发布。
1.4 Resources
1.4.1. FAQ
如果在构建 LFS 的过程中您遇到了任何问题,或是存在疑问,或者觉得书中存在拼写错误,请先参考常见问题 (FAQ) 列表,它位于 https://www.linuxfromscratch.org/faq/。
1.4.2. 邮件列表
服务器 linuxfromscratch.org 管理了若干用于 LFS项目开发过程的邮件列表,其中有主要的开发列表和技术支持列表,以及其他辅助列表。如果 FAQ 不能解决您的问题,您可以访问 https://www.linuxfromscratch.org/search.html 在邮件列表中进行搜索。
如果希望了解各个邮件列表的信息,如订阅方法、过往邮件存档等,访问 https://www.linuxfromscratch.org/mail.html。
1.4.3. IRC
一些 LFS 社区成员通过互联网中继聊天系统 (IRC) 提供支援。在使用这一渠道之前,首先保证您的问题并没有被 LFS FAQ 和邮件列表解决。您可以在 irc.libera.net 找到 IRC 网络,支持频道的名字是 #lfs-support。
1.4.4. 镜像站
LFS 项目在全世界分布着若干镜像站,您可以通过这些镜像站更容易地访问 LFS 网站,并下载需要的软件包。请访问 LFS 网站 https://www.linuxfromscratch.org/mirrors.html 获取最新的镜像站点列表。
1.4.5. 联系信息
请直接将您的问题和评论发送到某个 LFS 邮件列表 (上面已经给出)。
1.5 Help
如果您在按照本书工作的过程中遇到任何问题或者疑问,请先阅读位于 https://www.linuxfromscratch.org/faq/#generalfaq 的常见问题列表,一般来说可以找到答案。如果您的问题没有被 FAQ 解决,试着找到问题的根源。这个指南指出了一些疑难问题的排查思路:https://www.linuxfromscratch.org/hints/downloads/files/errors.txt。
如果 FAQ 中没有您的问题,访问 https://www.linuxfromscratch.org/search.html,在邮件列表中搜索。
我们也有一个不错的 LFS 社区,社区成员愿意通过邮件列表和 IRC (见第 1.4 节 “相关资源”) 提供支援。然而,我们每天都会得到一大堆明明在 FAQ 或者邮件列表中能找到答案的问题。因此,为了使得技术支持的效能最大化,您需要自己先对问题进行一些研究。这样,我们就能够集中精力解决最特殊的支援需求。如果您的研究得不到结果,请您在求助时附带下面列出的全部相关信息。
1.5.1. 需要提供的信息
除了简要描述您遇到的问题外,您应该在求助邮件中附带下列必要信息。
LFS 手册的版本 (您正在阅读的版本是 11.3)
构建 LFS 时使用的宿主发行版名称和版本
宿主系统需求脚本的输出
出现问题的软件包或书内章节
程序输出的原始错误消息,或者对问题的清晰描述
您是否进行了超出本书内容的操作
注意: 有超出本书内容的操作,并不意味着我们就不会协助您。无论如何,LFS 强调个人体验。在求助信中说明您对本书给出构建过程的改动,有助于我们猜测和判定问题的可能原因。
1.5.2. 配置脚本的问题
如果在运行 configure 脚本的过程中出现问题,请阅读日志文件 config.log。它可能包含configure 运行时没有输出到屏幕的具体问题。求助时请附带日志文件中与问题 相关 的部分。
1.5.3. 编译错误
屏幕上的输出和一些文件的内容对于确认编译错误的原因都很有用。屏幕输出来自于 configure 脚本和 make 命令。您不用附带所有输出内容,只要包含足够相关信息即可。例如,这里给出从 make 的屏幕输出中截取的一段:
gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/lfs/usr/share/locale\"
-DLIBDIR=\"/mnt/lfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I.
-g -O2 -c getopt1.c
gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o
expand.o file.o function.o getopt.o implicit.o job.o main.o
misc.o read.o remake.o rule.o signame.o variable.o vpath.o
default.o remote-stub.o version.o opt1.o
-lutil job.o: In function `load_too_high':
/lfs/tmp/make-3.79.1/job.c:1565: undefined reference
to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [make] Error 1
make[2]: Leaving directory `/lfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2
对于本例来说,许多人会只附带靠下的一行:
make [2]: *** [make] Error 1
这一行只告诉我们某些事情出问题了,而完全没有说明哪里出了问题。而上面的一段输出包含了出现问题的命令行和相关的错误消息,这是我们需要的。
可以在线阅读一篇关于如何在网络上提问的精彩文章:http://catb.org/~esr/faqs/smart-questions.html。请阅读它并遵循它的建议。这样可以增加您得到帮助的可能性。