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
必须存在的基础命令(节选)
ls、cp、kill、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 自身服务
目的:
- 让 GCC 自举自身的 C++ 组件
- 为第二遍完整 GCC 打基础 ABI
🔧 四、第6章:临时工具链(/usr)
这一章构建的是:
“进入 chroot 前,LFS 自己的用户空间工具”
共 17 个关键包。
4.1 M4 —— Autoconf 的地基
.m4 → configure → Makefile
没有 M4:
- Autoconf 无法运行
- glibc 无法配置
- 构建直接终止
4.2 Ncurses —— 终端 UI 基础
让终端拥有:
- 光标移动
- 彩色输出
- 菜单界面
内核 menuconfig、bash、vim 都依赖它。
4.3 Bash —— 未来系统的 Shell
进入 chroot 后:
Bash 就是你的世界入口
4.4 Coreutils —— Linux 的“骨架”
提供最基础的命令集合:
cp / mv / rm / lscat / echo / sortdate / chmod / df
👉 没有 Coreutils,Linux 甚至不能称为 Linux
4.5 ~ 4.17(精要概览)
| 工具 | 核心作用 |
|---|---|
| Diffutils | 文件差异比较 |
| File | 判断真实文件类型 |
| Findutils | find / 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 崩溃
- 你会本能地理解系统错误
- 你会真正“读懂”构建日志
📘 这不是一条快路,但一定是最扎实的路。