
搞运维的兄弟应该都经历过这种场面会议室里摊开十几台新拆封的裸机人手一个U盘刻系统、按F12、等进度条装完一台再换下一台。如果只是三五台还好一旦碰上几十台甚至上百台这种“人肉U盘”模式基本就是灾难——不是U盘中毒就是镜像版本不一致要么就是有人把系统装错了机器。后来我花了点时间把PXE网络装机这套流程彻底跑通从那以后批量装机对我来说就变成了一件很无趣的事把机器插上网线开机等十几分钟系统自己就装好了全程不需要碰键盘。这篇文章就是把那套流程完整梳理一遍从原理到配置再到踩坑记录希望能帮你把这件事也变成“无脑操作”。PXEPreboot eXecution Environment本质上是一种让电脑在“没有系统、没有硬盘数据”的状态下通过网络接口从服务器加载操作系统安装程序的启动协议。只要你的网卡和BIOS/UEFI支持PXE现在几乎都支持它就能替代U盘和光盘成为批量装机的统一入口。本文适合机房运维、实验室管理员、以及想在自己NAS或一台闲置服务器上搭建装机服务的朋友参考我会从协议流程讲起逐步落到实际配置和排错。1. PXE启动的完整拆解电脑是怎么“凭空”找到安装程序的1.1 为什么需要PXEU盘和光盘解决不了的两个问题先说一个很多人忽略的事实U盘装机和PXE装机表面看只是“启动介质”不同实际上是完全不同的解决问题思路。U盘装机的核心是把“安装介质”复制到U盘里然后人要做的是“插U盘、选启动项、可能还要选镜像版本”PXE装机把整个“介质分发”和“人机交互”都自动化了服务器提前准备好镜像和应答文件客户端只要开机就自动进入安装流程。这意味着两个关键能力第一安装介质不需要物理接触每台电脑你不需要准备几十个U盘也不需要担心U盘里的镜像被误改第二安装参数可以预先定义比如分区方案、主机名规则、软件包集合都是服务器端统一下发的不会出现“这台装了带GUI的那台忘了勾sshd”这种低级混乱。我做过的规模最大的单次装机是80多台机器用的是“一台服务器 一台傻瓜交换机 一堆网线”的组合真正动手的时间不超过半小时——大部分时间其实是等机器自动跑。这种效率U盘是无论如何给不了的。1.2 一次PXE启动发生了什么DHCP、TFTP、HTTP三个阶段很多刚开始接触PXE的朋友最大的障碍是搞不清“电脑开机后到底和服务器说了什么”。其实把三个阶段记住整个流程就通了。第一阶段是DHCP阶段。机器开机后网卡会向网络里广播DHCP请求目的很简单我要个IP顺便问一句“谁知道从哪里可以启动”。如果网络里有配置好的PXE服务DHCP服务器不仅会分配IP地址还会在响应里带上两个关键信息next-server指向TFTP服务器的地址和filename告诉网卡去下载哪个启动文件。这两个选项是PXE能跑起来的地基后面排查问题80%的坑都出在这里。第二阶段是TFTP阶段。网卡拿到“启动文件路径”后会用TFTP协议去下载它。TFTP是个很古老、很轻量的文件传输协议本身没有认证、没有目录浏览速度也不快但它足够简单能被网卡固件直接识别所以PXE启动文件、内核、initrd这些“启动早期必须用的小文件”都靠它来传。这个阶段常见的报错就是“TFTP open timeout”或“PXE-E32: TFTP open timeout”多半是TFTP服务没起或者防火墙挡了。第三阶段是加载安装程序阶段。前面两步下载下来的pxelinux.0BIOS引导或grubx64.efiUEFI引导其实是个微型引导管理器它会根据配置文件里的菜单再去下载Linux内核vmlinuz和初始内存盘initrd。内核启动后会挂载真正的安装源——通常是通过HTTP/NFS协议加载的ISO或软件仓库——然后读取预设好的应答文件比如Kickstart开始自动安装。如果你看过一些PXE报错信息比如“setup noticeefi pxe o for ipv4 (88-a4-c2-22-b5-97) boot failed would you...”不用慌。这句话的意思是这台UEFI机器尝试从IPv4网卡启动网卡去请求DHCP和TFTP但没找到可用的启动文件于是引导失败。它只是把“我找不到PXE服务器上的引导文件”这个事实说得比较绕而已。看到这类报错先确认服务端TFTP目录里对应架构的引导文件是不是放对了以及DHCP的next-server/filename选项是不是配了。1.3 UEFI和Legacy BIOS的差异为什么明明配好了却启动不了前几年做PXE还没有那么多讲究BIOS引导用pxelinux.0UEFI引导用grubx64.efi泾渭分明。现在新机器基本都是UEFI了这就带来两个很现实的差异。第一个差异是启动文件不同。UEFI固件不认识传统的pxelinux.0它要求加载EFI格式的可执行文件。常见做法是用syslinux包里的efi64/efi64/syslinux.efi或者直接用GRUB2的grubx64.efi。我建议新环境优先用GRUB2做UEFI引导它对UEFI的兼容性更好配置也灵活。第二个差异是启动文件名自动匹配机制。传统BIOS下网卡会按照“MAC地址-配置文件 - IP地址-配置文件 - default”的顺序去找菜单文件服务端可以通过这个机制给不同机器下发不同启动参数。UEFI下这个机制依然存在只不过文件名格式有所区别比如用grub.cfg而不是pxelinux.cfg。很多人在UEFI机器上折腾半天启动不了其实就是因为PXE服务端只配了BIOS的引导链没给UEFI架构准备对应的引导文件。提示如果客户端是UEFI并且开了Secure BootPXE启动很容易被拦下来。要么在BIOS里临时关闭Secure Boot要么给GRUB做签名。自己做实验环境直接关掉最省事。2. 搭建PXE服务端软件栈选型与实际配置2.1 服务端该放哪独立服务器还是NAS上搭建PXE服务端第一个问题是“用哪台机器当服务器”。我的建议是不要为了PXE专门买一台高性能机器普通一台四核CPU、4GB内存的小主机或虚拟机就够了因为PXE服务端本质就是个“分发中心”压力远没有想象中大。真正有性能要求的是HTTP传输和磁盘读写所以硬盘最好用SSD网络最好千兆起步。如果你的环境里正好有一台NAS比如飞牛NAS或者群晖、威联通都行那完全可以在NAS上搭。NAS的优势是24小时开机、有现成的存储空间、还能跑Docker非常适合放PXE服务。飞牛NAS上搭PXE其实不复杂思路就是在Docker里跑两个容器一个dnsmasq同时承担DHCP和TFTP一个是nginx或者Apache提供HTTP安装源。这样不占用独立服务器资源也不影响NAS原本的存储功能。当然如果在生产机房有条件建议把PXE服务端放在独立的维护网段里并且把DHCP范围控制在装机网段避免和办公网、生产环境的DHCP冲突。我自己差点就踩过这个坑有一回拿着笔记本到客户机房插上办公网线试PXE结果网卡从办公网的DHCP拿到了一个完全无关的IP还真的加载了一个不知道谁家的引导菜单场面一度很尴尬。2.2 用dnsmasq还是分离式DHCPTFTP软件栈的选择上有两条路线。第一条是“一体化”路线用dnsmasq同时做DHCP和TFTP。dnsmasq本身是个轻量级的DNS/DHCP/TFTP工具配置极其简单适合环境不太复杂、不想维护太多服务的场景。我的家庭实验室和飞牛NAS上的PXE就是用dnsmasq一份配置文件搞定出问题也好排查。第二条是“分离式”路线用独立的DHCP服务比如ISC DHCP加独立的TFTP服务tftpd-hpa和HTTP服务nginx。这个方案的好处是每个组件都可以单独调优和重启日志也更清晰适合几十台以上、需要精细控制的企业机房。但如果只是自己用没必要把架构搞复杂。我个人的经验准则是节点少于20台、网络结构简单直接用dnsmasq省心节点多、有VLAN隔离、需要对DHCP做复杂策略再上分离式方案。不要把简单问题复杂化。2.3 一份能用的dnsmasq配置文件解析不管你用哪条路线核心配置逻辑是一样的。下面是我在飞牛NAS的Docker里跑dnsmasq时实际用过的配置文件注释写得很全可以直接参考# /etc/dnsmasq.conf 核心片段 # DHCP 地址池192.168.10.100-192.168.10.200 dhcp-range192.168.10.100,192.168.10.200,12h # PXE 关键next-server 指向 TFTP 服务所在 IP dhcp-option66,192.168.10.10 # PXE 关键filename 指定 BIOS 架构的引导文件 dhcp-option67,pxelinux.0 # 同时给 UEFI 架构下发不同引导文件dnsmasq 支持按 client architecture 匹配 # 这里是针对 x86_64 UEFI 客户端的写法 dhcp-matchset:efi-x86_64,option:client-arch,7 dhcp-boottag:efi-x86_64,grubx64.efi # TFTP 根目录 enable-tftp tftp-root/srv/tftp看到66和67选项没66是“下一个服务器地址”也就是告诉网卡“去哪个IP找启动文件”67是“启动文件名”。很多人PXE失败就是因为DHCP地址池和PXE服务不在同一个网段或者干脆没写这两个选项。网上那些“boot failed”报错的机器绝大多数都是这四个字没配66/67。2.4 目录结构与HTTP安装源准备TFTP目录结构我习惯这样组织清晰且便于扩展/srv/tftp/ ├── pxelinux.0 # BIOS引导文件 ├── ldlinux.c32 # syslinux依赖模块 ├── grubx64.efi # UEFI引导文件 ├── grub/ │ └── grub.cfg # GRUB2菜单配置 ├── pxelinux.cfg/ │ └── default # BIOS菜单配置 ├── centos/ │ ├── vmlinuz # CentOS内核 │ └── initrd.img # CentOS初始内存盘 ├── ubuntu/ │ ├── vmlinuz │ └── initrd.img └── ks/ ├── centos.ks └── ubuntu.ks内核和initrd怎么来最简单的方法是挂载官方ISO把里面的images/pxeboot/vmlinuz和initrd.img拷出来放到对应目录。ISO里的这两个文件就是为PXE准备的免去自己到处找的麻烦。HTTP安装源则是把整个ISO的内容解压到一个Web目录里比如/var/www/html/centos/8。内核启动后通过ks.cfg里的url --urlhttp://192.168.10.10/centos/8指定安装源位置。用HTTP而不是NFS的好处是简单、跨平台、容易做并发。3. 无人值守Kickstart应答文件的写法与坑3.1 为什么必须用应答文件无人值守的核心逻辑PXE本身解决的是“启动介质从哪来”的问题但如果装系统过程中还要人工点击“Next”、选时区、设密码那批量装机就失去了意义。PXE的杀手锏在于“无人值守安装unattended installation”。Linux这边对应的工具是Kickstart配置文件就是.ks文件。客户端的内核启动参数里带上ks这个参数指向答案文件的位置安装器就不再问任何问题全程按文件里的配置执行。这个文件是整个PXE流程里最需要花心思写的东西因为一旦写错安装器可能直接报错退出或者默默装出一个不符合预期的系统。3.2 一份基础Kickstart配置模板我拿Rocky Linux / CentOS 8系的ks文件举例这是我自己在用的精简版适合装最小化服务器# ks/rocky.ks # 语言和键盘 lang en_US.UTF-8 keyboard us # 时区 timezone Asia/Shanghai --isUtc # 安装源指向HTTP服务 url --urlhttp://192.168.10.10/rocky/8 # 最小化安装 %packages core %end # 磁盘分区 zerombr clearpart --all --initlabel # 自动分区示例boot 1G剩余给 root part /boot --fstypexfs --size1024 part / --fstypexfs --size20480 part swap --size4096 # 网络DHCP 获取 network --bootprotodhcp --devicelink --activate # root密码示例生产环境请用grub-crypt生成密文 rootpw --iscrypted $6$xxx # 重启 reboot # 安装后脚本可以设置主机名或安装额外客户端工具 %post --log/root/ks-post.log echo pxe-installed /etc/hostname %end这里有几个细节第一分区大小要提前想好。如果我们统一给所有机器分配固定的root分区装机速度确实快但后面如果某台机器要扩容就麻烦。我个人后来改成“LVN”逻辑先分一个小的/boot再建LVM把剩余空间全给/这样后期用lvresize扩容灵活得多。第二--devicelink是个隐藏技巧它会让安装器自动选择有网络链路的网卡避免服务器有多个网口时选错设备。多网口的机器装完发现IP没配上多半就是没加这个参数。第三rootpw务必用加密形式不要用明文。明文密码出现在HTTP传输过程中虽然内网风险低但习惯不好。3.3 内核启动参数怎么把应答文件传给安装程序配置文件准备好以后关键是怎么在PXE启动时就把它告诉安装器。在pxelinux.cfg/default菜单里每一条启动项对应一个label核心参数在append那一行# /srv/tftp/pxelinux.cfg/default DEFAULT menu.c32 PROMPT 0 TIMEOUT 60 LABEL install_rocky MENU LABEL ^Rocky Linux 8 PXE Install KERNEL rocky/vmlinuz APPEND initrdrocky/initrd.img inst.repohttp://192.168.10.10/rocky/8 kshttp://192.168.10.10/ks/rocky.ks ipdhcp注意ks参数指向的是HTTP可达、且TFTP目录之外的位置因为ks文件相对较大不适合用TFTP传。整个PXE链路里网卡固件 - TFTP下载pxelinux.0 - 加载vmlinuz和initrd - initrd内嵌的dracut请求HTTP拿repo和ks这是两条完全不同的网络链路理解了这条链路后面所有排错都能对号入座。UEFI的grub.cfg写法略有不同但原理一致。GRUB2下我习惯这样写# /srv/tftp/grub/grub.cfg set default0 set timeout60 menuentry Rocky Linux 8 PXE Install { linux /rocky/vmlinuz inst.repohttp://192.168.10.10/rocky/8 kshttp://192.168.10.10/ks/rocky.ks ipdhcp initrd /rocky/initrd.img }3.4 参数化设计同一份ks文件适配不同硬件批量装机的机器硬件往往不是完全一致的最常见的是磁盘型号和大小不同、网卡型号不同甚至有些机器是UEFI、有些还是Legacy。如果每台机器都改ks文件维护成本太高。我的做法是用ks文件里的预定义宏再结合HTTP服务器端做一些小逻辑。比如ks里允许通过%pre段执行shell脚本根据硬件信息动态生成分区参数或写配置文件。下面的场景很典型机器内存不足8G就不建swap或者磁盘超过2T就改用GPT分区。%pre --interpreter/bin/bash TOTAL_MEM_KB$(grep MemTotal /proc/meminfo | awk {print $2}) if [ $TOTAL_MEM_KB -lt 8388608 ]; then echo part swap --size2048 /tmp/swap_partition else echo /tmp/swap_partition fi %end这类技巧一开始不用学太多先保证“一套ks能装通一种典型机器”再慢慢扩展。最怕的是上来就想统一所有奇葩硬件结果把时间全花在适配上了。4. 实战流程从镜像制作到批量上架4.1 模板机思路抓取“黄金镜像”还是纯Kickstart部署到了实际部署阶段会有一个明显的路线分叉你是想让每台机器通过ks文件从零安装还是先做一台“模板机”黄金镜像然后把整个系统抓取复制到其他机器纯Kickstart部署的好处是“干净”每台机器都是原汁原味的新装系统安装过程中做各类软件包的自定义也直接。坏处是如果业务软件很多比如预装数据库、中间件、监控Agent安装时间会很长而且ks里的软件包管理会变得很重。模板机抓取通常叫Golden Image克隆的思路是先手动装好一台标准机器把该装的软件都装好配置也调好然后用抓取工具把它的根文件系统打包成一个镜像PXE启动后直接把这个镜像推到目标机器的硬盘上。这就像“给系统拍快照然后克隆”。Windows环境里对应的工具是WIM/ESD镜像和微软的MDT/SCCMLinux环境里可以用dd、rsync、或者专门的网络克隆工具比如网上常见的“奇东锐腾PXE网刻工具”就是这类思路只是它是闭源的商业软件自己折腾的话完全可以用开源方案替代。我的看法是生产环境优先用Kickstart从零装实验环境或大批量同质化部署用镜像克隆更快。Kickstart部署的机器“个体差异”最小不容易出现两台机器配置对不上的情况而镜像克隆虽然快但如果模板机的驱动没打好复制到不同硬件上容易翻车。4.2 用Kickstart批量部署的完整操作记录以50台同型号的服务器为例我的操作流程是这样的第0步确认服务器硬件型号一致至少磁盘、内存、网卡差异不大如果差异大准备好多个ks文件用MAC地址匹配。第1步把服务器接线、上电全部设置为PXE启动优先。如果机器支持IPMI这一步可以用IPMI/Redfish命令远程设置启动项不用一台台按F12。第2步启动服务器进入PXE引导菜单等提示时输入自动安装项或者干脆把TIMEOUT 60设成3秒等它默认选中就行。第3步等待安装完成机器自动重启。重启后进入新系统的第一步是执行%post脚本快速验证主机名、IP、分区是否符合预期。第4步验收。抽查三台机器执行df -h看分区、ip addr看IP、systemctl status看服务是否起来。如果都正常剩下的就是回家睡觉。实际做批量的时候我强烈建议把DHCP地址池的租约时间设短一点比如30分钟而不是默认的12小时这样装完的机器网卡不会长时间占着旧IP。另外如果网络里同时有PXE服务器和办公网DHCP务必把装机组网段隔离出来否则可能“装到一半IP被别的DHCP抢了”。4.3 Windows镜像怎么做PXE很多运维朋友是Windows环境这里顺带提一句。Windows做PXE部署传统方案是部署WDSWindows Deployment Services但WDS配置繁琐对客户端和服务器版本都比较挑。更现代的方案是用SCCM/SDMP微软的部署管理平台但那是重武器小团队不一定有精力上。如果你只是想在实验室里批量装win10/win11用Linux的PXE服务器引导一个WinPE启动镜像然后让WinPE自动加载网络驱动、映射网络驱动器、执行自定义脚本部署WIM镜像——这是可行的但工程量不小。我自己没在Windows上跑过完整的工业级链路这里就不展开装大佬了只说结论如果目标是Windows直接考虑商业网刻工具或者WDS会更省心。4.4 并发装机时要不要控制速度最后说一个很容易被忽略的点并发。当你同时有10台、20台机器通过HTTP下载安装源时千兆网络跑到瓶颈很正常。HTTP协议本身支持并发不需要额外配置但TFTP阶段也就是加载vmlinuz那一下如果并发太多TFTP这个小协议会显得很吃力。我的经验是dnsmasq的TFTP默认同时处理几个请求没问题但如果超过30台机器同时启动最好把内核和initrd文件也放到HTTP侧让PXE引导加载完pxelinux.0后直接通过HTTP拉取vmlinuz/initrd而不是TFTP。这需要在syslinux/grub配置里把加载路径写成HTTP URL能显著减少TFTP瓶颈。5. 常见问题排查PXE启动失败怎么对症下药5.1 先看懂那些吓人的英文报错很多第一次碰PXE的朋友一看到开机黑底白字的报错就慌了。这里把最常见的几类报错和对应原因整理成一张速查表照着查基本能定位问题报错信息常见原因解决方向PXE-E61: Media test failure, check cable网线没插好或交换机端口未激活检查物理链路PXE-E32: TFTP open timeout服务器防火墙挡了TFTP 69端口或TFTP服务未启动放行UDP 69确认tftp-root配置PXE-E55: ProxyDHCP service did not replyDHCP服务器未配置PXE选项/代理DHCP未工作检查66/67选项boot failed, would you like to retry?网卡找不到引导文件确认filename写的是不是pxelinux.0或grubx64.efiCould not find kernel image: linux引导加载器找到了但内核路径不对检查KERNEL指向的文件是否存在dracut: FATAL: HTTP Errorinitrd起来了但连不上HTTP安装源检查HTTP服务、IP和防火墙dracut: FATAL: No root device found安装源路径错误或NFS/HTTP路径写错校准ks里的url路径Secure Boot ViolationUEFI安全引导拦截了未签名引导文件临时关闭Secure Boot或用签名引导那行“setup noticeefi pxe o for ipv4 (88-a4-c2-22-b5-97) boot failed would you...”也属于这一类它其实是UEFI网卡找不到PXE服务器给出的最终失败提示。如果看到它回到DHCP服务器上确认两件事一是客户端是否从DHCP拿到了IP二是DHCP响应里有没有包含66/67选项。5.2 线上排查三连抓包、看日志、验证端口如果报错信息不能直接指明原因我通常按下面这个顺序排查先抓包。在PXE服务器上执行tcpdump -i eth0 port 67 or port 69 or port 80 -XX然后让客户端重新开机。如果能看到DHCP Discover/Offer的交互说明网络链路通如果看不到Offer多半是DHCP配置问题如果看到Offer但没有后续TFTP请求问题就出在网卡没有接受66/67选项。再看日志。dnsmasq的日志在/var/log/messagesCentOS或/var/log/syslogUbuntu里启动时加上log-dhcp选项就能看到详细DHCP日志。nginx的访问日志能确认客户端有没有真的请求HTTP安装源。最后验证端口。ss -ulpn | grep :69看看TFTP有没有监听curl一下HTTP源地址能不能正常列出文件。这三个动作基本能覆盖90%的PXE故障。5.3 服务端正常但客户端就是不启动往往是硬件设置问题还有一种特别气人的情况服务端配置全对抓包也正常但客户端就是启动失败。这种问题大部分出在客户端自身的BIOS/UEFI设置上。我遇到过最典型的是开机启动顺序。很多品牌机的BIOS第一启动项默认是“硬盘”或“UEFI Shell”压根没走网卡所以你在服务器上看到客户端根本没发DHCP请求。解决方法是进BIOS把“Network Boot”移到第一位或者直接按热键F12/F11/F10临时选择网卡启动。还有一种情况是安全启动Secure Boot开着UEFI固件拒绝加载未签名的grubx64.efi。不同品牌对GRUB的签名处理不一简单省事就是先把Secure Boot关掉装完系统后再按需恢复。5.4 分区和驱动装到一半失败的隐性原因PXE启动失败不一定是网络问题安装过程中突然报错退出很多时候是磁盘分区或驱动问题。一个典型的案例如下机器有NVMe固态和SATA机械盘如果ks里只写了part /而没有指定磁盘安装器可能随机选了一块盘装完发现系统在机械盘上运维直接血压上去。解决办法是在ks里用ignoredisk --only-usesda或在分区前用%pre脚本自动识别NVMe盘并动态生成分区逻辑。驱动问题则多出现在非常新的硬件上。内核和initrd版本太旧识别不了一线网卡或新芯片组ESXi那类系统尤其常见。应对措施是尽量从最新版官方ISO里提取vmlinuz/initrd必要时给initrd注入额外驱动模块。6. 从“能用”到“好用”PXE工作的几个进阶技巧6.1 日志留痕每次装机都记一笔批量装机多了以后你会发现一个问题机器多了哪台装了、装了什么版本、IP是多少根本记不住。我的习惯是在DHCP配置里把mac地址和主机名绑定并让ks的%post脚本把安装结果POST到一台日志服务器或写入共享目录。比如在%post里追加一行curl -d hostname$(hostname)macmactime$(date) http://logserver/install_report这样每次装机就有了审计记录。查“这台机器是不是我装的”的时候翻日志就行不用猜。6.2 多版本镜像共存PXE菜单的优雅设计PXE菜单做多版本共存其实非常实用。同一个机房可能会有CentOS 7、Rocky 9、Ubuntu 22.04并存的情况。pxelinux.cfg/default里多加几个LABEL就行用MENU LABEL做区分LABEL install_rocky9 MENU default MENU LABEL Install Rocky Linux 9 KERNEL rocky9/vmlinuz APPEND initrdrocky9/initrd.img inst.repohttp://192.168.10.10/rocky/9 kshttp://192.168.10.10/ks/rocky9.ks ipdhcp LABEL install_ubuntu2204 MENU LABEL Install Ubuntu 22.04 KERNEL ubuntu2204/vmlinuz APPEND initrdubuntu2204/initrd.img urlhttp://192.168.10.10/ubuntu/2204 kshttp://192.168.10.10/ks/ubuntu2204.ks ipdhcp把MENU default放在最常用的版本上装机的默认选项就会是它不常用版本用上下键选非常顺手。6.3 要不要用网刻工具商业方案和自建的区别其实现在市面上有很多“PXE网刻工具”比如奇东锐腾这类把PXE网络克隆和网克集成得很傻瓜化适合要求快速上手、不关心底层原理的团队。它们通常提供图形界面点击几下就能批量部署Windows、Linux或整盘克隆。但要提醒的是这类工具大多是闭源的存在License成本、绑定硬件、以及功能不透明等问题。如果你只是想搞懂原理、希望完全掌控过程、或者需要跑在NAS这类自有设备上自建dnsmasqnginxKickstart完全够用而且不花一分钱软件费。我自己是两条路都走过结论是小规模、实验性、长期自维护自建更靠谱要给“非技术背景”的同事用的临时批量装机商业网刻工具上手确实快一点。6.4 最后再讲一个ESXi和自动配置的小扩展除了装Linux和WindowsPXE也能用来装ESXiVMware的虚拟化系统。ESXi的PXE部署思路和Linux差不多唯一要注意的是ESXi安装器对网卡驱动的兼容性要求更高非常新的网卡可能需要打包驱动进安装镜像。凡是碰到“PXE能启动但安装器找不到磁盘/网卡”的优先查驱动别反复重装浪费时间。至于飞牛NAS上搭PXE的具体操作思路就是把dnsmasq和nginx跑在Docker里把tftp-root和http目录映射到NAS存储路径。只要NAS支持Docker这个方案就是通用的不管飞牛、群晖还是自建的OpenMediaVault都能用。唯一的建议是配置文件务必加版本注释过两个月回头改配置的时候你会感谢自己的。我个人在实际操作中的体会是PXE这套东西最难的不是配置本身而是“故障定位逻辑”。只要把第1节那三条链路DHCP拿IP、TFTP下载引导、HTTP加载安装源刻在脑子里遇到任何报错都能按图索骥。最后再分享一个可能帮你省两小时的小技巧每次改完dnsmasq配置记得重启服务后用dhclient或另一台机器验证一下DHCP响应里是否真的带了66/67选项不要等到几十台机器都开完机才发现在第一步就挂了。