4. 安装介质与自动化部署
当RHEL服务器规模从几台扩展到几十台、上百台时,逐台插入ISO、点击图形安装界面就完全不可接受了。标准化建设的核心诉求之一,就是让“装系统”这件事变成可重复、可审计、可批量执行的工程动作。本节围绕三条主线展开:Kickstart应答文件如何描述一台机器的最终形态,PXE如何让裸机在没有本地介质的情况下自动找到安装源,以及镜像定制如何把企业自己的软件基线固化进安装介质。
Kickstart:把安装过程写成一份可版本化的“机器配方”
Kickstart的本质是一份声明式应答文件,安装程序读取它之后不再向人提问,而是按指令完成分区、网络、软件包、用户、服务等配置。它通常由四段构成:命令段(如 lang、keyboard、timezone、rootpw、network、firewall、selinux)、分区段(part/logvol/raid)、软件包段(%packages)和脚本段(%pre、%post、%onerror)。
下面是一份面向企业内网应用服务器的示例片段,参数均为教学示例,实际需按环境调整:
#version=RHEL9
text
lang zh_CN.UTF-8
keyboard --vckeymap=us
timezone Asia/Shanghai --utc
network --bootproto=dhcp --device=link --activate
rootpw --iscrypted $6$example$ReplaceWithRealHash
firewall --enabled --service=ssh
selinux --enforcing
services --enabled=sshd,chronyd,rsyslog
ignoredisk --only-use=sda
zerombr
clearpart --all --initlabel
part /boot --fstype=xfs --size=1024
part pv.01 --size=1 --grow
volgroup vg0 pv.01
logvol / --fstype=xfs --name=lv_root --vgname=vg0 --size=20480
logvol /var --fstype=xfs --name=lv_var --vgname=vg0 --size=30720
logvol swap --fstype=swap --name=lv_swap --vgname=vg0 --size=8192
%packages
@^minimal-environment
@standard
chrony
vim-enhanced
%end
%post --log=/root/ks-post.log
systemctl enable chronyd
echo "nameserver 10.0.0.53" > /etc/resolv.conf
%end
几个容易踩坑的点:rootpw --iscrypted 后面必须是真实哈希,可用 openssl passwd -6 生成;ignoredisk --only-use=sda 能防止误写到U盘或数据盘;clearpart --all --initlabel 会清空磁盘,生产环境务必确认设备名。分区段建议用LVM,把 /var 单独切出来,避免日志或容器数据撑爆根分区。
Kickstart文件写好后,可以用 ksvalidator 做语法校验,再通过 ksflatten 把 %include 的片段合并成单文件,便于分发和审计。文件本身应纳入Git管理,每次变更都有记录,这样“某台机器为什么这样分区”是可追溯的。
PXE:让裸机自己找到安装源
PXE(Preboot Execution Environment)解决的是“机器还没系统,怎么把安装程序送进去”的问题。它的链路是:网卡固件通过DHCP拿到IP和引导文件名,再用TFTP把引导程序(如 grubx64.efi 或 pxelinux.0)拉下来,引导程序加载内核和initrd,内核启动后通过HTTP/NFS/FTP去取安装树和Kickstart文件。
因此PXE环境至少需要四个服务协同:DHCP负责地址与引导参数,TFTP负责传输引导文件,HTTP负责提供安装树和ks文件,DNS负责名称解析。DHCP配置里关键的是 next-server 和 filename:
subnet 10.0.10.0 netmask 255.255.255.0 {
range 10.0.10.100 10.0.10.200;
option routers 10.0.10.1;
next-server 10.0.10.5;
filename "grubx64.efi";
}
引导菜单里通过内核参数把Kickstart位置告诉安装程序,例如 inst.ks=http://10.0.10.5/ks/app-server.ks,同时可加 inst.repo=http://10.0.10.5/rhel9/BaseOS 指定安装源。若同一批机器需要不同配置,可以在DHCP里按MAC分配不同 filename,或在ks里用 %pre 脚本根据网卡MAC、序列号判断机型,动态选择分区和软件包。
镜像定制:把企业基线固化进ISO
即使有Kickstart,每次安装仍要从网络仓库拉取大量软件包,内网带宽和安装时长都不理想。镜像定制就是把“最小化系统 + 企业必备软件 + 安全基线配置”预先合成一个ISO,安装时直接本地读取,速度更快、结果更一致。
RHEL 9常用的工具是 mkksiso(来自lorax包),它可以在原ISO基础上注入Kickstart文件、替换引导参数,甚至嵌入额外RPM。典型做法是:先准备一份ks文件,再执行
mkksiso --ks /root/ks/app-server.ks \
--cmdline "inst.ks=cdrom:/ks/app-server.ks" \
rhel-9.4-x86_64-dvd.iso \
rhel-9.4-appserver-custom.iso
生成的ISO既可以直接刻盘/U盘安装,也可以放到PXE的HTTP目录里作为安装源。若需要预装额外软件,可把RPM放进一个本地仓库目录,在ks的 %packages 中引用,或在 %post 里用 dnf install 从内网仓库安装。定制镜像应记录基线版本、包含的软件包清单和构建时间,作为交付物的一部分。
无人值守安装的完整链路
把上述三部分串起来,一次无人值守安装的完整过程如下:裸机上电 → 网卡PXE引导 → DHCP分配地址并指定引导文件 → TFTP传输引导程序 → 加载内核与initrd → 内核通过HTTP获取Kickstart → 安装程序按ks分区、装包、执行%post → 首次重启进入系统 → 由配置管理工具接管后续配置。整个过程无需人工干预,一台机器从加电到可用通常在10~20分钟内完成。
图中左侧的“镜像定制”是可选增强项:如果内网带宽充足、软件包不多,直接用官方ISO加HTTP仓库即可;如果要求快速交付且网络受限,则把Kickstart和常用RPM预先注入ISO,安装时从本地读取,能显著缩短时间。
落地时的几个关键判断
第一,Kickstart文件必须与RHEL版本匹配。RHEL 7/8/9在分区语法、网络配置、软件包组名称上都有差异,跨版本复用前先用 ksvalidator 校验。第二,PXE引导文件要区分BIOS和UEFI:传统BIOS用 pxelinux.0,UEFI用 grubx64.efi,DHCP的 filename 要按客户端架构分别下发,否则会出现“部分机器能装、部分机器卡在引导”的现象。第三,%post 脚本里不要做耗时过长的操作,否则安装程序会等待超时;复杂配置应交给Ansible等工具在首次启动后执行。第四,所有Kickstart、PXE配置、镜像构建脚本都应纳入版本控制,并保留每次构建的软件包清单,这样才能在出现安全事件时快速定位“哪一批机器用了哪个基线”。