
1. 环境准备与基础概念在开始构建自定义CentOS安装镜像之前我们需要先理解几个关键概念。无人值守安装Unattended Installation是指通过预先配置的应答文件自动完成系统安装过程无需人工干预。Kickstart正是Red Hat系Linux实现无人值守安装的核心技术它通过一个名为ks.cfg的配置文件来定义安装过程中的所有参数。对于系统管理员来说这种自动化安装方式能带来三个显著优势批量部署效率同时为数十台服务器安装统一配置的系统环境一致性确保每台机器的软件包、配置完全一致快速恢复能力在系统崩溃时能快速重建相同环境我建议使用CentOS 7或8作为基础系统这两个版本都有长期支持且文档丰富。实验环境配置如下# 安装必要工具 yum -y install createrepo mkisofs openssl rsync syslinux isomd5sum这里特别说明下各工具的作用createrepo创建本地YUM仓库元数据mkisofs/genisoimage生成ISO镜像文件isomd5sum为ISO添加校验信息提示实际操作时建议使用4GB以上内存的虚拟机并确保有20GB可用磁盘空间。我曾遇到过在资源不足的机器上制作镜像时出现随机失败的情况。2. 原始ISO处理与文件准备首先需要获取官方CentOS ISO镜像。以CentOS 7为例可以从官方镜像站点下载wget http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso挂载原始ISO并复制文件注意不能直接修改挂载点内容mkdir -p /mnt/cdrom /iso/centos7 mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom rsync -a /mnt/cdrom/ /iso/centos7/这里使用rsync而非cp命令的原因有两个保留所有文件属性包括隐藏文件自动处理符号链接等特殊文件我曾因为直接使用cp命令导致制作的镜像缺少.treeinfo等关键文件最终安装失败。教训就是镜像目录中的每个文件都有其作用不要随意遗漏。接下来创建自定义文件存放目录mkdir -p /iso/centos7/extras/{rpms,scripts}目录结构说明extras/rpms存放自定义RPM包extras/scripts存放安装后执行的脚本3. Kickstart文件深度定制这是整个过程中最关键的环节。我们先看一个基础模板再逐步添加自定义功能cat /iso/centos7/isolinux/ks.cfg EOF # 基本系统配置 install cdrom lang en_US.UTF-8 keyboard us timezone Asia/Shanghai --isUtc rootpw --iscrypted $1$GKKIW9uZ$NFU/sz8SzXRN92lYe2aV10 auth --useshadow --passalgosha512 selinux --disabled firewall --disabled network --bootprotodhcp --deviceeth0 reboot # 磁盘分区配置 zerombr clearpart --all --initlabel part /boot --fstypexfs --size500 part swap --size4096 part / --fstypexfs --size1 --grow # 软件包选择 %packages ^minimal core vim-enhanced git python3 docker-ce %end # 安装后脚本 %post #!/bin/bash # 注册自定义YUM源 cat /etc/yum.repos.d/local.repo EOL [local] nameLocal Repository baseurlfile:///mnt/extras/rpms enabled1 gpgcheck0 EOL # 安装自定义RPM包 yum -y install custom-package-1.0-1.el7.x86_64.rpm # 执行部署脚本 curl -s http://internal-server/deploy.sh | bash %end EOF几个需要特别注意的参数rootpw建议使用加密密码可通过openssl passwd -1生成%packages^minimal是最小化安装core包含基础工具集%post这里可以添加任意shell命令但要注意网络依赖问题实际项目中我遇到过一个典型问题在%post阶段直接使用yum安装软件但因为网络未就绪导致失败。解决方法是在网络配置后添加--activate参数network --bootprotodhcp --deviceeth0 --activate4. 集成自定义软件包将开发环境所需的软件包集成到镜像中有两种主要方式方法一直接打包RPM适用于标准软件仓库中没有的专有软件。制作RPM的基本步骤# 安装打包工具 yum install -y rpm-build rpmdevtools # 准备构建环境 rpmdev-setuptree # 示例spec文件~/rpmbuild/SPECS/demo.spec Name: custom-package Version: 1.0 Release: 1%{?dist} Summary: Custom software package License: GPLv3 URL: http://example.com Source0: %{name}-%{version}.tar.gz %description This is a custom software package for our environment. %prep %setup -q %install mkdir -p %{buildroot}/usr/local/bin install -m 755 script.sh %{buildroot}/usr/local/bin/ %files /usr/local/bin/script.sh %changelog * Tue Aug 01 2023 Your Name emailexample.com - 1.0-1 - Initial package build方法二创建本地仓库适用于需要批量集成的软件集合# 将下载的RPM包放入指定目录 cp /path/to/*.rpm /iso/centos7/extras/rpms/ # 创建仓库元数据 createrepo -v /iso/centos7/extras/rpms/ # 在ks.cfg中添加仓库配置 repo --namelocal --baseurlfile:///mnt/extras/rpms我曾为一个机器学习团队制作镜像需要集成CUDA、TensorFlow等大型软件包。通过本地仓库方式将安装时间从2小时缩短到20分钟因为所有依赖都在本地解决。5. 修改引导配置为了让安装程序自动识别我们的Kickstart文件需要修改isolinux配置sed -i s/append initrdinitrd.img/append initrdinitrd.img kscdrom:\/isolinux\/ks.cfg/ /iso/centos7/isolinux/isolinux.cfg验证配置是否正确grep kscdrom /iso/centos7/isolinux/isolinux.cfg对于UEFI引导还需要更新grub配置echo menuentry Auto Install CentOS 7 { linuxefi /images/pxeboot/vmlinuz inst.kscdrom:/isolinux/ks.cfg initrdefi /images/pxeboot/initrd.img } /iso/centos7/EFI/BOOT/grub.cfg6. 生成ISO镜像使用以下命令生成最终镜像genisoimage -U -r -v -T -J \ -joliet-long \ -V CentOS 7 x86_64 Custom \ -volset CentOS 7 x86_64 Custom \ -A CentOS 7 Custom Build \ -b isolinux/isolinux.bin \ -c isolinux/boot.cat \ -no-emul-boot \ -boot-load-size 4 \ -boot-info-table \ -eltorito-alt-boot \ -e images/efiboot.img \ -no-emul-boot \ -o /tmp/centos7-custom.iso \ /iso/centos7关键参数说明-V设置卷标必须与原始镜像不同-b指定BIOS引导镜像-e指定EFI引导镜像-joliet-long支持长文件名最后添加校验信息isohybrid /tmp/centos7-custom.iso implantisomd5 /tmp/centos7-custom.iso7. 测试与验证建议按以下步骤测试镜像在虚拟机中启动测试qemu-system-x86_64 -m 2048 -cdrom /tmp/centos7-custom.iso验证关键点是否自动开始安装分区是否符合预期所有指定软件包是否安装自定义脚本是否执行检查日志# 安装日志 /root/ks-post.log # 系统日志 journalctl -xe常见问题处理安装卡住检查%post阶段是否有交互式命令软件包缺失确认仓库配置正确且路径无误网络不通确保%post阶段网络已激活8. 高级技巧与优化对于大型部署环境可以进一步优化1. 网络安装优化将ISO发布到HTTP服务器通过PXE网络引导# 示例httpd配置 Alias /centos /iso Directory /iso Options Indexes FollowSymLinks Require all granted /Directory2. 镜像瘦身移除不需要的软件包节省空间# 查看软件包大小 rpm -qa --queryformat %{NAME} %{SIZE}\n | sort -k2 -n # 在ks.cfg中排除文档包 %packages ^minimal -*docs %end3. 多环境支持通过Kickstart条件语句支持不同环境%post if grep -q development /proc/cmdline; then yum -y install dev-tools elif grep -q production /proc/cmdline; then firewall-cmd --permanent --add-servicehttps fi %end在实际生产环境中我使用这套方法为不同团队定制了开发、测试、生产三种版本的镜像通过引导参数自动区分环境类型大大简化了运维工作。