ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CentOS定制ISO实战:用Kickstart实现无人值守安装与批量部署

CentOS定制ISO实战:用Kickstart实现无人值守安装与批量部署 1. 定制CentOS ISO是什么为什么值得折腾1.1 一个运维老兵的自制镜像执念做Linux运维和系统集成的人迟早会走到这一步装系统装到吐。我最早入行那会儿给机房批量部署CentOS还是最原始的路子——一台一台放光盘、插U盘点完图形安装界面里的“下一步”还要盯着分区、时区、软件包选择挨个确认。运气好一天装十台运气不好碰上某个节点硬件特殊光驱动就得折腾半小时。后来学会用Kickstart做无人值守网络安装倒是快了但每一批机器还是得先搭PXE环境、配置DHCP、准备HTTP源整套链路绑在一起对临时的小批量部署来说反而显得笨重。直到有一天我意识到既然Kickstart文件能实现全自动安装那为什么不把定制好的Kickstart和软件包选择直接塞进ISO镜像里做出来的东西就是一个“插进去就能自动装完、装完就是生产环境状态”的黑盒子——不用维护PXE服务不用记忆一堆命令行参数任何人拿这个ISO去装机器结果都是一样的。这就是定制CentOS ISO的核心价值把重复的安装经验固化成镜像文件让系统交付标准化。它适合你解决三类问题公司内部批量交付CentOS服务器要求每台机器分区一致、软件版本一致、初始化配置一致。测试环境需要快速重建希望装完系统就同时带好JDK、数据库客户端、监控Agent和基础安全配置。给客户或异构团队提供系统时不希望对方在安装环节自由发挥而是“你只要把这个盘插进去”。我在这篇文章里会把整套流程完整走一遍从环境准备、Kickstart文件编写、ISO解包重打包到虚拟机实测和那些文档里不会告诉你的坑。保证你看完能自己动手做出一张定制CentOS 7.9的安装盘。1.2 定制ISO vs 其他自动化装机方案的取舍先给还不熟悉这块的读者摆一下市面上常用的几种自动化装机方案免得你们一上来就被各种名词绕晕方案基本原理优势劣势PXE Kickstart网络启动引导安装程序从HTTP/NFS拉取安装源和配置适合大规模批量部署无物理介质依赖依赖DHCP/TFTP/HTTP服务链路多排障成本高定制ISO KickstartKickstart脚本和软件包预制进镜像直接启动安装单机可复现逻辑简单交付物就是一个文件改一次配置就要重新打包迭代略麻烦云镜像/容器镜像直接复制系统盘或镜像层部署最快环境一致性最高对物理机硬件兼容性不如安装盘扩容受限制原始安装盘手动装官方ISO安装时手工交互最稳妥硬件兼容性最好完全人工慢且容易出错定制ISO的优势很明确它保留了官方安装程序的硬件探测和驱动加载能力同时又把“人工决策”压缩到零。对几十台规模、硬件型号相对统一的场景这是性价比最高的方案。而且定制ISO还能顺便解决一个官方镜像解决不了的问题——官方CentOS安装盘的软件包不包含你公司内部私有仓库的RPM包你总不能在安装完系统后再手动rpm -ivh一个一个装吧把需要的包直接打进镜像里装完即用。2. 核心原理安装程序如何读懂你的定制意图2.1 一张安装盘里到底有什么要定制ISO首先得知道官方CentOS安装盘的内容结构。拿一张CentOS 7.9的DVD镜像挂载开来看你至少会看到这些目录$ mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt/centos $ ls -l /mnt/centos 总用量 546940 drwxr-xr-x. 3 root root 2048 10月 28 2020 EFI drwxr-xr-x. 6 root root 2048 10月 28 2020 images drwxr-xr-x. 2 root root 2048 10月 28 2020 isolinux drwxr-xr-x. 2 root root 2048 10月 28 2020 LiveOS drwxr-xr-x. 2 root root 2048 10月 28 2020 Packages drwxr-xr-x. 2 root root 34816 10月 28 2020 repodata每个目录都有明确的职责isolinux/存放光盘引导加载器相关文件。这是光盘启动的入口isolinux.bin是引导程序本体isolinux.cfg是引导配置文件里面定义了启动菜单、内核参数等。我们要做的Kickstart文件最终也会放在这里方便安装程序启动时直接找到。images/包含启动安装程序所需的镜像文件比如boot.iso、efiboot.img等。UEFI启动时主要依赖这里的文件。Packages/存放所有RPM软件包。DVD版大概有四千多个包这就是离线安装时的软件源。repodata/仓库元数据。安装程序通过这个目录下的comps.xml等文件知道软件包之间的依赖关系和分组信息我们如果新增了RPM包这里也要重新生成。LiveOS/包含一个squashfs压缩镜像里面是安装程序运行时的根文件系统。简单理解安装程序本身就是一个微型的Linux环境它也跑在这个目录下的文件系统里。EFI/UEFI启动时需要用到的引导文件BIOS启动用不到这一块但如果你要在UEFI模式下装系统这个目录必须保留并处理正确。搞清楚了结构定制的基本逻辑就清楚了修改isolinux目录让安装程序在启动时读取我们的Kickstart文件修改Packages和repodata目录来增减软件包最后把整个目录重新打包成ISO。2.2 Kickstart文件的工作原理Kickstart文件说白了就是一份“安装问题答案集”。官方安装程序anaconda本来会一步一步向用户提问——语言选哪个、键盘布局什么、磁盘怎么分、root密码多少、要装哪些软件组……它把所有决策点都暴露成命令或选项Kickstart文件就是提前把这些答案写好让anaconda启动时直接读取跳过交互。Kickstart文件通常分三大段命令段Command Section以各种安装命令开头比如install、lang、keyboard、timezone、rootpw、disk、clearpart、part、network、firewall、selinux等。这些命令决定了安装的基本参数。%packages段指定要安装的软件包或软件组。可以写单个包名也可以写^minimal这种环境组名称还能用-package排除某个包。%post段安装完成后执行的脚本。系统已写入磁盘但还未重启此时可以修改配置文件、安装第三方软件、写用户、调内核参数等。这个段是定制化最灵活的地方。还有一个**%pre段**在安装开始前执行一般用得比较少比如要做动态分区计算时才会用到。安装程序加载Kickstart的优先级是启动参数里ks指定的文件 引导配置里默认的ks文件位置 本地软盘或分区上的ks.cfg。所以只要我们在isolinux.cfg的内核参数里加上kscdrom:/isolinux/ks.cfg安装程序就会主动去光盘的这个路径找我们的配置文件。注意CentOS 7/8的安装程序用的是inst.ks这种新风格参数但ks作为兼容别名仍然有效。为了减少兼容性问题我习惯在新版本里直接写inst.ks。2.3 为什么启动参数能左右整个安装流程这里补一段很多人容易忽略的细节因为不理解它后面遇到启动异常就抓瞎。当一台机器从光盘引导时BIOS固件先加载isolinux.bin然后isolinux读取isolinux.cfg。isolinux.cfg里每一行label对应一个启动菜单项每个菜单项简写了一组追加给内核的参数。比如官方镜像的isolinux.cfg里有一段label linux menu label ^Install CentOS 7 kernel vmlinuz append initrdinitrd.img inst.stage2hd:LABELCentOS\x207\x20x86_64 quiet这段的意思是启动时加载vmlinuz内核同时用initrd.img作为初始RAM磁盘追加参数inst.stage2hd:LABELCentOS\x207\x20x86_64告诉安装程序第二阶段的安装数据也就是整个光盘目录结构从卷标为“CentOS 7 x86_64”的设备上去找。定制时我们会在append里追加inst.kscdrom:/isolinux/ks.cfg这样就相当于告诉内核“安装时不要问用户问题直接去光盘的这个路径读取答案”。还有个细节卷标。官方镜像的卷标是预设好的空间有限制。如果你重新打包ISO时改卷标就必须同步修改inst.stage2参数里的卷标名否则安装程序找不到安装源。这也是新手定制ISO最容易踩的坑之一我在第4节会具体演示怎么处理。3. 动手之前环境准备和定制蓝图3.1 你需要准备什么做定制ISO不是随便找台电脑就能开始的我自己一般这样准备环境你也可以照着搭一台能联网的Linux主机CentOS 7或者8都行至少20GB空闲磁盘。这台机器用来下载原版镜像、解包和重打包ISO。官方CentOS 7.9 DVD镜像iso文件。推荐从清华或阿里云镜像站下载搜“CentOS 7.9 x86_64 DVD iso 下载”就能找到。记得核对一下SHA256校验值避免下载损坏。虚拟机软件我用的是VMware Workstation和VirtualBox用来测试定制好的ISO能不能正常安装。物理机装的话更直观但虚拟机方便反复重置调试效率高很多。基础工具genisoimage或mkisofs、isomd5sum、createrepo后面实际操作时会逐个用到用包管理器安装即可。这里插一句我见过有人直接在Windows上解压ISO改文件再打包结果做出来的镜像在引导阶段各种诡异报错。原因是Windows文件系统不保留Unix文件权限和符号链接而isolinux目录里的引导文件对权限和环境都很敏感。所以定制ISO务必在Linux下进行别自找麻烦。3.2 定制清单先想清楚你要什么在开始动手之前强烈建议先写一份“定制需求清单”。这能让你后面写Kickstart时目标明确避免改来改去。下面是我自己常用的模板安装源形式用原DVD的Packages目录完整保留保证所有包都能装还是精简后保留减小ISO体积语言与键盘默认英语还是中文键盘普通US布局即可。磁盘分区整块盘全部重分还是保留原有分区用LVM还是普通分区/、/boot、/home、swap怎么分root密码统一设置一个初始密码还是安装后由密码管理平台接管加密方式用SHA-512还是更强的网络DHCP自动获取还是每台机器手动指定静态IP软件包装最小化环境^minimal还是包含基础开发工具^development、常用运维命令net-tools、vim、lsof、tcpdump等系统加固要不要关闭SELinux防火墙要开放哪些端口是否禁用不必要的服务出厂预装公司内部的监控Agent、日志采集器、JDK、数据库客户端要不要直接压进去安装后脚本创建哪些用户加入哪些SSH公钥配置哪些yum源这一串问题不是用来灌水的它们直接决定Kickstart文件的内容。千万别图省事写一个“什么都要”的超大安装清单软件装得越多安装耗时越长出错的概率也越大。我的经验是按“最小可用 业务运行时依赖”的原则裁剪跑运维Agent和JDK是底线图形界面、办公软件一律不装。4. 实操从Kickstart到可安装的自制ISO4.1 编写Kickstart配置文件这是定制过程最核心的一步。下面这份ks.cfg是我基于CentOS 7.9生产环境经验调整过的模板兼顾了通用性和稳健性。你可以直接复制到isolinux目录下再按实际情况改。# 安装方式从光盘读取安装数据 install cdrom # 语言和键盘 lang en_US.UTF-8 keyboard us # 网络启用DHCP自动获取 network --bootprotodhcp --deviceeth0 --onbootyes --ipv6auto # 根密码这里是加密后的字符串用grub-crypt或python生成 rootpw --iscrypted $6$f3Pq8XjTkLmN2oPq$yHShDm3CbVFOiG... # 如果你只是测试也可以临时用明文rootpw root123生产环境绝对不要这样 # 时区亚洲上海 timezone Asia/Shanghai --isUtc # 分区策略清空所有分区使用LVM clearpart --all --initlabel --drivessda part /boot --fstypexfs --size1024 --asprimary part pv.01 --size1 --grow volgroup vg_sys pv.01 logvol / --fstypexfs --namelv_root --vgnamevg_sys --size20480 logvol /home --fstypexfs --namelv_home --vgnamevg_sys --size5120 logvol swap --namelv_swap --vgnamevg_sys --size8192 # 引导程序 bootloader --locationmbr --appendcrashkernelauto rhgb quiet # 软件包选择 %packages --nobase ^minimal development vim wget curl net-tools lsof tcpdump tar unzip ntpdate bash-completion %end # 安装后脚本 %post --log/root/ks-post.log # 配置yum镜像源以阿里云为例 cat /etc/yum.repos.d/CentOS-Base.repo EOF [base] nameCentOS-$releasever - Base baseurlhttps://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck1 enabled1 EOF # 关闭SELinux根据需求 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config # 添加运维用户 useradd ops echo Ops2024!passwd | passwd --stdin ops mkdir -p /home/ops/.ssh echo ssh-rsa AAAAB3NzaC1yc2EAAA...YourPublicKeyHere... /home/ops/.ssh/authorized_keys chown -R ops:ops /home/ops/.ssh chmod 700 /home/ops/.ssh chmod 600 /home/ops/.ssh/authorized_keys # 禁用不必要的服务 systemctl disable postfix systemctl disable firewalld # 同步时间 ntpdate -u ntp.aliyun.com /dev/null 21 || true %end # 重启 reboot这份模板里几个关键决策点我解释一下install和cdrom明确告诉安装程序从光盘介质读取安装源。如果你做的镜像是放到虚拟机光驱里测试这两个命令组合最省事。如果以后想配合远程仓库可以把cdrom换成url --urlhttp://192.168.1.10/centos7。clearpart --all --initlabel --drivessda这是一条“破坏性”非常强的命令它会清空指定磁盘的全部分区。生产环境写这句之前务必确认目标机器的磁盘数据不需要保留。LVM分区服务器场景强烈建议用LVM而不是普通分区因为后期扩容灵活得多。热词里经常有人搜“centos lv ao-home 挪空间”、“centos磁盘扩容虚拟机”用的就是LVM的lvresize和xfs_growfs那一套。%packages --nobase这个选项表示不做默认base组的安装而只安装我们明确列出的内容。配合^minimal可以装出非常精简的系统。如果你不想精简把--nobase去掉安装程序会按默认环境组装软件。root密码的加密串不是直接写明文也不是用MD5而是用grub-crypt或python -c import crypt; print(crypt.crypt(你的密码, crypt.mksalt(crypt.METHOD_SHA512)))生成的SHA-512哈希。直接用rootpw root123这种明文写法在Kickstart里虽然合法但安全审计基本都会亮红灯。4.2 挂载原镜像并准备定制目录接下来是把官方ISO挂载并复制到一个可编辑的目录。这里有一个容易犯的错直接在挂载点里改文件。因为挂载点是只读的loop设备默认只读也不能直接往里写。正确做法是复制整个目录树到工作目录。# 创建工作目录 mkdir -p /data/iso_build cd /data/iso_build # 挂载原版镜像 mount -o loop /path/to/CentOS-7-x86_64-DVD-2009.iso /mnt/centos # 复制整个目录到工作目录 cp -a /mnt/centos /data/iso_build/centos7-custom cd /data/iso_build/centos7-custom # 复制ks.cfg到isolinux目录 cp /path/to/ks.cfg isolinux/ks.cfg # 验证文件权限特别是引导相关文件 ls -l isolinux/isolinux.bin isolinux/vmlinuz isolinux/initrd.imgcp -a保证了文件属主和权限不会被破坏这是后面打包能正常引导的隐形保障。isolinux目录下的这3个文件尤其是isolinux.bin权限和内容都不允许被改动。4.3 修改isolinux.cfg让安装程序加载ks文件isolinux.cfg是控制启动菜单和内核参数的文件。默认内容指向手动安装我们要做的是增加一个默认启动项让它自动加载ks.cfg。具体修改如下# 编辑 isolinux/isolinux.cfg $ vim isolinux/isolinux.cfg # 核心修改点给默认label的append追加inst.ks参数 default vesamenu.c32 timeout 30 menu title CentOS 7 Custom Install label linux menu label ^Install CentOS 7 (Custom Auto) kernel vmlinuz append initrdinitrd.img inst.kscdrom:/isolinux/ks.cfg inst.stage2hd:LABELCentOS\x207\x20x86_64 quiet label vesa menu label Install CentOS 7 in ^basic graphics mode kernel vmlinuz append initrdinitrd.img inst.kscdrom:/isolinux/ks.cfg inst.stage2hd:LABELCentOS\x207\x20x86_64 xdrivervesa nomodeset quiet这里有两个容易翻车的地方第一inst.stage2hd:LABELCentOS\x207\x20x86_64里的卷标必须和你最终打包的ISO卷标完全一致。默认原版镜像的卷标是CentOS 7 x86_64所以这里用了\x20表示空格、\x7表示空格后的数字。如果你在打包命令里改了-V卷标这里必须同步改否则安装程序到一半找不到安装源界面会卡在“Failed to find installation source”那一步。第二启动菜单的timeout值单位是1/10秒。要真正实现无人值守可以把timeout设为10左右也就是1秒后自动进入默认项。如果设成0表示永远等待用户选择那就不叫自动安装了。我测试时习惯保留303秒既不会让人措手不及也不会拖太长。4.4 精简与增补RPM包可选但实用官方DVD的Packages目录有好几GB很多包我们用不上。如果你希望最终的ISO小一点或者想预装一些官方镜像里没有的包这一步就需要操作。先说精简包直接删掉不用的RPM文件然后重新生成repodata。但要注意repodata/comps.xml里定义了软件组比如^minimal这个环境组对应的一组基础包。如果你把“其他所有环境组”的包都删了只留minimal相关包安装时指定^minimal依然能正常工作。但如果删得太激进把minimal的依赖包也删了anaconda在解析依赖时会报“找不到依赖”直接中断。再说增补包把需要的rpm文件放进Packages目录然后运行createrepo重新生成repodata# 安装createrepo yum install -y createrepo # 进入Packages目录放入新增RPM包后重新生成仓库元数据 cd /data/iso_build/centos7-custom createrepo -g repodata/*-comps.xml .注意这个-g参数它指定以comps.xml作为软件组定义依据。如果不带这个参数生成的comps.xml和仓库元数据不关联安装程序无法识别软件组。这个步骤我实际操作过很多次最常犯的错是把RPM包从互联网下载到Windows再拖进Linux文件损坏或者权限错乱都会导致安装时软RPM包校验失败。建议下载和拷贝都在Linux环境完成。4.5 用genisoimage重新打包ISO打包是整个流程里最玄学的一环参数顺序和大小写都敏感。我用的命令如下cd /data/iso_build/centos7-custom genisoimage -o /data/iso_build/CentOS-7-x86_64-Custom.iso \ -b isolinux/isolinux.bin \ -c isolinux/boot.cat \ -no-emul-boot \ -boot-load-size 4 \ -boot-info-table \ -R \ -J \ -v \ -V CentOS 7 x86_64 \ -A CentOS 7 x86_64 Custom DVD \ ./参数含义逐个讲清楚-b isolinux/isolinux.bin指定启动镜像文件的路径这个文件必须存在且路径要相对当前目录。-c isolinux/boot.cat指定启动目录文件boot.cat的输出路径这个文件在打包时会自动生成。-no-emul-boot以不模拟软盘的方式启动光盘引导必须加。-boot-load-size 4指定启动镜像加载的扇区数4表示加载4个虚拟扇区2048字节/扇区保持标准。-boot-info-table在启动镜像中写入引导信息表帮助bootloader定位文件。-R生成Rock Ridge属性保留Unix文件权限和符号链接。这个参数不加的话isolinux.bin的权限在解包重写时可能异常。-J生成Joliet扩展主要用于Windows下显示长文件名对Linux安装不是必须但加上无妨。-V CentOS 7 x86_64设置卷标。注意它和isolinux.cfg里inst.stage2hd:LABEL的卷标必须完全一致包括空格否则安装阶段找安装源会失败。./指定打包当前目录内容。这里不要随便指定路径要在定制目录下执行否则目录结构对不上。打包完成后还需要给ISO写入MD5校验和让安装程序在启动时能校验介质完整性# 生成并写入ISO的MD5校验和 implantisomd5 /data/iso_build/CentOS-7-x86_64-Custom.iso这一步不是必须的但建议做。官方的isolinux在启动时会检查这个值如果缺失某些机器上会出现“The media is not recognized”之类的警告。4.6 实测自制ISO打包完后第一件事不是拿到物理机上装而是先在虚拟机里测试。我一般新建一台虚拟机把ISO挂到光驱开启电源然后观察整个安装过程。在VMware里创建虚拟机时磁盘至少20GB内存建议2GB以上。启动后如果一切正常你会看到ISOLINUX引导菜单3秒后自动进入Install流程然后屏幕滚动安装日志最终自动重启进入一个带好初始配置的干净系统。测试时注意几个观察点启动阶段有没有出现“Failed to read config file”或找不到文件之类的报错。安装过程中有没有在“需要磁盘分区配置”这类界面卡住。如果卡住说明Kickstart里的分区指令没有被正确解析。安装完成后系统IP是不是按预期获取到了DHCP地址。%post脚本有没有执行可以看/root/ks-post.log内容。我这里必须提醒一句第一次测试很少有完全顺利的多半会碰到个把坑。看到报错先别慌八成不是环境坏了而是配置问题接着看第5节的排查清单。5. 常见问题与排查技巧实录5.1 引导阶段报错找不到ks.cfg如果启动时出现类似Kickstart file /isolinux/ks.cfg not found的提示常见原因有三ks.cfg文件没复制到isolinux目录。检查一下文件名大小写都对吗Kickstart文件路径是区分大小写的。卷标不匹配。如果你改过-V卷标但isolinux.cfg里还写的是旧的inst.stage2hd:LABELCentOS\x207\x20x86_64安装程序可能连光盘都无法正确挂载自然找不到ks文件。打包时没有用-R参数Rock Ridge属性丢失导致文件被识别成无权限状态安装程序无法读取。排查时可以直接把打包前的目录看一遍确认isolinux/ks.cfg确实存在且权限正常644。然后查看isolinux.cfg里最后的卷标和genisoimage的-V参数是否一致。5.2 安装中段卡住找不到安装源这个报错非常经典安装器提示Failed to find installation source或者You dont have enough free space之类的误导信息。出现这种问题几乎都是因为inst.stage2hd:LABEL里的卷标没有匹配上ISO的卷标。我调试时踩过一次当时为了英文显示把-V改成了CentOS7Custom忘了同步改isolinux.cfg结果安装到33%左右直接卡住报错信息还极其让人摸不着头脑。处理方式用blkid命令查看生成的ISO卷标然后回isolinux.cfg里改。如果你的卷标里带着空格记得用\x20转义不要直接敲空格。5.3 %post脚本没有执行有时候系统装完了但/root/ks-post.log不存在或者内容异常说明post脚本没跑起来。这种问题通常出在两个方面脚本里有语法错误。Kickstart的%post段虽然是shell脚本但它在chroot环境里执行某些命令路径可能不在PATH里。比如systemctl在chroot里可能拿不到完整环境变量你最好写全路径/usr/bin/systemctl或/usr/sbin/systemctl。%post段放在了Kickstart文件错误的位置。某些老版本anaconda对段顺序敏感比如把%post放在了%packages之前可能解析直接失败。我目前的经验是%packages先写%post在后面reboot放最后。如果排除了这两点可以在%post开头加一行exec /root/ks-post.log 21把脚本输出全部重定向到日志文件出问题后看日志比盲猜高效得多。我在模板里已经加了--log参数实际效果等同。5.4 物理机装机失败而虚拟机正常几台虚拟机上测试都没问题一拿到实体服务器上装就翻车。典型的现象是启动后黑屏、引导找不到介质、或安装到一半硬件驱动加载失败。主要原因通常是硬件兼容性。CentOS 7的内核相对比较成熟大部分服务器硬件都能识别但NVMe磁盘、某些RAID卡、较新的网卡可能需要额外驱动。碰到这种情况我的经验是优先用官方原版DVD确认这台机器能不能正常安装。如果原版也不行那是硬件问题跟定制无关。如果原版能装而定制版不能检查是不是精简Packages时把某些固件或者驱动相关的包删掉了。常见的是linux-firmware这个包不能动删了网卡和显卡驱动直接就废了。确认BIOS启动模式。以UEFI方式启动时定制ISO的处理比BIOS方式多一个坑你必须保证EFI目录和efiboot.img处理正确否则UEFI固件根本不认你的光盘。如果只打算在BIOS模式使用可以在虚拟机里切换固件类型测试。5.5 常见问题速查表问题现象可能原因快速处理启动时找不到ks.cfg文件未复制、路径/大小写错误、Rock Ridge缺失检查isolinux下文件是否存在重建ISO时加-R安装中段找不到安装源ISO卷标与kernal参数不一致用blkid查卷标同步修改isolinux.cfg安装到%post阶段报错脚本中命令路径不完整或chroot环境限制使用完整路径日志重定向排查引导菜单可选但无法进入图形安装内存不足或显卡驱动问题内存调到2GB以上或加xdrivervesa参数UEFI机器无法从定制盘启动EFI引导文件或efiboot.img被破坏恢复原版EFI目录打包时保留EFI相关文件系统装完时区/语言不对Kickstart语句放错位置或没生效检查ks.cfg命令段顺序封装后ISO体积异常大Packages目录没有精简按需删除rpm并用createrepo重新生成元数据这份表基本覆盖了我这几年做定制ISO遇到的大部分疑难杂症。实际上定制ISO的调试过程很像排除法确认引导正常再确认安装源正常再确认Kickstart解析正常每一层都能通过日志和屏幕输出定位问题。6. 进阶玩法从安装盘到企业交付模板6.1 把Kickstart和配置管理联动起来做到这里定制ISO的常规用法已经结束了。但如果你还想再进一步我建议把Kickstart里的%post脚本和配置管理工具联动起来。我见过不少公司把定制ISO当成“基础模板”系统装完后再由Ansible或SaltStack做下一轮精细化配置比如内核参数调优、应用部署、安全基线检查。这样做的好处是职责分离ISO只负责“最小可用系统 初始化环境”业务状态交给配置管理工具去持续维护而不是把所有配置都写死在镜像里。如果你打算这么玩有一个技巧值得注意在%post里预留一个“初始化完成标记”。比如安装结束后写一个唯一文件/opt/customize-version内容记录镜像版本号。这样后续的Ansible或监控系统就能快速识别“这台机器的初始版本是哪一版镜像装的”排查问题的时候能省不少心思。6.2 不同硬件场景的定制策略同一位同事用我当时定制的镜像装物理机结果碰上了RAID卡不识别的问题。原因是他的服务器是较新的型号RAID卡驱动不在CentOS 7.9的内核里。这种情况可以在Kickstart里加%addon com_redhat_kdump --enable之类的选项吗并不能驱动问题得从内核层面解决。我的建议是准备两套镜像一套是“基础兼容版”保持原版内核包完整不精简Packages用于兼容性不确定的机器一套是“业务精简版”在确定的硬件型号池内使用去掉不需要的固件和驱动体积更小、安装更快。不要试图用一套镜像包打天下。6.3 与云环境、容器镜像的配合现在很多新项目直接跑容器很少有人再往虚拟机里装CentOS了。但定制ISO并没有过时——它仍然是裸金属交付、私有云IaaS底层、混合架构里不可替代的一环。就算你天天用DockerCentOS镜像的构建基础层通常也是从官方镜像pull下来的那同样是定制思想的一种变体。反过来Docker等容器技术给了定制ISO新思路运维团队可以先做一个标准的Docker镜像然后在%post阶段把它导出成tar包直接打进系统镜像里安装。这样装出来的机器自带一套容器运行时和基础镜像后续业务容器直接加载即可比在Kickstart里rpm -ivh一堆东西更快更一致。我也是踩过几次坑后才养成了一个习惯每改一次镜像都把新ISO名字加上日期和版本号比如CentOS-7.9-x86_64-custom-v20240615.iso。看似不起眼但当你手头有三个版本的镜像同时流通时你就会感激这个习惯。如果你正准备入坑定制ISO我的建议是从最小场景开始先把原版CentOS 7.9镜像解包只加一个Kickstart文件实现全自动安装跑通一次完整流程再去考虑精简Packages、预装软件、整合配置管理这些进阶功能。路要一步一步走镜像要一版一版出。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进