ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PXE服务器搭建与Ubuntu批量无人值守装机

PXE服务器搭建与Ubuntu批量无人值守装机 1. 为什么我要用PXE给Ubuntu装机机房角落里堆着十几台同型号的机器每台都要装Ubuntu如果一台一台插U盘、点下一步、选时区、分分区一天下来人基本就废了。这种场景下PXE ServerPreboot Execution Environment就是我反复用到的解法——让机器从网卡启动自动从服务器拉取引导文件和系统镜像全程不用碰U盘理想情况下连键盘鼠标都不用插。这套方案特别适合实验室、机房、批量测试环境也适合想搞明白电脑到底是怎么从网络启动的这一类底层问题的朋友。哪怕你只有一台闲置机器想反复重装系统搭一次PXE后面省下的时间也很可观。需要先说清楚它的门槛PXE不是点两下就完事的工具它依赖DHCP、TFTP、HTTP三个服务协同工作网络环境里的路由器、交换机、甚至同网段的其他DHCP服务都可能来捣乱。所以接下来的内容我会把每个环节的为什么讲透把踩过的坑摊开说你在自己的环境里照着改参数就能落地。整体思路是先用一台Ubuntu做服务端客户端网卡开启PXE引导服务器下发IP和引导文件客户端从HTTP源拉取完整安装镜像完成Ubuntu安装配合自动应答文件还能做到无人值守。2. 整体方案设计与选型思路2.1 PXE到底解决了什么痛点传统装机方式无非两种U盘/光盘本地介质或者手动挂载镜像。U盘方案的痛点是介质要反复制作镜像更新一次就得重做一次十几台机器意味着十几次插拔和交互而且老机器USB兼容性、BIOS启动顺序这些细节经常出幺蛾子。PXE把引导介质从物理设备挪到了网络上镜像文件放在服务器上统一管理改一次全生效客户端每次启动都是最新版本。这个转变带来的收益是介质零成本、版本统一、可无人值守、可一键扩展到几十上百台。但PXE本身只是一个引导协议它只负责把一段小程序通过网络送到客户端内存里执行真正安装系统的还是这段程序去拉取的安装镜像。所以PXE Server本质上是引导服务 镜像服务的组合体理解这一点后面所有配置都不会迷路。我见过不少人把PXE想得很玄乎实际上拆开看就是几个标准服务各干各的活。2.2 为什么选dnsmasq而不是dhcpd加tftpd的组合常见的搭建方式有两类一类是用isc-dhcp-servertftpd-hpanginx三件套配置分散在三个文件里服务之间还要对参数另一类是用dnsmasq把DHCP和TFTP合并到一个进程里配置集中、依赖少。我个人更倾向后者原因很实际dnsmasq体量小、启动快、一个配置文件就能同时管DHCP和TFTP排查问题时只需要看一个日志出错的概率明显更低。对于一台专门做装机的服务器来说功能越聚焦越稳。当然dnsmasq也有取舍它的TFTP实现偏简单超大文件传输或高并发场景下不如专门的tftpd但PXE引导阶段传的只是几百KB到几MB的引导文件如bootx64.efi、grubx64.efi、vmlinuz、initrd这个量级dnsmasq完全扛得住。真正的系统镜像走HTTP不经过TFTP所以性能瓶颈不在它身上。2.3 部署前必须想清楚的几件事动手之前先把环境盘清楚否则后面全是返工。第一件事是网络隔离PXE依赖DHCP广播如果同网段里已经有一台路由器在发DHCP两个DHCP会打架客户端可能拿到错误的网关或直接拿不到引导文件。推荐做法是拿一台交换机单独组一个装机专用网段或者用VLAN隔开实在不行就用路由器上关闭DHCP、由PXE服务器独占。第二件事是IP规划。服务端我给一个固定IP比如192.168.100.1/24客户端地址池给一段独立范围比如192.168.100.100到192.168.100.200避免和服务端、其他设备冲突。第三件事是启动模式现在机器大多支持UEFI也有老机器只支持Legacy BIOS两种模式需要的引导文件完全不同最好先确认目标机器的固件类型再决定准备哪套引导文件。我建议两套都准备配置文件里按客户端类型分发后面会详细讲。方案组成优点缺点适用场景dnsmasq方案dnsmasq nginx配置集中、依赖少、易排查TFTP实现简单中小规模、单网段传统三件套isc-dhcp-server tftpd-hpa nginx组件成熟、可细粒度调优配置分散、易冲突大规模、多网段容器化方案Docker组合环境隔离、易迁移网络配置复杂实验、临时环境3. 核心组件原理与参数规划3.1 PXE启动的四段式流程理解流程是排查问题的前提。客户端开机网卡启动后依次经历四个阶段第一步网卡固件发出DHCP请求除了要IP还要通过DHCP选项告诉服务器我是PXE客户端第二步服务器通过DHCP回应下发IP地址、网关以及最关键的next-server引导文件所在的服务器地址和filename引导文件名第三步客户端用TFTP协议去next-server下载引导文件并执行第四步引导程序如GRUB再通过HTTP或TFTP拉取内核和initrd进入安装界面。任何一步断了表现都不一样这也是排查的线索。这里有个容易被忽略的细节DHCP响应里的filename字段对UEFI和Legacy BIOS要求不同。Legacy一般用pxelinux.0UEFI用bootx64.efi或grubx64.efi。如果文件类型和固件不匹配客户端会卡在正在获取引导文件或者直接报No boot filename received。所以判断问题第一步永远是看客户端到底走到了哪个阶段。3.2 DHCP、TFTP、HTTP三者怎么分工DHCP负责告诉客户端去哪拿、拿什么是整个流程的入口它的配置正确与否直接决定客户端能不能进入引导阶段。TFTP负责在引导早期把引导文件送过去因为它实现简单、无需认证正好适合固件阶段的极简网络栈。HTTP负责把几百MB甚至几个GB的安装镜像快速传过去因为TFTP传大文件效率极低用HTTP才能有正常的传输速度。三者关系可以用快递打个比方DHCP是快递单上的地址TFTP是送钥匙的小哥先给你一把能进屋的钥匙HTTP是真正把家具系统镜像搬进屋的货车。钥匙丢了进不了门货车慢了装修就慢。所以配置的重点在于DHCP要准、TFTP要稳、HTTP要快。3.3 镜像源与自动应答文件的分工如果只是手动安装客户端进入Ubuntu安装界面后自己选语言、分区、设用户就行服务器只要提供镜像源即可。但如果目标是无人值守批量装机就必须提供自动应答文件。Ubuntu 20.04之后主推的是cloud-init的autoinstallSubiquity老版本18.04及以前用的是preseed。两者的核心逻辑相同安装程序启动时通过网络读取一个配置文件按里面的指令自动完成分区、用户、软件包、网络等设置。这里的关键是安装程序怎么找到这个文件。常见做法是把autoinstall配置通过内核启动参数autoinstall dsnocloud-net;shttp://服务器地址/autoinstall/传给安装器或者用url参数指向preseed文件。参数写错一个字符就会退回到手动安装界面表现出来就是配置了但没生效。这块我踩过不止一次坑后面单独说。4. 手把手搭建从零到能装机4.1 基础环境准备与静态IP配置我用的服务端是Ubuntu 22.04 LTS24.04同样适用。先确认网卡名用ip a查看假设是ens33。接着配置静态IPUbuntu从17.10之后就改用netplan了配置文件在/etc/netplan/下。# /etc/netplan/01-pxe.yaml network: version: 2 renderer: networkd ethernets: ens33: addresses: - 192.168.100.1/24 routes: - to: default via: 192.168.100.254 nameservers: addresses: [223.5.5.5]应用配置用sudo netplan apply。注意缩进必须用空格YAML对缩进极其敏感多一个空格就报错。配置完用ip a确认地址生效ping一下外网确认通。这里有个常见问题如果服务端同时连接内网和装机网段路由可能要额外配置避免默认路由把装机流量带偏。4.2 安装配置dnsmasq安装很简单sudo apt update sudo apt install dnsmasq -y。但在启动之前先改配置否则默认配置会和系统里的其他网络服务冲突。dnsmasq主配置文件是/etc/dnsmasq.conf我习惯把PXE相关配置单独放到/etc/dnsmasq.d/pxe.conf主文件里保留conf-dir/etc/dnsmasq.d/,*.conf这一行即可。# /etc/dnsmasq.d/pxe.conf interfaceens33 bind-interfaces # DHCP地址池 dhcp-range192.168.100.100,192.168.100.200,255.255.255.0,12h # 网关和DNS dhcp-option3,192.168.100.254 dhcp-option6,223.5.5.5 # TFTP根目录 enable-tftp tftp-root/srv/tftp # PXE引导 dhcp-matchset:efi-x86_64,option:client-arch,7 dhcp-matchset:efi-x86_64,option:client-arch,9 dhcp-boottag:efi-x86_64,bootx64.efi dhcp-boottag:!efi-x86_64,pxelinux.0 # 日志 log-dhcp log-queries这段配置里有几个点值得展开。dhcp-match用来判断客户端架构option:client-arch,7是UEFI x64的标准值9是UEFI x64的另一种标识都匹配到efi-x86_64标签上然后dhcp-boot根据标签分发不同的引导文件没有匹配到UEFI标签的就走Legacy分支。log-dhcp强烈建议打开排查时能看到每一次DHCP交互细节。改完配置后用sudo systemctl restart dnsmasq重启用sudo systemctl status dnsmasq检查状态。如果启动失败多半是端口被占用——系统里可能已经跑了systemd-resolved占用53端口这时要么停掉它要么让dnsmasq不监听53端口。我一般直接sudo systemctl disable --now systemd-resolved并修正/etc/resolv.conf指向。4.3 准备引导文件与镜像先建目录sudo mkdir -p /srv/tftp。引导文件分两套准备。UEFI这套最简单直接从Ubuntu镜像里拷。挂载官方ISO后/casper下有内核和initrd而EFI引导文件在/EFI/BOOT/里把bootx64.efi和grubx64.efi拷到/srv/tftp根目录。更规范的做法是用grub-mknetdir生成一套完整的PXE引导环境sudo apt install grub-efi-amd64-bin grub-pc-bin -y sudo grub-mknetdir --net-directory/srv/tftp --subdir/grub执行后会在/srv/tftp/grub下生成grubx64.efi等文件把这个路径写进dnsmasq的dhcp-boot即可。Legacy这套需要pxelinux.0和ldlinux.c32来自syslinux包sudo apt install syslinux-common pxelinux -y sudo cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/ sudo cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /srv/tftp/接着准备Ubuntu安装镜像。我从官网下载ISO后把它挂载或解压到HTTP目录比如/var/www/html/ubuntu/。用mount -o loop ubuntu-22.04.iso /mnt挂载后把内容整个复制到HTTP目录。注意/casper下的vmlinuz和initrd也要一并拷到TFTP或者HTTP目录因为引导程序需要先加载它们。4.4 Nginx提供HTTP镜像与应答文件服务HTTP服务我用Nginx安装sudo apt install nginx -y。默认站点根目录是/var/www/html把镜像解压到这里就行。放好之后用浏览器或curl验证一下能否访问到http://192.168.100.1/ubuntu/dists/能返回内容说明服务正常。sudo mkdir -p /var/www/html/ubuntu sudo mount -o loop ubuntu-22.04.iso /mnt sudo cp -r /mnt/* /var/www/html/ubuntu/ sudo umount /mnt大文件复制耐心等几分钟ISO内容好几个GB。放好之后检查/var/www/html/ubuntu/casper/下有没有vmlinuz和initrd这两个文件后面引导配置要用到。4.5 配置GRUB引导菜单UEFI模式下引导程序会读取/srv/tftp/grub/grub.cfg。我写一份支持自动安装的配置# /srv/tftp/grub/grub.cfg set default0 set timeout5 menuentry Ubuntu 22.04 Auto Install { linux /ubuntu/casper/vmlinuz ipdhcp urlhttp://192.168.100.1/ubuntu/ autoinstall dsnocloud-net;shttp://192.168.100.1/autoinstall/ --- initrd /ubuntu/casper/initrd } menuentry Ubuntu 22.04 Manual Install { linux /ubuntu/casper/vmlinuz ipdhcp urlhttp://192.168.100.1/ubuntu/ --- initrd /ubuntu/casper/initrd }注意这里linux和initrd的路径是相对于TFTP根还是HTTP根取决于grub配置里怎么定义。上面这种写法是把内核和initrd也放在HTTP目录里通过GRUB的HTTP支持加载。如果想让内核走TFTP就要把路径改成TFTP里的相对路径并在启动参数里指明镜像源用HTTP。两种都能用区别是TFTP加载内核稍慢一点。5. 无人值守自动安装的细节实现5.1 autoinstall应答文件怎么写Ubuntu 22.04/24.04的autoinstall配置是一份YAML通常命名为user-data放在/var/www/html/autoinstall/下同时该目录还要有个空的meta-data文件。安装器会通过dsnocloud-net;s参数指定的地址去拉取这两个文件。# /var/www/html/autoinstall/user-data #cloud-config autoinstall: version: 1 locale: en_US.UTF-8 keyboard: layout: us network: version: 2 ethernets: ens33: dhcp4: true identity: hostname: pxe-node username: ubuntu password: $6$xxxxx$加密后的密码哈希 ssh: install-server: true allow-pw: true storage: layout: name: lvm packages: - openssh-server - vim - curl late-commands: - curtin in-target -- bash -c echo 安装完成 /root/install.log几个关键点必须强调。version: 1不能少缺了会报格式错误。password字段必须是加密后的哈希不能是明文生成方法用openssl passwd -6 你的密码。storage的layout可以是lvm、direct也可以自己写复杂分区方案新手建议先用lvm跑通。late-commands是安装收尾阶段执行的命令适合做初始化配置。5.2 分区方案与用户设置的取舍分区这块是最容易出问题的地方。默认的lvm布局会自动分区适合绝大多数场景。如果你需要特定分区比如单独的/home或/data就要写完整的storage.config格式比较繁琐容易写错。我的建议是先用默认布局跑通全流程确认能装机之后再换成自定义分区。用户和密码方面identity.username不能是rootUbuntu安装器不允许直接用root作为默认用户。密码哈希生成时注意单引号包裹明文避免shell转义。如果要禁用密码登录只用密钥在ssh段配置authorized-keys即可。这些细节配错表现出来就是安装走到一半报错退出或者装完登不进去。5.3 多版本多机器的分发思路机房环境往往既有22.04也有24.04的需求还要给不同机器设不同主机名。我的做法是按目录区分/var/www/html/ubuntu-22.04/和/var/www/html/ubuntu-24.04/各放一套镜像/var/www/html/autoinstall/22.04/和24.04/各放一套应答文件GRUB菜单里增加多个入口人工在启动时选。如果要全自动化可以用客户端的MAC地址做判断但dnsmasq按MAC下发不同引导配置比较麻烦投入产出比不高。主机名区分可以用late-commands结合客户端序列号或MAC做动态生成但那需要额外的脚本服务支持。对于十几台机器的场景手动选一下菜单成本并不高没必要过度设计。真正值得自动化的是装完之后的软件包安装和初始化脚本那部分用late-commands或者把脚本放到HTTP目录里让客户端装完后自动拉取执行收益明显更大。6. 常见问题排查实录6.1 客户端卡在DHCP阶段这是最常见的故障表现是网卡一直转圈、报PXE-E51: No DHCP or proxyDHCP offers were received或者PXE-E53: No boot filename received。前者说明客户端压根没收到DHCP回应原因通常是服务端dnsmasq没启动、网线没通、不在同一网段、防火墙拦了67/68端口。排查顺序是先sudo systemctl status dnsmasq确认服务在跑再在服务端tail -f /var/log/syslog | grep dnsmasq看有没有收到请求。如果日志里完全没有客户端请求记录问题在网络链路如果有请求但客户端没反应检查dhcp-range和接口名是否写对。PXE-E53说明DHCP收到了但filename字段没下发或内容不对。检查dhcp-boot的分支条件确认客户端架构标签匹配上了。一个容易踩的坑是有些网卡的client-arch值是0Legacy或7/9UEFI但如果客户端是UEFI却匹配到了Legacy分支就会下发pxelinux.0UEFI固件根本不认表现仍是E53。6.2 TFTP超时与文件找不到TFTP阶段报错一般是TFTP open timeout或File not found。超时通常是防火墙没放行69端口sudo ufw allow 69/udp搞定或者是tftp-root路径写错导致服务端在错误的目录里找文件。File not found要逐级核对路径dhcp-boot里写的文件名、TFTP根目录、文件实际位置三者必须一致。比如dhcp-boottag:efi-x86_64,bootx64.efi那文件就必须在/srv/tftp/bootx64.efi。权限问题也常见。TFTP进程以dnsmasq用户身份运行如果文件权限是600或者属主不对会读不到。我一般给/srv/tftp设成755、文件644一劳永逸。6.3 安装中途报错退回到手动界面配置了autoinstall但没生效多半是dsnocloud-net参数里的地址不对或者user-data文件格式有误。排查方法是在安装界面按CtrlAltF2进入另一个终端查看/var/log/cloud-init-output.log和/var/log/installer/下的日志通常能看到具体是哪个字段解析失败。YAML对缩进和冒号后的空格极其敏感一个tab就能让整个文件解析失败。我建议写完用python3 -c import yaml,sys; yaml.safe_load(open(user-data))验证一下语法。另一个坑是url参数。如果url指向的是镜像根目录结尾的斜杠不能少http://192.168.100.1/ubuntu和http://192.168.100.1/ubuntu/在某些版本上行为不同。还有启动参数里---是内核参数和cloud-init参数的分隔符漏了它安装器可能把autoinstall当普通内核参数忽略掉。6.4 常见问题速查表现象可能原因排查方向解决方式PXE-E51没收到DHCP服务状态、网线、防火墙启动dnsmasq、放行67/68PXE-E53有DHCP无引导文件dhcp-boot配置核对架构标签和文件名TFTP timeout69端口被拦防火墙、tftp-root放行udp69、检查路径File not found路径不一致逐级核对统一文件名和目录退回手动安装应答文件未加载启动参数、YAML语法检查ds参数、验证YAML速度奇慢走TFTP传镜像引导参数改用HTTP源6.5 几个实测有效的排查技巧第一服务端抓包最直接。sudo tcpdump -i ens33 -n port 67 or port 68 or port 69能看到完整的DHCP和TFTP交互客户端到底发了什么、服务端回了什么一目了然比猜快得多。第二分阶段验证。先用一台机器确认DHCP能通再加TFTP最后加HTTP和autoinstall每加一层验证一次出问题范围立即缩小。第三把服务端日志级别开到最高log-dhcp和log-queries都打开安装器日志也别放过这两边的信息一对绝大多数问题都能定位。7. 实操心得与后续优化7.1 批量装机时的几个经验真正上批量之后我发现最影响效率的不是技术细节而是流程规范。第一镜像和应答文件做好版本标记目录名带上版本和日期比如ubuntu-22.04-20240601避免半年后自己都忘了哪套配置对应哪个版本。第二保留一套手动安装入口任何自动化方案都可能因为镜像更新或硬件变化失效留个手动入口能在紧急时救场。第三装机网段和业务网段物理或逻辑隔离PXE服务器的DHCP只对装机网段生效否则一旦接入生产网后果很严重。关于性能如果有几十台机器同时装机HTTP源所在的磁盘IO会成为瓶颈。我试过把镜像放在SSD上并发装十台机时速度明显比机械盘稳。另外Nginx可以开sendfile和tcp_nopush对大文件传输有正向收益。如果规模再大可以考虑用多台HTTP镜像节点加负载均衡但那属于另一个量级的话题了。7.2 安全与隔离上的注意事项PXE这套东西说白了是谁在同网段谁就能被装系统所以安全边界必须清楚。第一装机服务只在专用网段开放不要接入办公网。第二DHCP服务只绑定到指定网卡interfaceens33和bind-interfaces都要写避免意外监听其他接口。第三autoinstall里的默认密码要么改成强密码哈希要么干脆只留SSH密钥登录装完的机器及时改密。第四late-commands里执行的内容要审查因为它是以root权限跑的一旦被篡改装出来的机器就带后门了。我自己维护这套环境有段时间了最大的感受是PXE的难点不在配置本身而在于对网络协议流程的理解和排查问题的耐心。把DHCP、TFTP、HTTP三个环节拆清楚把客户端启动的四个阶段对应上剩下的就是按部就班地调参数。第一次搭可能会折腾一整天但搭好之后装一台机器从开机到系统就绪只要十几分钟而且人不用守着这个投入产出比对于任何有批量装机需求的场景都很划算。
返回列表