PXE本身并不知道该安装哪些服务器,它只是网络启动的“引路人”,真正决定“哪台机器装什么系统”的是服务端根据客户端MAC地址、IP或UUID匹配出的引导配置文件和无人值守安装参数。
有时候一接网线,机器就能直接进入安装界面,好像PXE认识这台机器;换一台机器,又可能是完全不同的安装菜单,这种“认人”能力其实是服务端的功劳,PXE只负责装糊涂。
PXE的职责边界
PXE的英文全称是Preboot eXecution Environment,它解决的是更底层的问题:在服务器没有操作系统、磁盘空空如也时,如何通过网络把内核拉起来。
PXE不负责思考“这台机器应该装CentOS还是Rocky Linux”,也不负责判断“这是测试机还是生产机”,它只做三件事:
- 从DHCP服务器拿到自己的IP地址和引导文件位置
- 通过TFTP协议下载引导程序
- 加载引导程序并执行,引导程序再按既定规则读取配置文件
整个过程中,PXE每次都按照同一套流程来,完全靠服务端“分配角色”,把PXE比作快递员,他不知道自己送的是合同还是文件,只管按面单上的地址投递,而面单内容由发货方填写。
PXE认人的三个关键步骤
第一步:DHCP先给个“临时户口”
当一台裸机开机,网卡会向整个局域网广播一段DHCP请求,PXE的标准做法是在DHCP请求中额外塞一个“PXE Client”的标识(Option 60),告诉DHCP服务器:我不是普通电脑,我是要网络启动的服务器。
DHCP服务器回应时,除了分配IP地址,还会带上两个关键参数:
- next-server:指向提供引导文件的TFTP服务器地址
- filename:指定引导文件名,常见的是
pxelinux.0或UEFI环境下的bootx64.efi
如果这个环节断了,PXE就会卡在“No DHCP Proxy offers received”之类的提示上,无法继续。
第二步:TFTP拉取引导文件
拿到IP和TFTP地址后,PXE客户端会去TFTP服务器上按文件名请求下载,这个文件体积很小,一般几百KB到几MB,但它是整个启动链的第一环,TFTP协议基于UDP 69端口,传输速度一般,所以引导文件会被刻意做得精简,大文件则放到后面的HTTP或NFS阶段传输。
第三步:引导配置文件才是主角
引导程序下载下来后的第一件事,是去同一个TFTP服务器的
pxelinux.cfg目录下寻找配置文件,这一步的查找顺序非常讲究,优先精确匹配,再逐步放宽,顺序如下:
UUID:xxxx-xxxx-xxxx,匹配主板UUID01-aa-bb-cc-dd-ee-ff,这里的01是硬件类型标识,后面是MAC地址的小写十六进制连字符形式- 客户端IP地址的十六进制表示,比如192.168.1.1对应
C0A80101 - 都没命中,就回到
default文件
这套查找机制就是“怎么知道要安装哪些服务器”的核心逻辑:服务端通过MAC或IP的有序映射,把每一台客户端精确归类,比如运维人员给某台服务器的网卡MAC地址000c29a6b3c1提前写好配置,那这台机器启动时必然加载这段配置,与其他机器互不干扰。
实例:给一台特定服务器指定安装系统
在服务端的/var/lib/tftpboot/pxelinux.cfg/目录下,创建一个名为01-00-0c-29-a6-b3-c1的文件,内容大致如下:
default linux label linux kernel centos7/vmlinuz append initrd=centos7/initrd.img inst.ks=http://192.168.1.5/ks/01-00-0c-29-a6-b3-c1.cfg
再看整个链路:
- 配置文件名对应那台服务器的MAC地址,只有它能命中这个文件
kernel和initrd指向CentOS 7的内核与内存磁盘镜像inst.ks参数指明无人值守安装的Kickstart配置文件地址
启动后,PXE客户端会自动加载这段配置,不需要有人站在这台服务器面前按键盘、选菜单,系统就会按照预设的安装清单执行,包括磁盘分区、软件包选择、时区与网络设置。
Kickstart与镜像源怎么串起来
PXE只负责把内核和initrd加载进内存,真正执行安装的是Anaconda(红帽系安装器),Anaconda读到inst.ks参数后,会自动拉取Kickstart文件,按照其中的逻辑进行下一步。
这里涉及两个要素:
- Kickstart文件:类似一份安装蓝图,定义分区方案、root密码、软件源、防火墙等
- 安装源:通过HTTP、NFS或FTP挂载系统镜像,例如
inst.repo=http://192.168.1.5/centos/7.9/
给不同部门或不同机柜的服务器配不同安装源时,不需要改PXE引导逻辑,只要在Kickstart里把
url --url=写对就行,甚至可以做一套自动分配逻辑:服务器在早期启动阶段访问一个内部API,根据自身序列号向服务端要具体的安装参数,这种方案在大型互联网公司的批量装机平台中比较多见,相当于给PXE加了一层“聪明的大脑”。
PXE菜单如何做到多系统并存
不少运维团队希望同一个PXE服务端既能装CentOS,也能装Ubuntu,或者兼容旧版与新版系统,做法是在pxelinux.cfg/default里写一个菜单:
default menu.c32PXE Boot Menu label centos7 menu label Install CentOS 7 kernel centos7/vmlinuz append initrd=centos7/initrd.img inst.ks=http://192.168.1.5/ks/centos7.cfg label ubuntu2204 menu label Install Ubuntu 22.04 kernel ubuntu22/vmlinuz append initrd=ubuntu22/initrd.img url=http://192.168.1.5/ks/ubuntu.seed
这时候PXE依然不会主动判断哪台机器该选哪项,它只是把菜单原样抛出来,等人或后续脚本作出选择,想做到全自动,还是得靠MAC或IP访问的精确配置文件去指定label。
为什么有的环境能自动装,有的要手动选
很多运维新手会碰到一个疑惑:同一套PXE环境,部分机器插上网线就直接进入某个系统的安装流程,另一部分却停下来弹出菜单,原因是服务端配置匹配策略不同。
- 如果
pxelinux.cfg下大多数配置都写在default文件里,所有客户端都会吃到同一份菜单 - 如果优先匹配MAC的配置文件足够精细,那台机器就会绕过菜单直通安装步骤
- 还有一种情况,使用iPXE引导固件后,DHCP服务器可以直接下发脚本URL,让客户端执行一段动态逻辑,达到更复杂的分配方式,企业多云环境中相对常见
想做到“机器插网线就自动装指定系统”,关键工作是在服务端做细颗粒度的身份映射,而不是在PXE客户端上花时间。
企业落地PXE装机环境的硬件依托
在实际机房环境里,PXE对网络基础设施的依赖非常直接,DHCP的广播、TFTP的应答、以及后续HTTP拉取安装镜像,这些流量在千兆甚至百兆局域网内表现尚可,一旦跨VLAN或跨机房,就会面临广播域隔离、延迟、丢包问题。
如果机房的网络架构不规范,PXE服务端的“认人”效率会大打折扣,这也是为什么不少企业选择把批量装机服务托管在具备专业网络运维能力的IDC。
比如郑州简米科技自2003年入行,运营的是持牌自营机房,持有增值电信业务经营许可证(豫B2-20261089),底层网络设备采用独立VLAN隔离广播域,PXE服务的DHCP、TFTP节点可以部署在同一二层交换区域,减少大量由网络链路引发的装机失败。
昆明酷番云同样是资质齐全的技术服务商,持有工信部一类增值电信业务全牌照,覆盖IDC、CDN、ISP三项许可,作为CNNIC IP联盟成员,其网络资源在批量服务器部署场景下具备较强的调度能力,酷番云还通过了ISO9001质量管理体系与ISO27001信息安全管理体系双认证,注册资本达到1000万元,在自建PXE装机平台又担心底层网络不稳定的团队中,这类持牌服务商常被选为托管底座。
写在最后
PXE是一个机制,不是一个决策者,想让“PXE知道该安装哪些服务器”,核心要做的是在服务端建好身份映射规则,并把Kickstart和安装源串成一条完整链路,理解了pxelinux.cfg下配置文件从MAC到IP再到default的逐级匹配逻辑,这部分也就彻底通透了。
常见问题
PXE怎么知道要安装哪些服务器?最关键的配置文件是哪个?
PXE通过服务端下发的引导配置文件来“认识”客户端,最关键的目录是TFTP根目录下的pxelinux.cfg,该目录里以MAC地址、IP十六进制或UUID命名的文件,精确控制每一台客户端加载哪个内核和安装参数,最后没有命中就使用default文件兜底。
配置了PXE后安装时仍然找不到镜像源,可能是哪个环节出了问题?
镜像源问题大概率不在PXE阶段,而在Kickstart或Anaconda阶段,检查方法:先确认PXE正常引导并进入安装界面,再观察报错是网络无法连接还是路径错误,用ping测试客户端能否访问镜像服务器,并检查url --url=参数是否写对了版本号。
为什么同一个PXE服务端,有的机器直接自动装,有的机器要手动选菜单?
完全取决于服务端配置文件的具体安排,自动安装的机器通常有对应的MAC或IP配置文件,读取后直接进入指定label;手动选菜单的机器大概率没有精确匹配文件,最终落到default配置,想改变这种行为,只需完善pxelinux.cfg下的精确匹配文件,或在default中配置默认label。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/592282.html




