🧱 Linux From Scratch(LFS)学习笔记 ——从“会用 Linux”到“理解 Linux 是如何诞生的”

4 阅读5分钟

LFS(Linux From Scratch)不是为了让你拥有一个更好的 Linux,
而是让你真正理解 Linux。

这是一份我亲手完成 LFS 构建过程时整理的学习笔记。
如果你已经厌倦了「只会用命令、不知道系统为什么这么设计」,
那么 LFS 会彻底改变你对 Linux 的理解方式


🧠 一、为什么要做 LFS?

LFS 项目存在的一个重要意义是:

通过“从零构建一个 Linux 系统”,理解 Linux 内部是如何运作的

在构建 LFS 的过程中,你会真正搞清楚:

  • 编译器是如何工作的
  • C 标准库和内核是如何协作的
  • 工具链为什么要分“第一遍 / 第二遍”
  • 为什么 Linux 必须遵循文件系统层级标准
  • 一个 Linux 系统“最小可用形态”到底需要什么

最终,你将拥有一个完全属于自己的 GNU/Linux 系统

📐 二、前置知识:LSB & FHS

1️⃣ LSB(Linux Standard Base)

LSB 规定了 Linux 发行版必须满足的一系列标准,其中最重要的包括:

📂 文件系统层级标准(FHS)

/bin        基本用户命令
/sbin       系统管理命令
/usr/bin    用户可执行程序
/usr/sbin   管理员命令
/lib        运行时共享库
/usr/lib    用户程序共享库
/etc        系统配置文件
/var        可变数据

关键要求:

  • /etc/init.d:启动脚本
  • /usr/bin:用户程序
  • /lib:运行时库

2️⃣ LSB 要求系统必须提供的组件

  • glibc(最低版本要求)
  • libstdc++
  • PAM
  • libc6 ABI

动态链接器位置(强制)

32 位:/lib/ld-linux.so.2
64 位:/lib64/ld-linux-x86-64.so.2

必须存在的基础命令(节选)

lscpkill、ps、sh、tar、gzip

🛠 三、第5章:构建交叉工具链(/tools)

目标:构建一个“临时、隔离、不依赖宿主系统”的工具链

这是 LFS 最精华、也最容易“悟道”的一章。


3.1 Binutils(第一遍)

Binutils 提供最底层的二进制工具:

  • ld —— 链接器(Link Editor)
  • as —— 汇编器(Assembler)

生成的工具路径:

/mnt/lfs/tools/bin/x86_64-lfs-linux-gnu-ld
/mnt/lfs/tools/bin/x86_64-lfs-linux-gnu-as

👉 它们属于目标系统,而不是宿主系统


3.2 GCC(第一遍)

GCC 是 GNU 编译器集合。

依赖关系(必须理解)

  • GMP:多精度整数/浮点运算
  • MPFR:高精度浮点计算(基于 GMP)
  • MPC:高精度复数计算(GMP + MPFR)

第一遍 GCC 的特点

  • ❌ 不支持 C++
  • ❌ 不依赖目标系统头文件
  • ✅ 只能编译 C
  • ✅ 用于编译 glibc
/mnt/lfs/tools/bin/x86_64-lfs-linux-gnu-gcc

👉 这是一个**“阉割版 GCC”**,但它是后续一切的根基。


3.3 Linux API Header

内核头文件的作用一句话说明:

告诉 glibc:内核提供了哪些系统调用

例如:

  • open()
  • read()
  • ioctl()

没有这些头文件,glibc 根本不知道该如何和内核对话。


3.4 Glibc(第一遍)

glibc 是 Linux 的 C 标准库核心,提供:

  • 内存管理
  • 文件 IO
  • 字符串处理
  • 系统调用封装

它由以下三者共同构建:

Binutils + GCC + Linux API Headers

3.5 Libstdc++(第一遍)

让 GCC 具备“构建 C++ 世界的能力”

第一遍 libstdc++:

  • ❌ 不完整
  • ❌ 不可运行
  • ✅ 只为 GCC 自身服务

目的:

  1. 让 GCC 自举自身的 C++ 组件
  2. 为第二遍完整 GCC 打基础 ABI

🔧 四、第6章:临时工具链(/usr)

这一章构建的是:
“进入 chroot 前,LFS 自己的用户空间工具”

17 个关键包


4.1 M4 —— Autoconf 的地基

.m4 → configure → Makefile

没有 M4:

  • Autoconf 无法运行
  • glibc 无法配置
  • 构建直接终止

4.2 Ncurses —— 终端 UI 基础

让终端拥有:

  • 光标移动
  • 彩色输出
  • 菜单界面

内核 menuconfigbashvim 都依赖它。


4.3 Bash —— 未来系统的 Shell

进入 chroot 后:

Bash 就是你的世界入口


4.4 Coreutils —— Linux 的“骨架”

提供最基础的命令集合:

  • cp / mv / rm / ls
  • cat / echo / sort
  • date / chmod / df

👉 没有 Coreutils,Linux 甚至不能称为 Linux


4.5 ~ 4.17(精要概览)

工具核心作用
Diffutils文件差异比较
File判断真实文件类型
Findutilsfind / xargs
Gawk强大文本处理
Grep文本过滤
Gzip / Xz压缩
Make构建系统
Patch修改源码
Sed流编辑
Binutils(第二遍)完整工具链
GCC(第二遍)完整编译器

💡 这一章结束:你已经“离开宿主系统”80% 了

🚪 五、第7章:chroot —— 进入真正的 LFS 世界

chroot "$LFS" /usr/bin/env -i \
    HOME=/root TERM="$TERM" PS1='(lfs)\u:\w$ ' \
    PATH=/usr/bin:/usr/sbin \
    /bin/bash --login

这一刻:

  • ❌ 不再使用宿主 /bin
  • ❌ 不再用宿主 /lib
  • ✅ 你在“自己造的 Linux”里了

🧠 六、第8章:系统核心软件(80+)

关键包说明(精选)

  • Man-pages:系统 API 文档基础
  • Iana-Etc:端口 / 协议数据库
  • Zlib / Bzip2 / Xz / Zstd:压缩生态
  • Readline:bash 行编辑
  • Shadow:用户体系(login / passwd)

⚙️ 七、第9章:系统配置(最容易被忽略,但最关键)

9.1 系统配置文件

必须创建:

/etc/passwd
/etc/group
/etc/hosts
/etc/fstab

否则:

  • ❌ 无法登录
  • ❌ 无法挂载根文件系统

9.2 网络配置

  • hostname
  • hosts
  • resolv.conf
echo "lfs" > /etc/hostname

9.3 时区与 locale

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

locale 决定:

  • 语言
  • 字符集
  • 排序规则

🥾 八、第10章:内核构建(真正的“Linux”)

10.1 配置内核

make menuconfig

你必须启用:

  • 文件系统(ext4)
  • 驱动(virtio / SATA)
  • ELF 支持
  • 网络

💡 没有 initramfs?就必须内建驱动


10.2 编译并安装

make
make modules_install
cp arch/x86/boot/bzImage /boot/vmlinuz-6.x

🚀 九、第11章:引导系统(GRUB)

11.1 安装 GRUB

grub-install /dev/sda

11.2 配置 grub.cfg

menuentry "LFS Linux" {
    linux /boot/vmlinuz root=/dev/sda1 ro
}

🎉 十、完成:你真正“造”了一个 Linux

你现在拥有的是:

  • 自己编译的 gcc
  • 自己链接的 glibc
  • 自己配置的内核
  • 自己启动的系统

🎯 十一、做完 LFS,你真正学会了什么?

✔ Linux 不是“装出来的”,而是 编译出来的
✔ 编译器 ≠ 编译器 + 标准库
✔ glibc 是 Linux 用户空间的真正核心
✔ 系统工具不是“理所当然存在的”
✔ 所有发行版,本质都是 LFS 的“自动化版本”


📌 结语

LFS 是一场“痛并快乐着”的修行

如果你能完整走完一遍 LFS,那么:

  • 你已经不再惧怕 Linux 崩溃
  • 你会本能地理解系统错误
  • 你会真正“读懂”构建日志

📘 这不是一条快路,但一定是最扎实的路。