温馨提示×

怎样用fromscratch方式部署CentOS

小樊
45
2025-12-13 19:48:21
栏目: 智能运维

从零部署 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)

0