资讯详情

资讯详情

PXE网络装机实战:从DHCP/TFTP配置到无人值守批量部署

做运维这些年装机方式换了好几轮但有一件事始终绕不开PXE网络装机。不管是机房一次性交付几十台裸机还是测试环境隔几天就要重来一轮PXE都能把“逐台插U盘”变成“开机等着就行”。这篇记录不是PPT式介绍而是从网络规划到排障的完整实操过程适合刚接触PXE的运维新人也适合想把手动装机改造成自动交付的实验管理员参考。1. 为什么选择PXE装机方案选型与底层逻辑1.1 单台安装的痛点先说说我为什么要折腾PXE。早些年做批量交付手里拿着一个系统U盘和一张配置清单一台一台装。装一台大概四十分钟听着不多但十台、二十台下来一天就没了。更麻烦的是U盘插拔多了容易坏镜像版本稍微更新一次所有U盘都要重新做一遍最后自己都分不清哪个U盘是哪个版本。真正的痛点在于“状态不可控”。手动安装的时候每台机器的分区策略、软件包选择、网络配置靠人肉保证总会漏掉一两项。比如上一台忘了勾选某个包下一台分区写错了巡检的时候根本不知道是哪台出的问题。版本漂移更头疼同一个环境里不同批次机器装了不同小版本的系统后续排查问题永远要先问一句“这台是什么版本”。PXE网络装机解决的正是这个问题安装介质放在网络上引导文件、安装源、应答文件都集中管理。不需要U盘不需要光驱只要机器网卡支持PXE启动开机后自动从网络拿配置、拉镜像、执行无人值守安装。版本统一、配置统一、过程可审计批量交付的效率完全不一样。1.2 PXE工作的完整链路PXE的核心流程用一句话概括机器开机后BIOS/UEFI里的PXE ROM向网络发起启动请求经过DHCP拿到IP地址和引导文件位置然后通过TFTP下载引导加载器再由引导加载器加载内核和initrd最终从网络安装源拉取系统包完成安装。把这条链路拆开看涉及四个关键服务DHCP负责分配IP地址同时通过next-server和filename两个选项告诉客户端“去哪个服务器下载哪个引导文件”。TFTP负责传输pxelinux.0、内核vmlinuz、initrd.img等小而关键的启动文件。HTTP或NFS/FTP负责提供完整的系统安装树包括repodata、软件包等大体积内容。应答文件如kickstart告诉安装程序分区方案、软件包列表、网络配置实现无人值守。用点餐来类比DHCP是服务员确认你坐哪桌TFTP是先上一份菜单HTTP/NFS是后厨的食材库应答文件就是你已经勾好的“不要香菜、少辣”备注。PXE装机就是把整条点餐链路自动化了。1.3 选型边界什么时候用PXE什么时候不用PXE不是万能药。我的判断标准很简单凡是“批量、重复、版本固定”的装机需求PXE都值得上凡是“就装一两台、机器零散、网络环境混乱”的场景可能U盘更快。具体来说PXE适合这些场景机房新交付几十台裸机需要在同一天内完成系统安装。测试环境频繁重建每周甚至每天都要恢复到基准状态。边缘节点或远程机房人不在现场但机器支持网络启动。需要统一系统版本、统一软件基线、统一分区策略的环境。不适合的场景也有只装一两台临时机器搭一套PXE服务的成本反而更高。网络跨了三层且没有配置DHCP中继PXE广播请求到不了服务端。硬件过于老旧网卡不支持PXE或者固件有兼容性问题。需要保留硬盘已有数据、做整盘迁移的场景PXE不是为“保留数据”设计的。还要区分PXE和克隆装机。PXE是从零安装走的是正规安装流程系统是全新生成的克隆装机一般是扇区复制速度快但容易带着源机器的驱动和配置问题。两者各有使用场景PXE更适合“交付干净系统”的目标。2. 部署环境搭建让网络先听懂PXE的请求2.1 DHCP配置与关键参数PXE装机的第一个关键点就是DHCP。我在实际配置里用的还是dhcpd配置思路对dnsmasq等其他服务同样适用。以一段典型配置为例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; next-server 192.168.10.10; filename pxelinux.0; }这里的next-server是TFTP服务器地址filename是客户端要去下载的引导文件。这两项是PXE能跑起来的核心少一个都不行。很多人把DHCP配好、IP能分出来就以为成功了结果卡在PXE-E61错误提示就是filename没有生效或者TFTP服务器上找不到对应文件。跨VLAN场景需要额外注意。如果PXE客户端在另一个网段DHCP Discover是广播请求默认到不了服务器必须在交换机或路由器上配置DHCP中继。思科设备叫ip helper-address华为设备叫dhcp relay指向DHCP/TFTP服务器所在地址。中继配好之后DHCP Offer里的next-server、filename一样能带回客户端。还有一点实操经验DHCP地址池不要和现有办公网混用最好单独划一个PXE装机VLAN地址池放小一点装完即走。避免装机网络和业务网络互相干扰也让抓包排查更简单。2.2 TFTP目录与引导文件摆放TFTP是PXE链路里最容易踩坑的一环。它本身实现简单于是很多人在配置时忽视了细节。以tftp-hpa为例默认根目录通常是/var/lib/tftpboot核心引导文件至少要准备这些pxelinux.0PXE引导加载器主程序。ldlinux.c32运行时库和pxelinux.0配套使用。menu.c32菜单界面模块可选但强烈建议。vmlinuz、initrd.img对应内核和初始文件系统需要从安装镜像里拷贝出来。目录结构类似这样/var/lib/tftpboot/ ├── pxelinux.0 ├── ldlinux.c32 ├── menu.c32 ├── pxelinux.cfg/ │ └── default ├── vmlinuz └── initrd.imgpxelinux.cfg/default是默认启动菜单PXE客户端会用MAC地址或IP地址去匹配更具体的配置文件匹配不上才用default。所以想给特定机器指定不同安装配置可以在pxelinux.cfg目录下放一个01-xx-xx-xx-xx-xx-xx命名的文件前缀01-加MAC地址优先级最高。UEFI环境要注意现在的服务器很多默认用UEFI启动PXE引导链和传统BIOS不一样。最常见的问题是传统BIOS用pxelinux.0很顺利UEFI机器却提示找不到文件。这里不能简单复制一个grubx64.efi就完事而是要确认DHCP里给不同固件类型返回不同的filename。在dhcpd里可以用class pxeclients按客户端架构区分也可以简单地把UEFI引导文件单独放目录保证TFTP根目录路径正确。TFTPServer本身也要注意有些发行版默认关闭了TFTP服务或者防火墙没放行UDP 69端口。可以用tftp命令本地拉一次文件验证比如tftp 192.168.10.10 -c get pxelinux.0能成功说明服务正常失败就先去查服务状态和防火墙。2.3 安装源与应答文件的准备TFTP负责把引导文件喂给客户端但真正的安装包来自HTTP。用HTTP做安装源的好处是并发性能好、配置简单还能顺便提供应答文件。我会把ISO镜像解压到Web目录下比如/var/www/html/pxe/centos/然后确保客户端能访问以下关键路径http://192.168.10.10/pxe/centos/repodata/repomd.xml这个repomd.xml存在说明仓库元数据没有问题。之前在排查安装源404时第一件事就是wget这个文件测连通性比看安装日志快很多。应答文件通常叫ks.cfg可以放在同一台HTTP服务器上路径类似http://192.168.10.10/pxe/ks.cfg。安装启动参数里用ksurl指定它。注意应答文件里的软件包源地址要和HTTP安装源保持一致尤其是url --url参数否则安装程序可能找不到仓库。安全方面如果装了SELinux且是Enforcing模式要让Web目录下这些文件能被读取否则客户端能拿到引导文件却拉不到安装源。系统日志里会出现一堆denied记录看到网络源超时或拒绝连接时先看一眼SELinux状态省得绕圈子。3. 实操过程与核心环节实现3.1 从开机到进系统的完整流程完整跑一遍PXE装机的过程我习惯把预期现象写下来方便判断问题出在哪一环。准备好这些条件后一台PXE服务器、一台待安装机器、服务器和客户端在同一二层网络或配置了DHCP中继就可以开始了待安装机器开机按快捷键进入启动设备选择菜单选择“网络启动”或“PXE Boot”。不同厂商按键不同常见的是F12也有用F2、F11的。机器发出DHCP Discover广播DHCP服务器回应Offer里面带着IP地址、TFTP服务器地址和引导文件名。这一步在客户端屏幕上能看到正在获取IP地址的提示。客户端通过TFTP下载pxelinux.0然后执行它。屏幕会进入PXE启动菜单出现我预先写好的系统版本列表。选中某个菜单项后PXELINUX加载vmlinuz和initrd.img内核启动安装程序anaconda随之运行。anaconda解析启动参数里的inst.repo和ks地址从HTTP安装源读取仓库元数据同时下载应答文件。应答文件生效后安装过程不再交互自动完成分区、软件包安装、root密码设置、网络配置最后重启进入新系统。整个流程看上去顺理成章但每一个环节都是一个检查点。我在现场调试时惯用的验证路径是先确认DHCP是否分配了正确的IP再确认TFTP能否手动拉到pxelinux.0然后抓包看HTTP请求最后看anaconda日志。顺序不能乱否则问题定位特别费时间。3.2 一份可用的kickstart配置示例以Red Hat系为例ks.cfg内容大致是这样的# 语言和键盘 lang en_US.UTF-8 keyboard us # 安装源 url --urlhttp://192.168.10.10/pxe/centos/ # 网络配置 network --bootprotodhcp --devicelink # root密码这里是明文示例生产环境建议用grub-crypt生成的加密串 rootpw --iscrypted $6$... # 服务 services --enabledchronyd # 分区 clearpart --all --initlabel part /boot --fstypexfs --size1024 part pv.01 --size1 --grow volgroup vg0 pv.01 logvol / --fstypexfs --nameroot --vgnamevg0 --size20480 logvol swap --nameswap --vgnamevg0 --size4096 # 软件包 %packages core standard vim %end # 安装后脚本 %post echo pxe install done /root/pxe_install.log %end这份配置有几个细节值得说。分区部分我故意给根分区预留20GB把剩余空间留给后续运维扩容而不是一次性全部分配。实际环境里“留一半给未来”比“一次性用完”稳妥得多。如果磁盘是多块盘最好给每块盘明确disk参数或者用ignoreDisk避免anaconda选错盘清掉数据。%packages里尽量用开头的环境分组而不是逐个列软件包名这样版本升级时不容易漏包。%post段可以用来写安装完成后的自动化脚本比如注册监控、写入SSH密钥、调整内核参数。%post跑到最后看不到交互界面输出想确认执行结果就把日志写到/root下装完看文件是否存在比盲目相信脚本有效靠谱。网络配置这里--devicelink表示使用第一个连接状态的网卡。老机器网卡名可能是eth0新机器可能是ens33这种我一般在启动参数里加上net.ifnames0 biosdevname0强制用eth0的命名后续写作和排查都方便。3.3 启动菜单与批量部署的技巧PXE启动菜单直接决定用户能选什么系统、什么参数我通常写一个精简版default文件DEFAULT menu.c32 PROMPT 0 MENU TITLE PXE Boot Menu LABEL centos MENU LABEL Install CentOS X KERNEL vmlinuz APPEND initrdinitrd.img inst.repohttp://192.168.10.10/pxe/centos/ kshttp://192.168.10.10/pxe/ks.cfgAPPEND这行的参数很关键。inst.repo指定安装源ks指定应答文件地址两者拼错一个安装程序就会退回交互模式无人值守直接失效。我在实际配置时吃过亏地址写对了但路径里多了一个空格导致内核解析参数失败折腾了大半天。批量部署时有几个技巧很实用。第一用MAC地址匹配指定配置。比如机房里有不同用途的机器可以在pxelinux.cfg/目录下放01-3c-ec-ef-00-00-01这类文件单独指定该机器的内核参数和安装分区策略。全局的default兜底特定的机器独立覆盖灵活度很高。第二串行化安装避免带宽抢占。几十台机器同时从HTTP拉安装包网卡和硬盘都会成为瓶颈尤其千兆网络下并发二三十台时下载速度会被拖到很慢。可以自己在Web层做限速也可以让安装脚本随机延时几秒再启动。真要硬扛大批量我建议把PXE服务器接在装机专用交换机的上联口不要把安装流量和业务流量混在同一个广播域里。第三配合ipmitool这类带外管理工具批量开机设置好PXE首启顺序后一次命令就能把所有机器拉起来进入PXE安装流程。批量交付时这就是省时间的核心操作。4. 常见问题与排查技巧实录4.1 高频问题速查与处理PXE装机遇到最多的问题我整理成一张表方便对照现象可能原因处理方式PXE-E61: Media test failureDHCP没给filename或TFTP服务器找不到文件检查DHCP的next-server和filename检查TFTP目录下文件是否存在TFTP超时防火墙拦截UDP 69或TFTP服务监听地址不对放行UDP 69端口用tftp命令手动拉文件验证出现菜单但加载内核后黑屏内核文件损坏或内存不足重新拷贝vmlinuz和initrd.img确认镜像完整安装程序卡在“设置软件源”HTTP访问失败SELinux拦截仓库路径错误用wget测试repomd.xml检查SELinux和防火墙应答文件不生效安装需要手动点ks地址没拼对或anaconda没拿到参数核对APPEND参数里的ks地址在安装终端查看efi shell之前的日志分区选错盘多块磁盘时没有显式指定磁盘在分区指令里增加ignoredisk --only-usesda或明确磁盘参数这张表虽然短但基本覆盖了我遇到过的八成问题。特别是PXE-E61这个报错很多新手以为是网卡坏了其实大部分是TFTP路径或DHCP参数的问题和硬件没关系。4.2 排查链路与工具组合PXE装机排障我的习惯是“从客户端视角走一遍请求链路”而不是一上来就翻服务器日志。第一步在客户端屏幕上确认网卡是否拿到了IP地址。如果卡在DHCP阶段用tcpdump在服务器上抓包tcpdump -i eth0 port 67 or port 68 -n看到DHCP Discover进来但没有Offer说明服务器没响应检查DHCP配置或地址池耗尽看到Offer发出但客户端没继续请求可能跨VLAN中继有问题。第二步确认TFTP下载链路。抓包时可以临时过滤tcpdump -i eth0 udp port 69 -n正常情况会看到RRQ请求和DATA响应如果只有请求没有响应基本是TFTP服务端的问题。第三步确认HTTP安装源。客户端进入anaconda之后可以切换到终端控制台用curl或wget直接访问安装源地址。这一步经常能发现防火墙策略或者SELinux导致的问题。第四步看安装日志。anaconda会把日志写到/tmp目录大部分发行版会保存到/var/log/anaconda/通过终端查看anaconda.log、packaging.log等文件。比如软件包安装失败日志里会明确写出是网络中断还是仓库损坏。这套排查顺序核心思路是从底层往上层走链路通了再谈文件文件通了再谈配置配置通了再谈包。顺着这个顺序走大部分问题半小时内能定位。4.3 一些不常见但很气人的坑常规问题之外还有几个隐藏坑值得单独记录。SecureBoot是我最早栽过的跟头。新买的服务器默认开启SecureBoot传统PXE引导的pxelinux.0没有有效签名直接被固件拒之门外。解决办法有两个要么在BIOS/UEFI设置里关闭SecureBoot要么使用带签名的shim引导链。一线运维图省事普遍选前者但是生产环境严格管控时关SecureBoot可能要走审批流程提前确认清楚。UEFI和BIOS的双栈引导混乱也很常见。PXE服务器既要服务老机器又要服务新机器放在同一个TFTP根目录时务必按架构分目录或者在DHCP里用option 93区分客户端架构。不分开的话UEFI机器去加载BIOS的pxelinux.0会出现加载失败或菜单错乱。网卡固件里的PXE ROM配置也需要注意。部分机器的PXE启动默认关闭或者启动顺序排在硬盘之后。装完系统后如果没把启动顺序改回本地盘可能每次重启都先进PXE再倒回硬盘白白多等几十秒。批量交付时我会在单台试跑成功后就固定一套BIOS配置标准尽量保持所有机器一致。网络源断流是大批量安装时另一个头疼问题。并发太高、交换机端口协商异常、网线质量差都可能导致下载中断。应对办法是把安装源放在离客户端最近的服务器上有条件就搭本地仓库。5. 进阶玩法与日常维护习惯5.1 从PXE装机走向自动化交付PXE只是让“装好系统”这一步自动化了后面接踵而来的问题是谁来初始化配置、谁来跟踪版本、谁来保证一致性。我现在的做法是PXE做完基础系统安装后直接回调配置管理工具由配置管理工具接管后续动作。比如在%post段里写入一行命令让新装系统注册到配置管理服务端然后推送基础配置时区、DNS、监控Agent、日志转发、SSH密钥。这样每一次PXE装机不再是“装一个裸系统”而是“交付出一个符合基线标准的节点”。版本管理方面系统ISO和应答文件都纳入版本控制每一个发布版本对应一个明确的ks.cfg和仓库快照。这样可以精确回溯“这个集群当时是用哪个版本装的”排查问题时少扯皮。5.2 装机后的几个注意事项PXE装机完成后不是立刻就算交付了。第一确认启动顺序已经改回本地硬盘。我曾经一次性批量装完几十台机器第二天发现所有机器重启后都停在PXE菜单原因就是安装时没有统一调整BIOS启动顺序。第二确认数据盘不会被重复分区。如果有机器是重装系统而不是新交付答案是先人工确认磁盘数据情况再放行安装。我习惯在分布式装机前先做一次MAC地址白名单白名单外的机器不提供服务降低误执行安装的风险。第三装机网络和业务网络尽量分开。把DHCP、TFTP、HTTP放在独立VLAN里业务网络出问题时不会牵连装机服务反过来也一样。第四定期检查安装源仓库的可用性。镜像版本的小版本更新会导致旧的repomd.xml失效仓库没有同步好的话后续装机拉到一半失败排查起来很花时间。5.3 一点个人习惯最后说点我自己的习惯谈不上标准答案但确实是踩坑踩出来的。PXE服务我永远单独放一台轻量虚拟机或者低配物理机不跟业务混跑。DHCP地址池固定成一小段只服务装机场景。TFTP和HTTP的访问日志常开着平时没人看出问题时它就是你最快的线索。还有一个小技巧每次改完DHCP、TFTP或菜单配置我都会在真正的PXE客户端上跑一次最小验证而不是只靠配置文件语法检查。因为PXE链路涉及的组件多配置“看起来对”和“实际能跑通”是两回事。PXE网络装机这套体系越早搭起来后面越省心。第一次搭建可能要花半天但它帮你节省的是以后每个批量装机日的完整工作。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →