1. 为什么需要PXE+Kickstart批量装机?
每次给机房新到货的50台服务器手动安装系统是什么体验?我曾在某次项目交付时,带着U盘和光驱蹲在机房里折腾了整整两天。直到发现PXE+Kickstart这个黄金组合,才明白批量装机原来可以如此优雅。
PXE(Preboot eXecution Environment)允许裸机通过网络启动操作系统安装程序,而Kickstart则用一份配置文件实现无人值守的全自动安装。这对组合特别适合:
- 数据中心大批量服务器部署
- 实验室频繁重装测试环境
- 需要统一系统配置的企业场景
以我最近实施的某金融项目为例,200台戴尔PowerEdge服务器从开箱到交付使用,包含分区规划、软件包选择和基础配置在内的完整系统部署,仅需2小时即可全部完成——这还包含了硬件自检的时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础环境搭建要点
2.1 网络拓扑规划
典型的PXE装机网络需要以下组件:
code复制[交换机]
|
[DHCP/TFTP Server]----[待装机客户端]
|
[HTTP/NFS存储源]
关键配置参数示例(以CentOS 7为例):
bash复制# DHCP配置片段(/etc/dhcp/dhcpd.conf)
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
option domain-name-servers 8.8.8.8;
next-server 192.168.1.10; # TFTP服务器地址
filename "pxelinux.0"; # 引导文件名称
}
注意:生产环境务必确保PXE网络与其他业务网络隔离,我曾见过因DHCP范围设置错误导致整个办公网瘫痪的案例。
2.2 服务组件安装
必备服务矩阵:
| 服务类型 | 推荐软件 | 配置文件位置 | 关键功能 |
|---|---|---|---|
| DHCP | isc-dhcp-server | /etc/dhcp/dhcpd.conf | IP地址分配/引导指向 |
| TFTP | tftp-hpa | /etc/default/tftpd-hpa | 传输引导文件 |
| HTTP | apache2 | /etc/httpd/conf/httpd.conf | 提供安装镜像访问 |
| Kickstart | system-config-kickstart | /var/www/html/ks.cfg | 无人值守安装配置 |
安装命令示例:
bash复制yum install -y dhcp tftp-server httpd syslinux system-config-kickstart
3. 引导文件配置详解
3.1 PXE引导链解析
完整的启动流程如下:
- 客户端PXE ROM发起DHCP请求
- 获取IP并下载pxelinux.0引导程序
- 加载vesamenu.c32图形菜单模块
- 解析pxelinux.cfg/default配置文件
- 根据选择加载内核(vmlinuz)和initrd.img
典型目录结构:
code复制/var/lib/tftpboot/
├── pxelinux.0
├── pxelinux.cfg
│ └── default
├── vesamenu.c32
├── vmlinuz
└── initrd.img
3.2 菜单文件定制
高级配置示例(支持多系统选择):
bash复制default vesamenu.c32
timeout 600
label CentOS7
menu label ^Install CentOS 7
kernel CentOS7/vmlinuz
append initrd=CentOS7/initrd.img ks=http://192.168.1.10/ks/centos7.cfg
label Ubuntu2004
menu label Install ^Ubuntu 20.04
kernel Ubuntu2004/linux
append initrd=Ubuntu2004/initrd.gz auto=true url=http://192.168.1.10/ks/ubuntu2004.cfg
实战技巧:使用
memtest86+内存测试选项可以在装机前快速检测硬件稳定性,避免后续系统异常。
4. Kickstart配置文件精讲
4.1 基础语法结构
通过system-config-kickstart生成的模板包含:
bash复制#version=DEVEL
install
url --url="http://192.168.1.10/centos7"
lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai
auth --enableshadow --passalgo=sha512
rootpw --plaintext mypassword # 生产环境应使用iscrypted
分区方案示例(适合数据库服务器):
bash复制clearpart --all --initlabel
part /boot --fstype="xfs" --size=1024
part swap --size=32768
part / --fstype="xfs" --size=102400
part /var --fstype="xfs" --size=204800
part /data --fstype="xfs" --grow --size=1
4.2 高级功能实现
软件包选择策略:
bash复制%packages
@^minimal
@core
kexec-tools
vim-enhanced
-alsa-*
%end
后安装脚本示例(自动配置网络监控):
bash复制%post
#!/bin/bash
# 注册到CMDB系统
curl -X POST http://cmdb/api/v1/hosts -d '{"hostname":"`hostname`","ip":"`hostname -I`"}'
# 安装zabbix agent
yum install -y zabbix-agent
sed -i 's/Server=127.0.0.1/Server=192.168.1.50/' /etc/zabbix/zabbix_agentd.conf
systemctl enable --now zabbix-agent
%end
5. 实际部署中的疑难排解
5.1 常见故障代码分析
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| PXE-E53: No boot filename | DHCP配置缺少filename选项 | 检查dhcpd.conf中的next-server |
| TFTP timeout | 防火墙阻止69端口 | iptables -I INPUT -p udp --dport 69 -j ACCEPT |
| Kernel panic | initrd与内核版本不匹配 | 重新拷贝匹配的initrd.img |
| KS文件未找到 | HTTP服务未运行 | systemctl restart httpd |
5.2 性能优化实践
- TFTP调优:
bash复制# /etc/default/tftpd-hpa
TFTP_OPTIONS="--secure --blocksize 1468"
增大blocksize可提升传输效率,但需要交换机支持Jumbo Frame
- HTTP镜像缓存:
bash复制mount --bind /mnt/centos7 /var/www/html/centos7
echo "/mnt/centos7 /var/www/html/centos7 none bind 0 0" >> /etc/fstab
使用内存盘加速读取:
bash复制mount -t tmpfs -o size=2G tmpfs /mnt/centos7
- 并行装机控制:
通过DHCP地址池限制并发数量,避免带宽争抢:
bash复制# 分批次装机策略
for i in {1..50}; do
ipmitool -H 192.168.1.$i -U admin -P password chassis power reset
sleep 30 # 间隔启动
done
6. 企业级扩展方案
6.1 与CMDB系统集成
通过Kickstart的%post阶段调用API实现:
bash复制%post --interpreter=/usr/bin/python3
import requests
import socket
hostname = socket.gethostname()
ip = [(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close())
for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]
requests.post('https://cmdb.example.com/api/v1/assets',
json={'hostname': hostname, 'ip': ip},
auth=('apiuser', 'password'))
%end
6.2 安全加固方案
- 证书校验:
bash复制url --url=https://mirror.example.com/centos7 --noverifyssl
- 密码加密:
bash复制openssl passwd -6 'MySecurePassword'
# 在ks.cfg中使用:
rootpw --iscrypted $6$rounds=656000$salt$hashed_value
- 网络隔离:
bash复制# 使用VLAN隔离PXE网络
vconfig add eth0 100
ifconfig eth0.100 192.168.100.1/24 up
7. 不同场景下的配置模板
7.1 开发测试环境
bash复制# ks-dev.cfg
install
url --url="http://mirror/dev/centos7"
lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai
rootpw dev@123
firewall --disabled
selinux --permissive
reboot
%packages
@^developer
git
docker-ce
python3-pip
%end
7.2 生产数据库服务器
bash复制# ks-db.cfg
install
url --url="http://mirror/prod/centos7"
lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai
rootpw --iscrypted $6$...
firewall --enabled --service=ssh
selinux --enforcing
part /boot --fstype="xfs" --size=1024
part swap --size=32768
part / --fstype="xfs" --size=102400
part /var --fstype="xfs" --size=204800
part /data --fstype="xfs" --grow --size=1
%packages
@^minimal
@core
mariadb-server
percona-xtrabackup
%end
%post
#!/bin/bash
# 优化内核参数
echo "vm.swappiness = 1" >> /etc/sysctl.conf
# 配置数据库目录
mkdir -p /data/mysql
chown mysql:mysql /data/mysql
%end
在实际部署中,我发现通过将KS文件按功能拆分为基础模板和模块化片段(如storage.ks、packages.ks),再使用%include指令组合,可以大幅提升配置复用率。例如:
bash复制# base.ks
install
url --url="http://mirror/centos7"
%include /ks/common/lang.ks
%include /ks/common/auth.ks
# 根据不同角色包含不同配置
%include /ks/roles/%ROLE%.ks
这种架构下,只需在DHCP中传递ROLE参数即可实现差异化装机:
bash复制append initrd=initrd.img ks=http://192.168.1.10/ks/base.ks ksdevice=eth0 ROLE=web_server
