PXE+Kickstart实现CentOS无人值守批量部署 1. 项目背景与核心价值在企业IT运维和机房管理中操作系统部署一直是个高频且耗时的操作。传统的光驱/U盘安装方式在面对几十上百台服务器时显得力不从心而PXEKickstart的组合恰好能解决这个痛点。我最近在VMware环境中搭建了一套完整的无人值守部署系统使用物理路由器作为DHCP服务器实现了CentOS系统的全自动安装。这套方案的核心优势在于完全摆脱物理介质依赖新服务器上架后只需接通网线批量部署效率提升10倍以上50台服务器可在1小时内完成系统安装配置标准化程度高避免人工安装导致的配置差异特别适合IDC机房、企业IT部门等需要频繁部署系统的场景2. 环境架构设计2.1 整体拓扑结构在我的实验环境中主要包含以下组件物理路由器DHCP Server ↓ VMware ESXi虚拟化平台 ├── PXE ServerCentOS 7 │ ├── TFTP服务 │ ├── HTTP服务 │ └── Kickstart应答文件 └── 待安装的裸金属虚拟机2.2 关键服务分工ProxyDHCP由物理路由器提供负责响应PXE客户端的DHCP请求TFTP传输PXE引导文件pxelinux.0、内核、initrd等HTTP提供操作系统安装源和Kickstart文件Kickstart自动化安装的应答配置文件注意传统方案通常将DHCP和TFTP放在同一台服务器但在企业环境中往往需要复用现有网络设备。本方案特意采用物理路由器做DHCP更贴近生产环境实际情况。3. 服务端详细配置3.1 TFTP服务搭建首先在CentOS服务器上安装并配置tftp-serveryum install -y tftp-server xinetd syslinux cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ mkdir -p /var/lib/tftpboot/pxelinux.cfg关键配置文件/etc/xinetd.d/tftp内容service tftp { socket_type dgram protocol udp wait yes user root server /usr/sbin/in.tftpd server_args -s /var/lib/tftpboot disable no per_source 11 cps 100 2 flags IPv4 }3.2 HTTP服务配置使用Apache提供安装镜像和Kickstart文件yum install -y httpd mkdir -p /var/www/html/centos/7/os/x86_64 mount CentOS-7-x86_64-DVD-2009.iso /var/www/html/centos/7/os/x86_64创建Kickstart文件/var/www/html/ks.cfg关键内容示例install url --urlhttp://192.168.1.100/centos/7/os/x86_64 lang en_US.UTF-8 keyboard us timezone Asia/Shanghai rootpw --plaintext yourpassword clearpart --all --initlabel autopart reboot %packages ^minimal %end3.3 PXE引导菜单配置创建/var/lib/tftpboot/pxelinux.cfg/default文件default menu.c32 prompt 0 timeout 30 label linux menu label ^Install CentOS 7 kernel centos7/vmlinuz append initrdcentos7/initrd.img kshttp://192.168.1.100/ks.cfg将内核文件复制到TFTP目录cp /var/www/html/centos/7/os/x86_64/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/centos7/4. 物理路由器DHCP配置以常见的Cisco路由器为例关键配置如下ip dhcp pool PXE_POOL network 192.168.1.0 255.255.255.0 default-router 192.168.1.1 dns-server 8.8.8.8 option 66 ip 192.168.1.100 # TFTP服务器IP option 67 ascii pxelinux.0 # 引导文件名如果是家用级路由器如TP-Link需要在DHCP设置中添加Option 66: TFTP服务器IPOption 67: pxelinux.05. VMware环境特殊配置5.1 虚拟机网络设置创建VMware标准交换机端口组设置为中继模式确保虚拟机的网络适配器选择VMXNET3以获得最佳性能在虚拟机设置中启用EFI引导如果需要5.2 常见问题排查现象1客户端获取到IP但无法加载引导文件检查防火墙是否放行UDP 69端口测试从客户端手动获取文件tftp 192.168.1.100 -c get pxelinux.0现象2出现EFI PXE 0 for IPv4 boot failed确认虚拟机是否设置为EFI引导在TFTP目录添加EFI引导文件shim.efi和grubx64.efi现象3Kickstart文件无法下载检查HTTP服务是否正常运行在客户端测试curl http://192.168.1.100/ks.cfg6. 生产环境优化建议经过多次实践我总结出以下优化点镜像缓存对于多台同时安装的情况可以在本地搭建镜像仓库createrepo /var/www/html/centos/7/os/x86_64Kickstart模板化使用变量实现动态配置rootpw --iscrypted $6$salt$hashedpassword timezone ${TIMEZONE}安全加固限制TFTP目录访问权限Kickstart中使用加密密码配置HTTP Basic认证日志收集在Kickstart中添加post脚本收集安装日志%post curl -X POST http://logserver/collect -d /root/install.log %end7. 进阶应用场景7.1 多系统选择菜单修改default文件实现多系统选择label centos7 menu label ^Install CentOS 7 kernel centos7/vmlinuz append initrdcentos7/initrd.img kshttp://192.168.1.100/ks/centos7.cfg label ubuntu2004 menu label Install Ubuntu 20.04 kernel ubuntu2004/linux append initrdubuntu2004/initrd.gz autoinstall dsnocloud-net;shttp://192.168.1.100/ubuntu/7.2 硬件指纹识别在Kickstart中根据MAC地址差异化配置%pre if [ ifconfig eth0 | grep -oE ([[:xdigit:]]{2}:){5}[[:xdigit:]]{2} 00:50:56:12:34:56 ]; then echo network --deviceeth0 --bootprotostatic --ip192.168.1.50 --netmask255.255.255.0 --gateway192.168.1.1 /tmp/network-cfg fi %end7.3 与配置管理工具集成在post阶段自动加入Ansible管理%post --nochroot yum install -y ansible cat /mnt/sysroot/etc/ansible/hosts EOF [new_nodes] ${IP_ADDRESS} EOF %end这套系统在实际使用中表现非常稳定特别是在批量部署测试集群时节省了大量重复劳动时间。一个有趣的发现是通过优化TFTP块大小blksize 1468可以将传输效率提升30%以上。具体方法是在pxelinux.cfg/default中添加append initrdcentos7/initrd.img kshttp://192.168.1.100/ks.cfg tftp.blksize1468对于需要频繁重建环境的开发团队这种自动化部署方案简直就是福音。从最初的单台手动安装到现在50台服务器同时部署运维效率的提升是实实在在看得见的。