学习 Ubuntu From Scratch (UFW)(从源代码构建 Ubuntu 系统)是一个深入理解 Linux 系统底层运作原理的绝佳方式。这个过程将带你从零开始,理解 Linux 发行版的构建逻辑。
以下是系统性的学习路径、核心概念以及详细的步骤指南。
在动手之前,你需要理解“从零构建”是什么意思。你不是要编写 Ubuntu 的代码,而是要使用工具从源代码编译出所有的二进制文件,并组装成一个可用的系统。
你需要掌握的核心概念:
推荐阅读(必读):
你需要一个已经安装好的 Linux 系统作为“宿主”来构建 UFW。不建议使用 Windows 的 WSL,因为 WSL 的内核模型和文件系统权限与真实 Linux 有差异,容易导致构建失败。
在宿主系统中,你需要安装编译所需的工具:
sudo apt update
sudo apt install build-essential bison flex gawk texinfo m4 xz-utils unzip wget curl git
虽然 LFS 有固定的书,但 UFW 往往涉及将 Debian/Ubuntu 的打包理念应用到手工编译中。
传统的 Ubuntu From Scratch 并没有像 LFS 那样标准化的教材。通常的做法是参考 Live CD 构建工具,如 live-build 或参考 Debian 的 Debootstrap。
推荐路径(Debootstrap 法): 这是最接近“从零开始构建 Ubuntu”的现代方法。它不是编译每一个 .c 文件(那太耗时了),而是组装 Ubuntu 的二进制包,但流程是“纯净”的。
安装 debootstrap:
sudo apt install debootstrap
建立工作目录:
mkdir -p $HOME/ufw-root
cd $HOME/ufw-root
使用 debootstrap 拉取 Ubuntu 基础系统(以 Jammy 为例):
sudo debootstrap jammy ./ubuntu-base http://archive.ubuntu.com/ubuntu
这会下载 Ubuntu 最小系统的 .deb 包并解压到 ./ubuntu-base 目录。
现在你拥有了一个 Ubuntu 的“骨架”,但它不能运行,你需要进入它。
sudo mount --bind /dev ./ubuntu-base/dev
sudo mount --bind /proc ./ubuntu-base/proc
sudo mount --bind /sys ./ubuntu-base/sys
sudo chroot ./ubuntu-base
进入 Chroot 后,你就是在一台“裸机”的 Ubuntu 里操作了。
设置语言和时区:
apt update
apt install locales
dpkg-reconfigure locales # 选择 en_US.UTF-8 或 zh_CN.UTF-8
dpkg-reconfigure tzdata
安装内核(关键步骤): Ubuntu 使用特定的内核包。
apt install linux-image-generic linux-headers-generic
安装 GRUB(引导加载器): 注意:如果你只是想在 Chroot 里玩,跳过这步;如果要做成可启动的 ISO,见下一步。
apt install grub-pc # 或者 grub-efi-amd64
设置 Root 密码:
passwd
添加普通用户:
adduser yourname
如果你希望这个系统能像安装盘一样启动,你需要使用 live-build 工具或者 Cubic。
ubuntu-desktop),修改配置。如果你指的是像 LFS 那样,下载 GCC、Glibc 的源码自己编译,而不是用 APT 安装,那么你需要遵循 LFS 的步骤,但将源码包替换为 Ubuntu 对应的版本。
packages.ubuntu.com,下载 .dsc、.orig.tar.gz 等源码包。dpkg-buildpackage 将编译好的文件打包成 .deb,而不是仅仅复制到 /usr。这是为了符合 Ubuntu 的规范。| 难度 | 推荐方法 | 学习收获 |
|---|---|---|
| 入门 | 阅读 LFS 中文版 书籍 | 理解编译原理,工具链,文件系统结构。这是基础课。 |
| 实践 | 使用 Debootstrap | 理解 Ubuntu/Debian 的包管理,构建最小系统。 |
| 进阶 | 使用 Cubic | 学习如何定制 Live CD,如何配置预装软件。 |
| 专家 | Live-build 脚本 | 掌握自动化构建 ISO 的流程,适合发布自己的发行版。 |
--prefix=/usr 而不是默认的 /usr/local,因为 Ubuntu/Debian 的包管理系统只管理 /usr 和 / 下的目录。$LFS/build 目录。建议: 如果你是第一次尝试,请先不要直接做 Ubuntu,而是跟着 Linux From Scratch (LFS) 的官方手册做一遍。做完 LFS 后,你会发现 UFW (Ubuntu From Scratch) 只是把 LFS 的源码换成了 Ubuntu 的源码,并加上了 dpkg/apt 的包管理逻辑。