CentOS fromscratch安装步骤解析
小樊
32
2025-12-13 19:46:19
目标与总体思路
- 在 CentOS 宿主机上,按 Linux From Scratch(LFS) 的方法从零构建一套可用的 CentOS 根文件系统:先准备宿主环境,再构建临时工具链与目标工具链,编译核心组件(Glibc、GCC、Coreutils 等),安装 GRUB 并制作可启动介质(U 盘/磁盘),最后完成首次启动与收尾配置。
- 关键约定:工作目录 $LFS=/mnt/lfs;源码与补丁放在 $LFS/sources;临时工具链放在 $LFS/tools;目标架构三元组 $LFS_TGT=$(uname -m)-lfs-linux-gnu;编译时优先使用 $LFS/tools/bin 下的工具,避免污染宿主环境。
一 准备宿主环境与源码
- 安装宿主依赖(以 CentOS 7 为例,按官方 LFS 要求与常见实践补齐):
- 包组与工具:binutils、bison、coreutils、diffutils、findutils、gawk、gcc、gcc-c++、grep、gzip、m4、make、patch、perl、python3、sed、tar、texinfo、xz 等。
- 若检查脚本提示缺少 yacc,可用 GNU Bison 兼容:ln -sv /usr/bin/bison /usr/bin/yacc。
- 创建目录与权限:
- mkdir -v $LFS/{sources,tools,usr};chmod -v a+wt $LFS/sources。
- 下载 LFS 源码包与补丁:
- 方式一:按手册的 wget-list 逐个下载并校验(MD5/SHA256)。
- 方式二:下载打包的 lfs-packages-<版本>.tar,解压到 $LFS/sources;必要时校验完整性(如 md5sum)。
- 创建专用用户与纯净环境:
- groupadd lfs;useradd -s /bin/bash -g lfs -m -k /dev/null lfs;passwd lfs;chown -v lfs $LFS/{tools,sources,download};su - lfs。
- 设置环境(~/.bash_profile 与 ~/.bashrc):关闭 hash、设置 umask、导出 LFS、LC_ALL=POSIX、LFS_TGT、PATH=$LFS/tools/bin:$PATH,必要时设置 CONFIG_SITE=$LFS/usr/share/config.site。
- 建议:全程使用普通用户 lfs 编译,减少误操作风险;编译初期可用 time 记录各包耗时,以首个包(如 Binutils)耗时为 1 SBU 作为后续估算基准。
二 构建临时工具链与目标系统
- 构建顺序遵循“自举”原则:先构建临时 Binutils、GCC(pass 1)、C 库(临时)、核心工具(Coreutils、File、Findutils、Gawk、Grep、Make、Patch、Sed、Tar、XZ 等),再构建临时 Glibc,随后进入“目标系统”阶段重建并安装最终 Binutils/GCC/Glibc 等,最后安装基础系统软件与引导。
- 关键要点:
- 每个软件包编译前进入解压目录,遵循“configure → make → make install”的通用流程;必要时使用补丁与测试(make check),但测试失败在不影响正确性的前提下可酌情忽略。
- 临时阶段工具链路径统一使用 $LFS/tools,避免链接到宿主 /usr;环境变量与 --prefix 要严格对应阶段目标。
- 进入目标系统阶段前,清理或重设环境变量,确保后续使用新工具链与库;重建 GCC 时注意依赖 GMP/MPFR/MPC 等库的正确寻址与版本匹配。
- 安装基础系统软件(如 IPRoute2、Util-linux、E2fsprogs、Coreutils、Bash、Bison、Flex、Gawk、Grep、Sed、Tar、XZ、Kmod、Procps-ng、Eudev、Shadow、Sysvinit/Systemd 等)时,遵循 LFS 手册的推荐顺序与注意事项(例如 Shadow 的权限与登录安全配置、设备节点与 udev 规则、系统初始化选择等)。
三 安装引导与制作可启动介质
- 分区与文件系统:在目标介质(如 /dev/sdb)上创建分区(如 /dev/sdb1),格式化为 ext4;挂载到 /mnt/target。
- 安装 GRUB 到介质:
- grub-install --root-directory=/mnt/target /dev/sdb
- 说明:–root-directory 指向挂载点(不含分区号),设备为整块盘(如 /dev/sdb)。
- 配置 GRUB(/mnt/target/boot/grub/grub.cfg)示例:
- set root=(hd0,1)
- linux /boot/vmlinuz-<版本> root=/dev/sda1 rootdelay=8
- initrd /boot/initramfs-<版本>.img
- 提示:以 U 盘 启动时,U 盘在目标系统里常映射为 /dev/sda;rootdelay=8 常用于等待设备就绪,避免 VFS 挂载根分区失败。
- 生成 initramfs(在 chroot 或目标系统中):
- dracut -f /boot/initramfs-<版本>.img <内核版本>
- fstab 示例(按实际分区调整):
- /dev/sda1 / ext4 defaults 0 1
- 首次启动排障要点:
- 若仅进入 grub> 命令行,可手工引导:
- root (hd0,0)
- kernel /boot/vmlinuz-<版本> root=/dev/sda1 rootdelay=8
- boot
- 注意 GRUB 的括号索引与分区号差异:set root 使用 (hd0,1)(从 1 开始),而命令行 root 使用 (hd0,0)(从 0 开始)。
四 首次启动与收尾配置
- 首次进入系统后执行基础收尾:
- 设置 root 密码、创建普通用户、配置 /etc/hostname 与 /etc/resolv.conf、设置时区与 NTP、配置 sudo。
- 检查并完善 /etc/fstab(根分区、boot 分区、swap 等),确保与 GRUB 配置一致。
- 安装与启用网络(如 NetworkManager、systemd-networkd)、SSH 服务;按需配置防火墙与 SELinux(或先宽松验证再收紧)。
- 更新动态链接库缓存:ldconfig;检查关键命令与库文件路径是否正确(which、ldd)。
- 验证与回退:
- 重启验证引导、网络、用户登录、包管理与服务自启是否正常;如异常,回看 GRUB 参数、fstab、initramfs 与设备映射。
- 可选:在目标系统上建立本地 YUM/DNF 仓库(拷贝 CentOS 基础包或使用 ISO 作为本地源),便于后续软件安装与维护。