PXE+Kickstart实现CentOS无人值守批量部署
1. 项目背景与核心价值
在企业IT运维和机房管理中,操作系统部署一直是个高频且耗时的操作。传统的光驱/U盘安装方式在面对几十上百台服务器时显得力不从心,而PXE+Kickstart的组合恰好能解决这个痛点。我最近在VMware环境中搭建了一套完整的无人值守部署系统,使用物理路由器作为DHCP服务器,实现了CentOS系统的全自动安装。
这套方案的核心优势在于:
- 完全摆脱物理介质依赖,新服务器上架后只需接通网线
- 批量部署效率提升10倍以上,50台服务器可在1小时内完成系统安装
- 配置标准化程度高,避免人工安装导致的配置差异
- 特别适合IDC机房、企业IT部门等需要频繁部署系统的场景
2. 环境架构设计
2.1 整体拓扑结构
在我的实验环境中,主要包含以下组件:
物理路由器(DHCP Server) ↓ VMware ESXi虚拟化平台 ├── PXE Server(CentOS 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-server:
yum 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 --url=http://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 initrd=centos7/initrd.img ks=http://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服务器IP
- Option 67: "pxelinux.0"
5. 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
现象3:Kickstart文件无法下载
- 检查HTTP服务是否正常运行
- 在客户端测试:
curl http://192.168.1.100/ks.cfg
6. 生产环境优化建议
经过多次实践,我总结出以下优化点:
- 镜像缓存:对于多台同时安装的情况,可以在本地搭建镜像仓库:
createrepo /var/www/html/centos/7/os/x86_64- Kickstart模板化:使用变量实现动态配置:
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 initrd=centos7/initrd.img ks=http://192.168.1.100/ks/centos7.cfg label ubuntu2004 menu label Install Ubuntu 20.04 kernel ubuntu2004/linux append initrd=ubuntu2004/initrd.gz autoinstall ds=nocloud-net;s=http://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 --device=eth0 --bootproto=static --ip=192.168.1.50 --netmask=255.255.255.0 --gateway=192.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 initrd=centos7/initrd.img ks=http://192.168.1.100/ks.cfg tftp.blksize=1468对于需要频繁重建环境的开发团队,这种自动化部署方案简直就是福音。从最初的单台手动安装到现在50台服务器同时部署,运维效率的提升是实实在在看得见的。