从零部署 CentOS 的两种方式
- 方式一:在现有 Linux 上“从零构建”一套全新的 CentOS(近似 Linux From Scratch 思路),适合学习、定制最小化系统或制作启动介质。
- 方式二:用 Docker FROM scratch 制作极简 CentOS 基础镜像,适合容器化交付与快速启动。
方式一 从零构建 CentOS 系统
- 准备宿主机
- 选择稳定的 CentOS 7/8 或其他发行版作为构建宿主机,安装必要工具:
- CentOS 7 示例:sudo yum install -y binutils bison coreutils diffutils findutils gawk gcc gcc-c++ grep gzip m4 make patch perl python3 sed tar texinfo xz
- 若提示缺少 yacc,可用 bison 兼容:sudo ln -sv /usr/bin/bison /usr/bin/yacc
- 创建专用用户与目录(强烈建议非 root 构建):
- sudo groupadd lfs && sudo useradd -s /bin/bash -g lfs -m -k /dev/null lfs
- 设置 LFS 环境变量(示例):export LFS=/mnt/lfs && mkdir -pv $LFS/{sources,download} && chmod -v a+wt $LFS/sources
- 获取源码与校验
- 下载 LFS 官方“包与补丁大包”(示例版本 11.1):wget http://ftp.lfs-matrix.net/pub/lfs/lfs-packages-11.1.tar
- 校验与解压:md5sum -c lfs-packages-11.1.tar && tar -xf lfs-packages-11.1.tar && mv 11.1/* $LFS/sources
- 构建临时工具链
- 切换用户:su - lfs
- 配置环境(~/.bash_profile 与 ~/.bashrc):关闭 hash、设置 umask、PATH 优先使用 $LFS/tools/bin、设置 LFS_TGT=$(uname -m)-lfs-linux-gnu
- 按 LFS 手册顺序编译:binutils-pass1 → gcc-pass1 → linux-headers → glibc → libstdc++ → binutils-pass2 → gcc-pass2 等
- 构建目标系统
- chroot 进入 $LFS 新系统,依序安装 coreutils、util-linux、e2fsprogs、iproute2、systemd、openssh、yum/dnf 等基础组件
- 配置 fstab、网络(/etc/sysconfig/network-scripts/ 或 systemd-networkd)、root 密码、sshd
- 安装引导
- 在目标磁盘或 U 盘上创建分区并格式化(如 ext4),挂载到 /mnt/target
- 安装 GRUB:grub-install --root-directory=/mnt/target /dev/sdX
- 配置 grub.cfg(示例):
- set root=(hd0,1)
- linux /boot/vmlinuz-<版本> root=/dev/sda1 rootdelay=8
- initrd /boot/initramfs-<版本>.img
- 注意:rootdelay=8 常用于等待 USB/磁盘就绪;盘符在 GRUB 与内核参数中的表示可能不同(hd0,1 vs /dev/sda1)
- 启动验证
- 选择 U 盘/磁盘启动,进入系统后检查网络、包管理器、sshd 与日志(journalctl -xe)是否正常
方式二 用 Docker FROM scratch 制作 CentOS 基础镜像
- 准备根文件系统包
- 获取官方 centos-<版本>-docker.tar.xz(示例:centos-7.4.1708-docker.tar.xz),该压缩包内含已打包好的 CentOS 根文件系统
- 编写 Dockerfile
- 示例:
- FROM scratch
- ADD centos-7.4.1708-docker.tar.xz /
- LABEL name=“CentOS Base Image” vendor=“CentOS” license=“GPLv2” build-date=“20181012”
- CMD [“/bin/bash”]
- 构建与运行
- 构建:docker image build -t centos7.4 .
- 运行:docker container run -it --name centos centos7.4 /bin/bash
- 说明
- 该方式直接以 scratch 为空镜像,将 CentOS 根文件系统解压到镜像根目录,启动默认进入 /bin/bash,适合容器场景的极简基镜像
关键注意事项与常见问题
- 构建顺序与工具链
- 严格遵循“临时工具链 → 目标系统 → 引导安装”的流程;不要混用宿主与目标工具链路径
- 并行编译可显著提速(如 make -j$(nproc)),但在 chroot 后或资源紧张时谨慎使用
- 启动参数与设备名
- U 盘/磁盘在不同阶段可能呈现不同设备名;GRUB 中 (hd0,1) 与内核参数 root=/dev/sda1 的索引规则不同,必要时使用 rootdelay 等待设备就绪
- 兼容性
- 不同 CentOS 7/8 小版本的根文件系统包与内核版本存在差异,制作镜像或引导时请保持版本一致
- 容器与系统差异
- FROM scratch 镜像不含 systemd 常驻进程所需的完整 init 环境;若需 systemd,需额外配置并启用相应权限与挂载(不建议在容器内长期以 systemd 为主进程)
两种方式的选择建议
- 需要可启动的物理机/虚拟机系统、学习 Linux 构建细节或定制最小化系统:选择方式一(从零构建)
- 需要轻量、可移植、快速分发的容器基镜像:选择方式二(Docker FROM scratch)