全部项目
Project已结束

LFS · 从源码构建 Linux 系统

用约四天完成 LFS 13.0-systemd 基础系统构建,亲手走过宿主工具检查、chroot 软件安装、文件系统配置与 UEFI 引导排错,理解 Linux 系统各层如何组合运行。

里程碑

4 个关键节点
  1. 开始项目

    准备宿主环境并开始源码构建

    检查宿主工具与构建环境,排查 yacc 实际调用 byacc、与 LFS 所需 GNU Bison 不一致的问题,开始本轮 LFS 实践。

  2. 阶段记录

    进入 chroot 并推进基础软件安装

    在 LFS chroot 环境处理基础软件包,核对 Iana-Etc 数据文件与 Tcl 源码包、文档包的用途,按手册推进系统构建。

  3. 阶段记录

    配置文件系统并排查 UEFI 引导

    梳理根分区、独立 /boot 与 ESP 的挂载关系和 fstab 字段,排查分区编号变化导致的 GRUB rescue,研究按 UUID 定位分区的启动配置。

  4. 结束项目

    完成 LFS 基础系统构建

    连续约四天完成 Linux From Scratch 13.0-systemd 基础系统构建与配置实践,结束本轮系统学习项目。

目标与背景

平时使用 Linux 发行版时,内核、编译器、基础命令和启动服务大多已经由发行版打包组合好。我想亲手走一遍这套组合过程,理解一个 Linux 系统如何从宿主环境里的源码包,逐步成为拥有自己工具链和用户空间的基础系统。

这次实践按照 Linux From Scratch 13.0-systemd 手册展开,集中在 2026 年 8 月的连续四天内完成。手册提供构建步骤,我负责准备环境、处理源码、编译安装、配置系统,并排查过程中遇到的问题。

我的工作

我围绕基础系统构建,依次推进宿主工具检查、工具链和临时工具准备、进入 chroot 安装基础软件,以及文件系统与启动配置。相比安装现成发行版,这次需要直接面对构建环境、源码包的用途和不同阶段之间的依赖关系。

过程中的记录既有软件包处理,也有分区调整后的引导排错。最终完成的是本轮 LFS 基础系统构建与配置实践。

实现内容

核对宿主工具的实际实现

刚开始遇到的一个具体问题是:宿主环境虽然装有 Bison,yacc --version 却仍显示另一套实现。讨论中反复检查了 byacc、Bison、/usr/bin/yacc 与命令搜索路径的关系。

这让我意识到,“装了某个软件”和“构建脚本实际调用了它”是两件事。LFS 的宿主要求与检查脚本明确约定了工具实现;脚本限定的 PATH 也决定了只在个人目录里放包装脚本未必有效。

在 chroot 中处理基础软件

8 月 15 日的实拍已经处于 (lfs chroot) root:/sources 环境。源码目录里能看到 GCC、Glibc、Linux 内核及各类基础工具的压缩包,构建由宿主环境逐步转入目标系统内部。

当时核对过两个容易混淆的细节:Iana-Etc 安装的是协议与服务数据文件;Tcl 同时提供源码包和 HTML 文档包,真正用于编译的是 -src 包。处理这些问题时,需要把手册中的软件名称、磁盘上的完整文件名和实际安装方式对应起来。

配置文件系统与启动链

系统配置阶段,我重点梳理了 /etc/fstab 中设备、挂载点、文件系统类型、选项、转储标志和检查顺序的含义,并区分根分区、独立 /boot 与 EFI System Partition(ESP)的职责。对应的基础配置见手册的 fstab 章节。

随后调整分区时,GRUB 出现了进入救援模式的问题:修改 grub.cfg 后仍需要继续排查 EFI 引导文件与旧分区位置之间的关系。围绕这个问题,我研究了按文件系统 UUID 搜索分区,以及将 GRUB 放入 ESP、生成独立 EFI 引导文件等方案,理解启动程序、配置文件和目标根文件系统之间的连接。

复盘与后续方向

这次实践最有价值的部分,是把“构建成功”和“系统各层配置正确”联系起来:工具的路径与实现必须对应,软件包需要按用途处理,挂载配置和引导程序也要指向同一个实际布局。

基础构建完成后,当时还提出过进一步探索 UKI(统一内核镜像)的想法。它作为后续方向保留,本次里程碑记录集中在已经完成的四天 LFS 实践。

站内搜索

找到你感兴趣的内容

文章分类
选择文章分类,匹配任意一个所选分类

多选时显示属于任一所选分类的文章。

文章标签
选择文章标签,多个标签需同时包含

多选时只显示同时包含所选标签的文章。

输入关键词开始搜索