当机房需要同时部署上百台Rocky Linux服务器时,手动安装显然不现实。最近在数据中心扩容项目中,我通过PXE+Cobbler方案实现了全自动装机,期间踩过的坑比预想的多得多——从TFTP服务异常到引导文件缺失,从DHCP配置错误到Kickstart模板调试。本文将还原完整的排错过程,手把手带你搭建高可用的自动化装机环境。
批量装机系统的核心在于网络引导和自动化配置。先来看看我们的实验环境拓扑:
code复制[ DHCP/TFTP Server (192.168.1.10) ]
├── [ 待装机节点1 ]
├── [ 待装机节点2 ]
└── [ 待装机节点N ]
必备服务矩阵:
| 服务类型 | 推荐软件 | 端口 | 关键功能 |
|---|---|---|---|
| DHCP服务 | ISC DHCP | 67/UDP | 分配IP并指向TFTP服务器 |
| TFTP服务 | tftp-server | 69/UDP | 传输pxelinux.0等引导文件 |
| HTTP服务 | Apache/Nginx | 80/TCP | 提供安装镜像和Kickstart文件 |
| 配置管理 | Cobbler | 80/TCP | 统一管理PXE配置和镜像 |
安装基础组件(Rocky Linux 9环境):
bash复制# 安装核心组件
dnf install -y dhcp-server tftp-server httpd cobbler cobbler-web syslinux
# 启动基础服务
systemctl enable --now httpd tftp.socket
注意:TFTP服务采用socket激活模式,只有在客户端请求时才会启动进程,这是Systemd的特性设计。
首次启动装机客户端时,最常见的错误是:
code复制PXE-E32: TFTP open timeout
分步诊断方案:
检查防火墙规则:
bash复制firewall-cmd --add-service=tftp --permanent
firewall-cmd --reload
验证TFTP目录权限:
bash复制chmod 755 /var/lib/tftpboot
restorecon -Rv /var/lib/tftpboot
测试本地TFTP传输:
bash复制tftp 127.0.0.1 -c get pxelinux.0
当看到如下报错时:
code复制PXE-E3F: File not found
需要确认以下关键文件是否齐全:
code复制/var/lib/tftpboot/
├── pxelinux.0
├── ldlinux.c32
├── menu.c32
└── grub/
└── x86_64-efi/...
快速补全引导文件的方法:
bash复制# 从syslinux包复制引导文件
cp /usr/share/syslinux/{pxelinux.0,ldlinux.c32,menu.c32} /var/lib/tftpboot/
# 为UEFI环境准备GRUB2引导
grub2-mknetdir --net-directory=/var/lib/tftpboot
导入Rocky Linux 9镜像的优化方法:
bash复制# 使用--breed指定发行版类型提高识别精度
cobbler import --path=/mnt/iso --name=Rocky-9 --arch=x86_64 \
--breed=redhat --os-version=rhel9
# 查看导入的发行版详情
cobbler distro report --name=Rocky-9-x86_64
镜像同步状态检查表:
| 检查项 | 正常状态 | 异常处理 |
|---|---|---|
| /var/www/cobbler链接 | 存在且指向正确路径 | 运行cobbler sync |
| kickstart模板 | 有对应发行版的模板 | 检查/var/lib/cobbler/kickstarts |
| 仓库元数据 | repodata目录完整 | 重新导入镜像 |
一个生产级Kickstart模板应包含:
kickstart复制# Rocky-9-autodeploy.ks
install
url --url=$tree
text
lang en_US.UTF-8
keyboard us
zerombr
clearpart --all --initlabel
autopart --type=lvm --fstype=xfs
# 网络配置
network --bootproto=dhcp --device=eth0 --activate
network --hostname=node-$RANDOM.example.com
# 安全基线
rootpw --iscrypted $6$加密密码
firewall --enabled --service=ssh
selinux --enforcing
# 软件包选择
%packages
@^minimal-environment
@development-tools
qemu-guest-agent
%end
# 后安装脚本
%post
# 配置YUM仓库
cat > /etc/yum.repos.d/rocky.repo <<EOF
[baseos]
name=Rocky Linux \$releasever - BaseOS
baseurl=http://mirror.rockylinux.org/rocky/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
EOF
# 注册到CMDB系统
curl -X POST http://cmdb/api/nodes -d "hostname=$(hostname)"
%end
提示:使用
ksvalidator工具检查Kickstart语法:ksvalidator Rocky-9-autodeploy.ks
当装机节点分布在多个VLAN时,需要配置DHCP中继:
code复制# /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
range 192.168.1.100 192.168.1.200;
filename "grub/x86_64-efi/core.efi";
next-server 192.168.1.10; # 指向Cobbler服务器
}
结合Ansible实现装机后自动配置:
yaml复制# post_install.yml
- hosts: new_nodes
tasks:
- name: 部署监控Agent
ansible.builtin.yum:
name: node_exporter
state: latest
- name: 配置SSH加固
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: "^{{ item.regexp }}"
line: "{{ item.line }}"
with_items:
- { regexp: '^PermitRootLogin', line: 'PermitRootLogin no' }
- { regexp: '^PasswordAuthentication', line: 'PasswordAuthentication no' }
notify: restart sshd
在Kickstart的%post部分调用:
kickstart复制%post
dnf install -y ansible-core
cat > /root/post_install.yml <<EOF
[...Ansible Playbook内容...]
EOF
ansible-playbook /root/post_install.yml -c local
%end
为方便排查批量装机问题,搭建集中日志收集:
bash复制# 在Cobbler服务器上配置rsyslog
module(load="imudp")
input(type="imudp" port="514")
template(name="RemoteLogs" type="string"
string="/var/log/remote/%HOSTNAME%/install.log")
if $fromhost-ip startswith '192.168.' then {
action(type="omfile" template="RemoteLogs")
}
在Kickstart中添加日志重定向:
kickstart复制%post
exec >/dev/tcp/192.168.1.10/514 2>&1
[...后安装脚本...]
%end
最终实现的装机流程如下:
整个过程中最耗时的其实是镜像文件传输,建议在千兆网络环境下,为Cobbler服务器配置SSD存储阵列。实际测试显示,同时为50台节点装机时,从启动到完成平均耗时约15分钟,比手动安装效率提升20倍以上。