1. 项目概述:为什么今天还要折腾PXE+Kickstart?
你有没有经历过这样的场景:要在机房一次性部署30台新服务器,每台都得手动插U盘、选语言、配网络、分区、输root密码、装软件包……光是点鼠标就点到手腕酸,更别说中间还可能手抖选错磁盘,把一台刚上架的生产备机给格式化了。我第一次干这事的时候,连续熬了两个通宵,第三天早上盯着屏幕里第17台机器卡在“Installing grub2”那行不动,手指悬在回车键上,心里默念的是“求你别崩”。后来发现,这套流程根本不是人该干的活——它天生就该交给网络和脚本。
PXE(Preboot eXecution Environment)加Kickstart,就是专门来终结这种重复劳动的组合拳。简单说,PXE让机器一开机就从网卡“吸”启动镜像,不依赖本地U盘或光盘;Kickstart则是一份纯文本的安装应答文件,提前写好所有交互答案:分区怎么划、root密码设啥、装哪些包、网络怎么配……机器拿到后全程自动执行,你泡杯茶回来,它已经亮起登录界面了。这不是什么新概念,但直到今天,在私有云扩容、IDC批量上架、信创环境标准化交付这些真实场景里,它依然是最稳、最透明、最可控的无人值守方案。它不依赖SaaS平台,不绑定特定厂商,不走加密通道,所有配置明文可审、步骤可追溯、失败可重放。某高校实验室用这套方案三天内完成86台国产ARM服务器的统一分区+内核参数固化+安全基线预置;某制造企业产线边缘计算节点升级,靠一个DHCP选项就能触发全网设备自动拉取新版系统镜像。它解决的从来不是“能不能装”的问题,而是“能不能装得准、装得齐、装得可审计”的问题。如果你正面临多台同构设备的批量交付,或者需要把装机过程变成一条可版本管理的流水线,那这篇内容就是为你写的——我们不讲原理堆砌,只拆解真实环境中每一步踩过的坑、调过的参数、改过的模板。
2. 整体架构设计与核心组件选型逻辑
2.1 为什么必须是PXE+Kickstart?替代方案的硬伤在哪
有人会问:现在不是有Cobbler、Foreman、RancherOS这些更“高级”的自动化工具吗?确实有,但它们本质是PXE+Kickstart的封装层。就像你不会因为有了微信就扔掉TCP/IP协议栈一样,底层逻辑没变,只是交互方式不同。我试过三种主流路径:
- 纯Web界面工具(如Foreman):部署复杂,依赖Ruby环境、PostgreSQL、Smart Proxy等一堆服务,单节点故障就导致整个装机中断;模板渲染逻辑黑盒,出问题时连日志都难定位;
- 容器化镜像分发(如基于TFTP+HTTP的轻量方案):启动快,但缺乏安装阶段控制力,无法干预分区、内核参数、服务启用等关键环节;
- PXE+Kickstart原生组合:组件少(DHCP+TFTP+HTTP/FTP+DNS可选)、协议标准(RFC 2131/1534/2132)、日志全链路(DHCP租约、TFTP传输、HTTP访问、Anaconda安装日志),出了问题能精准定位到哪一行Kickstart语法写错了。
所以选型逻辑很清晰:要可控,不要便利;要可审计,不要黑盒;要适配老旧硬件,不要强依赖UEFI Secure Boot。PXE工作在BIOS/UEFI固件层,哪怕你手头是2012年的Dell R720,只要网卡支持PXE(绝大多数千兆网卡都支持),它就能联网启动。而Kickstart文件本质就是INI风格的配置文件,用vim都能改,Git能直接做版本管理,CI/CD流水线里一个curl -X POST就能触发新镜像发布。
2.2 四大核心服务如何协同:一张图看懂数据流向
整个流程不是四个服务简单堆在一起,而是有严格时序和依赖关系的管道:
- 客户端开机 → 网卡PXE ROM广播DHCP Discover
- DHCP Server响应:分配IP + 指定next-server(TFTP地址) + 指定bootfile(pxelinux.0或grubx64.efi)
- 客户端用TFTP从next-server下载bootloader → 执行pxelinux.0 → 加载pxelinux.cfg/default配置
- default配置中指定内核(vmlinuz)和初始化内存盘(initrd.img)路径,并传入ks=参数指向Kickstart文件URL
- 内核启动后,Anaconda安装器解析ks=URL,下载Kickstart文件 → 按照其中指令自动执行安装
这里的关键设计点在于解耦:DHCP只管发IP和引导地址,TFTP只管传小文件(bootloader、内核、initrd),HTTP/FTP只管传大文件(Kickstart、软件包仓库)。这样做的好处是——任何一个环节出问题都不影响其他环节。比如TFTP慢了,HTTP照样能快速下载Kickstart;DHCP租约到期了,已启动的安装进程完全不受影响。
提示:很多新手栽在第一步:以为装个DHCP服务就行,结果发现客户端根本收不到Offer。根本原因是PXE需要DHCP的Option 66(TFTP Server Name)和Option 67(Bootfile Name),而普通家用路由器或Windows DHCP服务默认不提供这两个选项。必须用ISC DHCPd或dnsmasq这类支持PXE扩展的DHCP服务。
2.3 服务部署模式选择:一体机还是分布式?
实际部署中,我见过三种典型模式:
- All-in-One单机模式:DHCP/TFTP/HTTP全跑在同一台CentOS 7物理机上。适合测试环境或≤20台设备的小规模部署。优点是配置简单,缺点是单点故障,且TFTP并发能力弱(默认最多4个并发连接);
- 分离式生产模式:DHCP用专用网络设备(如华为S5700交换机内置DHCP Server),TFTP用独立Linux服务器(优化tftp-hpa并发参数),HTTP用Nginx集群。适合IDC级部署,某金融客户用此模式支撑200+节点同时装机;
- 云边协同模式:DHCP/TFTP保留在本地机房(低延迟),Kickstart文件和软件包仓库托管在对象存储(如MinIO),通过HTTP重定向实现跨地域镜像同步。适合多地分支机构统一基线。
我们本次以分离式生产模式为蓝本展开,因为它最贴近真实运维场景:既避免单点瓶颈,又保留完全控制权。所有服务均采用RPM包安装(非容器),确保兼容性;配置文件全部用Ansible模板管理,做到“一次编写,多地部署”。
3. 核心组件部署与配置详解
3.1 DHCP服务:ISC DHCPd的PXE专项配置
ISC DHCPd是事实标准,原因很简单:它对PXE Option的支持最完整。安装命令:
yum install -y dhcp关键配置/etc/dhcp/dhcpd.conf:
# 全局设置 option domain-name "local"; option domain-name-servers 192.168.10.1; default-lease-time 600; max-lease-time 7200; log-facility local7; # PXE专用作用域 subnet 192.168.10.0 netmask 255.255.255.0 { range 192.168.10.100 192.168.10.200; option routers 192.168.10.1; # PXE核心三要素 next-server 192.168.10.10; # TFTP服务器IP(注意:不是DHCP自身IP!) filename "pxelinux.0"; # BIOS模式引导文件 # filename "grubx64.efi"; # UEFI模式引导文件(需额外配置) # 针对UEFI客户端的特殊处理(重要!) if exists user-class and option user-class = "iPXE" { filename "http://192.168.10.10/boot/grub.ipxe"; } }这里有两个极易忽略的细节:
next-server必须是TFTP服务器的真实IP,不能写0.0.0.0或255.255.255.255。我曾因写错这个IP,抓包看到客户端反复发DHCP Request却收不到Offer,查了6小时才发现是DHCP配置里写了next-server 127.0.0.1;- BIOS和UEFI不能共用一个
filename。传统BIOS网卡ROM加载pxelinux.0,而UEFI固件加载grubx64.efi。强行混用会导致一半机器启动失败。解决方案是用class判断客户端类型,但更稳妥的做法是——单独划分UEFI网段,或使用iPXE作为统一引导层(后文详述)。
启动服务并检查:
systemctl enable dhcpd systemctl start dhcpd # 验证端口监听 ss -tuln | grep :67 # 查看DHCP日志(实时) tail -f /var/log/messages | grep dhcpd注意:防火墙必须放行UDP 67端口。CentOS 7默认firewalld规则中,
firewall-cmd --permanent --add-service=dhcp即可,但切记要--reload。我见过三次故障,全是firewalld偷偷拦了DHCP Offer。
3.2 TFTP服务:tftp-hpa的高并发调优
TFTP本身是UDP协议,无连接状态,天然适合小文件传输,但默认配置极其保守。tftp-hpa是Linux下最稳定的实现,安装:
yum install -y tftp-server xinetd关键配置/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 -c -v -p -u nobody disable = no per_source = 11 # 每IP最大并发数(默认11,够用) cps = 100 2 # 每秒最多100连接,超限则暂停2秒 }参数说明:
-s /var/lib/tftpboot:指定根目录,所有文件从此处相对路径读取;-c:允许创建新文件(用于上传日志等,非必需但建议开启);-v:详细日志(调试必备);-p:禁用tftp的“private”模式(避免权限问题);-u nobody:以nobody用户运行,提升安全性。
启动流程:
systemctl enable xinetd systemctl start xinetd # 检查tftp是否监听UDP 69 ss -tuln | grep :69 # 测试本地获取文件 tftp 127.0.0.1 -c get pxelinux.0实操心得:TFTP性能瓶颈不在带宽而在UDP丢包。在千兆网络下,单台tftp-hpa服务器轻松支撑50+并发。但如果遇到大量超时(Transfer timed out),优先检查:
- 客户端网卡驱动是否支持PXE(老Intel千兆卡需更新e1000e驱动);
- 交换机端口是否启用了
spanning-tree portfast(避免生成树协议导致30秒延迟); xinetd的cps参数是否被触发(查看/var/log/messages中是否有xinetd[xxx]: START: tftp from 192.168.10.101但无后续)。
3.3 HTTP服务:Nginx的静态文件高效分发
Kickstart文件、软件包仓库、驱动ISO挂载点,全走HTTP。Nginx比Apache更轻量,静态文件吞吐高。安装:
yum install -y nginx配置/etc/nginx/conf.d/pxe.conf:
server { listen 80; server_name pxe.local; root /var/www/html/pxe; index index.html; # Kickstart文件必须可被GET,且返回正确Content-Type location /ks/ { add_header Content-Type text/plain; expires 1h; } # 软件包仓库目录,禁止列目录 location /centos/ { autoindex off; expires 1d; } # 驱动注入目录(用于RHSA补丁等) location /drivers/ { alias /var/www/html/pxe/drivers/; expires 1h; } }关键点:
add_header Content-Type text/plain:强制Kickstart文件以纯文本返回,否则某些旧版Anaconda会解析失败;autoindex off:绝对禁止软件包仓库目录列表,避免暴露内部结构;- 所有路径用绝对路径,避免Nginx因
root指令拼接错误导致403。
启动并验证:
systemctl enable nginx systemctl start nginx # 测试Kickstart文件可访问 curl -I http://192.168.10.10/ks/centos7-x86_64.cfg # 应返回 HTTP/1.1 200 OK 和 Content-Type: text/plain提示:如果用CentOS Stream或Rocky Linux,记得同步
BaseOS和AppStream两个仓库,否则%packages段里装@^graphical-server-environment会失败。同步命令:reposync -r appstream -p /var/www/html/pxe/centos/8-stream/ --download-metadata。
3.4 引导文件准备:pxelinux.0与grubx64.efi双栈支持
这是最容易出问题的一环。BIOS和UEFI引导文件完全不同,且版本必须严格匹配内核。
BIOS模式(pxelinux.0):
# 安装syslinux包获取引导文件 yum install -y syslinux cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/ cp /usr/share/syslinux/memdisk /var/lib/tftpboot/创建引导菜单/var/lib/tftpboot/pxelinux.cfg/default:
default menu.c32 timeout 600 prompt 0 menu title PXE Boot Menu label centos7-bios menu label Install CentOS 7 (BIOS) kernel centos7/vmlinuz append initrd=centos7/initrd.img inst.ks=http://192.168.10.10/ks/centos7-x86_64.cfg ip=dhcp label rocky8-uefi menu label Install Rocky 8 (UEFI) kernel rocky8/vmlinuz append initrd=rocky8/initrd.img inst.ks=http://192.168.10.10/ks/rocky8-x86_64.cfg ip=dhcp # fallback机制:按Tab键可手动输入 display boot.msg timeout 300UEFI模式(grubx64.efi):
# 从CentOS 7 ISO中提取(UEFI引导必须用ISO里的) mkdir /mnt/iso mount -o loop /root/CentOS-7-x86_64-Minimal-2009.iso /mnt/iso cp /mnt/iso/EFI/BOOT/grubx64.efi /var/lib/tftpboot/ cp /mnt/iso/isolinux/* /var/lib/tftpboot/centos7/ # 内核和initrd umount /mnt/iso创建UEFI菜单/var/lib/tftpboot/grub.cfg:
set timeout=60 menuentry 'Install CentOS 7 (UEFI)' { linuxefi /centos7/vmlinuz inst.ks=http://192.168.10.10/ks/centos7-x86_64.cfg ip=dhcp initrdefi /centos7/initrd.img }双栈统一方案(推荐):用iPXE替代pxelinux.0。iPXE是开源网络引导固件,支持HTTP、HTTPS、iSCSI,且能自动识别BIOS/UEFI。编译方法:
git clone https://github.com/ipxe/ipxe.git cd ipxe/src make bin/ipxe.lkrn EMBED=../ipxe-script.ipxe # ipxe-script.ipxe内容: #!ipxe dhcp ifstat isset ${netboot-url} || set netboot-url http://192.168.10.10/pxe kernel ${netboot-url}/centos7/vmlinuz inst.ks=${netboot-url}/ks/centos7-x86_64.cfg ip=dhcp initrd ${netboot-url}/centos7/initrd.img boot这样只需在DHCP里配置filename "ipxe.lkrn",一套配置通吃所有平台。
4. Kickstart文件深度解析与实战模板
4.1 Kickstart语法核心:从“能跑”到“可靠”的关键字段
Kickstart不是脚本,而是Anaconda安装器的声明式配置。语法错误不会报错,而是静默跳过,导致装完系统发现没分区、没网络、root密码不对。以下是最易出错的10个字段及避坑指南:
| 字段 | 正确写法 | 常见错误 | 后果 |
|---|---|---|---|
url --url="http://192.168.10.10/centos7/" | URL末尾必须有/ | 写成.../centos7(无斜杠) | Anaconda找不到repodata目录,报错Failed to download package |
network --bootproto=dhcp --device=enp0s3 | --device必须是真实网卡名 | 写成eth0(新系统已不用) | 网络配置失败,装机卡在“Configuring network” |
rootpw --iscrypted $6$abc... | 密码必须用grubby --hash-password生成 | 直接写明文rootpw 123456 | 安装失败(安全策略拒绝明文) |
part / --fstype="xfs" --size=20000 --grow | --grow必须配合--size | 单独写--grow | 分区失败,报错Not enough space |
%pre段 | 只能用bash,不能用#!/bin/bash | 加了shebang | Anaconda忽略整个pre段 |
%post --nochroot | 挂载点是/mnt/sysimage | 写成/ | 文件写到TFTP服务器本地,而非目标系统 |
实操验证技巧:用ksvalidator检查语法(来自pykickstart包):
yum install -y pykickstart ksvalidator /var/www/html/pxe/ks/centos7-x86_64.cfg # 输出为空表示通过,否则显示具体行号错误4.2 生产级Kickstart模板:安全基线+驱动注入+日志回传
下面是一个经过200+节点验证的CentOS 7模板,重点解决三个生产痛点:密码安全、驱动缺失、安装失败无日志。
#version=RHEL7 # System authorization information auth --enableshadow --passalgo=sha512 # Use network installation url --url="http://192.168.10.10/centos7/" # Keyboard layouts keyboard --vckeymap=us --xlayouts='us' # System language lang en_US.UTF-8 # Network information network --bootproto=dhcp --device=enp0s3 --onboot=off --ipv6=auto --no-activate network --hostname=localhost.localdomain # Firewall configuration firewall --enabled --ssh # System services services --enabled="chronyd" # System timezone timezone Asia/Shanghai --isUtc --ntpservers=192.168.10.1 # Root password (generated by grubby --hash-password) rootpw --iscrypted $6$abc123...xyz789 # System bootloader configuration bootloader --location=mbr --boot-drive=sda --append="crashkernel=auto rhgb quiet" # Partition clearing information clearpart --none --initlabel # Disk partitioning information part /boot --fstype="xfs" --size=1024 part pv.100000 --size=1 --grow volgroup centos --pesize=4096 pv.100000 logvol / --fstype="xfs" --grow --size=1024 --name=root --vgname=centos logvol swap --fstype="swap" --size=4096 --name=swap --vgname=centos # Reboot after installation reboot --eject %pre # Pre-install script: 检测硬件并注入驱动 echo "=== PRE-INSTALL START ===" > /tmp/ks-pre.log # 获取网卡型号,决定加载哪个驱动 lspci | grep -i ethernet | awk '{print $NF}' > /tmp/nic-model.txt # 下载驱动包(假设已放在HTTP服务器上) curl -s http://192.168.10.10/drivers/elrepo-kmod-7.rpm -o /tmp/kmod.rpm rpm -ivh /tmp/kmod.rpm 2>> /tmp/ks-pre.log echo "=== PRE-INSTALL END ===" >> /tmp/ks-pre.log %end %packages @^minimal-environment kexec-tools epel-release %end %post --nochroot # Post-install script: 配置YUM源、安全加固 echo "=== POST-INSTALL START ===" > /mnt/sysimage/root/ks-post.log # 替换为本地镜像源 cat > /mnt/sysimage/etc/yum.repos.d/local.repo << 'EOF' [base-local] name=Local Base baseurl=http://192.168.10.10/centos7/BaseOS/ gpgcheck=0 enabled=1 EOF # 关闭SELinux(生产环境慎用,此处仅为演示) sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /mnt/sysimage/etc/selinux/config echo "=== POST-INSTALL END ===" >> /mnt/sysimage/root/ks-post.log %end %post # Chroot环境下的post:安装后立即生效的配置 echo "=== CHROOT-POST START ===" > /mnt/sysimage/root/chroot-post.log # 设置chronyd开机自启 systemctl enable chronyd # 禁用firewalld(若用iptables) systemctl disable firewalld systemctl mask firewalld # 注入SSH密钥(从HTTP服务器拉取) curl -s http://192.168.10.10/keys/admin.pub > /mnt/sysimage/root/.ssh/authorized_keys chmod 700 /mnt/sysimage/root/.ssh chmod 600 /mnt/sysimage/root/.ssh/authorized_keys echo "=== CHROOT-POST END ===" >> /mnt/sysimage/root/chroot-post.log %end关键设计点解析:
%pre段驱动注入:在安装前就加载硬件驱动,避免安装过程中因缺少网卡/RAID驱动导致中断;%post --nochroot:在chroot前操作,适合修改YUM源、替换内核参数等全局配置;%post段密钥注入:安装完成后立刻可用SSH免密登录,无需手动配置;- 日志分散记录:每个阶段都有独立日志文件,失败时直接
cat /root/ks-post.log即可定位。
注意:
%post段中curl命令必须用-s(静默)和-f(失败不返回0),否则网络超时会导致整个post失败。我曾因此在凌晨三点收到告警,发现是HTTP服务器临时维护导致密钥拉取失败。
4.3 多版本镜像管理:用符号链接实现零停机更新
当需要升级CentOS 7到8,或切换Rocky Linux时,不能直接覆盖/var/www/html/pxe/centos7/目录,否则正在安装的机器会断连。正确做法是:
# 创建版本化目录 mkdir /var/www/html/pxe/centos7-v20230901 rsync -av /mnt/iso/ /var/www/html/pxe/centos7-v20230901/ # 创建符号链接(原子操作) ln -sfT /var/www/html/pxe/centos7-v20230901 /var/www/html/pxe/centos7Kickstart中的url --url="http://.../centos7/"指向符号链接,更新时只需改链接,瞬间生效。同时保留历史版本,便于回滚。
5. 实操全流程与排错实战记录
5.1 从零开始的15分钟部署:逐条命令验证
以下是在CentOS 7虚拟机上实测的完整流程,每步附验证命令:
# 1. 关闭防火墙(测试环境) systemctl stop firewalld && systemctl disable firewalld # 2. 安装四大服务 yum install -y dhcp tftp-server xinetd nginx syslinux # 3. 配置DHCP(编辑/etc/dhcp/dhcpd.conf,内容见3.1节) systemctl enable dhcpd && systemctl start dhcpd # 4. 配置TFTP(编辑/etc/xinetd.d/tftp,内容见3.2节) systemctl enable xinetd && systemctl start xinetd # 5. 准备TFTP根目录 mkdir -p /var/lib/tftpboot/{centos7,rocky8} cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/ # 6. 配置HTTP(编辑/etc/nginx/conf.d/pxe.conf,内容见3.3节) systemctl enable nginx && systemctl start nginx # 7. 下载CentOS 7最小化ISO并提取内核 wget http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso mkdir /mnt/iso && mount -o loop CentOS-7-x86_64-Minimal-2009.iso /mnt/iso cp /mnt/iso/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos7/ umount /mnt/iso # 8. 创建Kickstart文件 mkdir -p /var/www/html/pxe/ks cat > /var/www/html/pxe/ks/centos7-x86_64.cfg << 'EOF' #version=RHEL7 url --url="http://192.168.10.10/centos7/" network --bootproto=dhcp --device=enp0s3 rootpw --iscrypted $6$abc... firewall --disabled reboot %packages @^minimal-environment %end EOF # 9. 生成密码哈希(用真实密码替换) grubby --hash-password "MySecurePass123" # 输出$6$...字符串 # 10. 启动所有服务 systemctl restart dhcpd xinetd nginx验证顺序(缺一不可):
ping 192.168.10.10—— 网络连通性;curl -I http://192.168.10.10/ks/centos7-x86_64.cfg—— Kickstart可访问;tftp 192.168.10.10 -c get pxelinux.0—— TFTP正常;dhcpd -t—— DHCP配置语法正确;ss -tuln | grep -E ':67|:69|:80'—— 三大端口监听中。
5.2 典型故障排查速查表
| 现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
| 客户端PXE-E53: No boot filename received | DHCP未返回Option 67 | tcpdump -i eth0 port 67 -w dhcp.pcap | 检查/etc/dhcp/dhcpd.conf中filename是否拼写错误 |
| 客户端TFTP Error 0: Permission denied | TFTP根目录权限错误 | ls -ld /var/lib/tftpboot | chown -R root:root /var/lib/tftpboot && chmod -R 755 /var/lib/tftpboot |
| 安装卡在“Starting installer…” | Kickstart URL无法访问 | 在客户端按Ctrl+Alt+F2切到shell,执行curl -v http://192.168.10.10/ks/... | 检查HTTP服务是否运行,URL路径是否含多余空格 |
分区失败:Not enough space on disk | part语句中--grow未配--size | 查看/tmp/ks-script-*.log | 修改Kickstart,part / --size=1024 --grow |
| 安装后无网络 | network --device=指定的网卡名不存在 | ip link show | 改用network --bootproto=dhcp --device=link(自动选第一个UP的网卡) |
| root密码无效 | 密码未用--iscrypted | 查看/root/install.log | 用grubby --hash-password重新生成 |
独家排错技巧:
- 抓包三连:在DHCP服务器上执行
tcpdump -i eth0 port 67 or port 69 or port 80 -w pxe-debug.pcap,用Wireshark分析全流程; - Anaconda日志:安装过程中按
Ctrl+Alt+F2进入shell,日志在/tmp/下,关键文件:anaconda.log(主流程)、program.log(命令执行)、storage.log(分区); - TFTP调试:在TFTP服务器上开
tail -f /var/log/messages | grep tftp,看客户端请求了哪些文件。
5.3 性能压测与稳定性验证
在某IDC环境中,我们用20台物理机同时发起PXE启动,结果如下:
| 指标 | 数值 | 说明 |
|---|---|---|
| DHCP Offer平均延迟 | 12ms | 低于交换机生成树收敛时间(30s),无影响 |
| TFTP内核下载耗时(100MB) | 8.2s/台 | 千兆网络理论极限125MB/s,实测98MB/s |
| Kickstart解析+分区+基础包安装 | 3m42s/台 | 从启动到登录界面,含20GB XFS格式化 |
| 并发失败率 | 0% | 200次连续测试,全部成功 |
瓶颈分析:
- CPU:TFTP进程占用<15%,DHCP<5%,Nginx<10%,远未到瓶颈;
- 磁盘IO:
iostat -x 1显示%util峰值32%,SSD完全富余; - 真正瓶颈是网络:交换机端口聚合后,20台并发时上行链路达1.8Gbps,接近万兆交换机背板带宽。
解决方案:将TFTP和HTTP服务部署在不同服务器,用bond0做链路聚合,实测并发能力提升至80+节点。
6. 进阶应用与安全加固实践
6.1 基于MAC地址的差异化部署:同一PXE服务装不同系统
需求:机房有20台Dell服务器装CentOS,10台HPE装Rocky Linux,全部走同一套PXE。方案是利用DHCP的host声明绑定MAC地址:
# /etc/dhcp/dhcpd.conf 片段 host dell-r740-01 { hardware ethernet 00:11:22:33:44:55; fixed-address 192.168.10.101; option host-name "dell-r740-01"; filename "pxelinux.0"; next-server 192.168.10.10; } host hpe-dl380-01 { hardware ethernet aa:bb:cc:dd:ee:ff; fixed-address 192.168.10.102; option host-name "hpe-dl380-01"; filename "grubx64.efi"; next-server 192.168.10.10; }然后在pxelinux.cfg/default中用label区分:
label dell-centos7 kernel centos7/vmlinuz append initrd=centos7/initrd.img inst.ks=http://192.168