新闻详情

新闻详情

首页 / 资讯中心 / 详情

PXE网络装机实战:从零搭建UEFI/BIOS双架构批量部署环境

发布时间:2026/9/26 23:49:23来源:尧图网络
PXE网络装机实战:从零搭建UEFI/BIOS双架构批量部署环境
我们单位机房日常装机量不小台式机加笔记本一年少说一百多台。以前都是拿U盘一台一台装系统版本还得对应好装完还要处理驱动和软件。后来试了试PXE网络装机说实话折腾了两天踩了不少坑但一旦环境跑通后面装系统就变成插上网线等几分钟的事了。这篇就分享一下我是怎么把一个完整的PXE网络安装环境从零搭起来并且做到重新部署时一分钟恢复可用。你照着做也能在十分钟内搞定基础环境再花一点时间把脚本固化下来以后就是真的一分钟拉起一套PXE服务。我这里讲的PXE环境不是只装个软件那么简单它是完整的网络启动安装系统链路包含DHCP分配地址、TFTP下发引导文件、HTTP或NFS提供安装源三块。你单独装个dnsmasq确实很快但新机器UEFI启动经常刷黑屏传统BIOS机器又可能找不到启动项老机器PXE启动慢还容易超时。所以我这篇文章会把这几个坎全部趟平给出我自己在用的完整配置包括双架构引导、自动化应答、镜像裁剪和一键恢复脚本适合机房运维、实验室管理、或者家里挂了多台机器想批量重装系统的朋友。我用的方案是 Ubuntu 22.04 服务器 dnsmasq tftp-hpa nginx nfs-kernel-server客户端支持传统BIOS和UEFI。这套组合的好处是组件全是系统源里的没有额外依赖装完就能用。下面是整个搭建过程的完整拆解。1. 内容整体设计与思路拆解1.1 为什么选dnsmasq而不是独立DHCP和TFTP很多人搭PXE环境习惯分开装 isc-dhcp-server 和 tftpd-hpa觉得专业。我也这么干过但实际用下来有两个痛点。一是配置文件分散DHCP和TFTP是两套服务日志分开记出问题要开两个窗口排查。二是isc-dhcp-server 在Ubuntu 22.04上已经进了维护期配置语法虽然稳定但改个参数要重启整条DHCP服务在线环境影响大。dnsmasq 一个人的活全干了DHCP、TFTP、DNS、甚至后面要做的HTTP缓存都能在一个配置文件里管理。我一开始担心它的DHCP功能不够强但实测下来地址池管理、MAC绑定、DHCP选项下发这些日常操作完全够用。更关键的是dnsmasq支持TFTP内嵌不用额外起tftp-hpa服务但我在生产环境里还是单独跑了tftp-hpa因为dnsmasq内置TFTP在多并发请求时偶尔有延迟可能和它单线程处理TFTP有关系。单独跑tftp-hpa的话并发稳一点两个服务也不冲突dnsmasq 负责 DHCP 和 TFTP 转发tftp-hpa 真正处理文件传输。1.2 PXE启动流程拆解PXE能跑通核心是把下面这五个环节串起来。客户端开机后网卡固件向网络发DHCP Discover这个包带着一个特殊标记意思是我要网络启动。dnsmasq收到后除了分配IP还会通过DHCP Option 66告诉客户端TFTP服务器的地址通过Option 67告诉它要下载的启动文件名。客户端拿到IP和启动文件名后通过TFTP从服务器拉取引导文件。传统BIOS拉的是pxelinux.0UEFI拉的是grubx64.efi或者shimx64.efi。拿到引导文件后客户端开始执行引导逻辑。pxelinux.0会读取pxelinux.cfg目录下的配置文件grub则会读取grub.cfg。配置文件中定义了内核和initrd的路径。客户端再次通过TFTP下载内核vmlinuz和initrd.img。内核启动后initrd负责加载必要的驱动挂载安装源然后进入真正的系统安装程序。我把这个流程记成一句话DHCP要地址TFTP拿引导引导读配置配置拉内核内核挂安装源。排查的时候按这个顺序走基本能定位90%的问题。1.3 一分钟搭建的真实含义标题说一分钟搭建指的是环境配置好之后重新部署一套全新的PXE服务只需要跑一个脚本。这个脚本做三件事生成dnsmasq和tftp-hpa的完整配置、解压ISO并建立HTTP和NFS安装源、写好UEFI和BIOS双架构的引导文件。跑完脚本PXE服务就是活的直接用客户端测试就能进入安装界面。这个一分钟能不能兑现取决于你是否理解了整个链路里每个文件的用途。所以我不会直接丢个脚本就完事而是先把每个配置文件的含义讲清楚最后再给你一键打包的脚本。你照着一步步操作理解了再跑脚本遇到问题就知道去哪里改。2. 环境准备与核心组件解析2.1 网络拓扑与参数规划我的测试环境很简单一台Ubuntu服务器双网卡。eth0接办公网用于管理服务器eth1接一个独立的交换机PXE客户机全部连这个交换机。这样做的好处是PXE的DHCP广播不会影响办公网DHCP服务也不怕和公司已有的路由器冲突。IP规划是PXE服务端eth1的地址为192.168.100.10/24IP地址池给192.168.100.100到192.168.100.200网关指向192.168.100.10DNS可以不分配或指向公共DNS。TFTP根目录放在/var/lib/tftpbootHTTP安装源目录放在/var/www/html/ubuntuNFS导出目录是/srv/pxe/nfs。提示如果你只有一张网卡PXE请求和服务器管理共用同一张网口也能跑但注意dnsmasq要明确监听这个网卡的地址不要把DHCP广播发到整个局域网。不然公司里其他电脑会莫名其妙获得你分配的地址。2.2 软件安装与基础配置在Ubuntu 22.04上安装这些包命令如下。sudo apt update sudo apt install -y dnsmasq tftp-hpa nginx nfs-kernel-server syslinux pxelinuxsyslinux和pxelinux这两个包提供传统BIOS引导文件其中pxelinux.0在/usr/lib/PXELINUX/pxelinux.0一些基础模块像ldlinux.c32、menu.c32在/usr/lib/syslinux/modules/bios/下面。UEFI引导文件需要用grub-efi-amd64-bin包里的grubx64.efiUbuntu的grub-efi-amd64-signed包也可以带签名版本更大但兼容Secure Boot。安装完成后先停掉默认服务防止它们在配置好之前就自动运行。sudo systemctl stop dnsmasq sudo systemctl stop tftpd-hpa sudo systemctl stop nginx sudo systemctl disable dnsmasq2.3 UEFI与传统BIOS的差异现在的新机器几乎都是UEFI启动老机器还有一部分是传统BIOS。PXE服务端必须同时兼容这两种。传统BIOS客户端会通过TFTP请求pxelinux.0文件pxelinux.0再读取配置文件。配置文件放在TFTP根目录的pxelinux.cfg目录里文件名可以具体到某个客户端的MAC地址也可以是个默认的default文件。UEFI客户端的行为不太一样。它的固件会先请求\EFI\BOOT\BOOTX64.EFI这个路径也就是可移动介质启动的标准路径。所以我们通常把grubx64.efi复制成\EFI\BOOT\BOOTX64.EFI然后把grub.cfg放在\EFI\BOOT\目录下。grub.cfg写好菜单指向内核和initrd。判断一个客户端是UEFI还是传统BIOS最简单的方法是看它启动时是出现蓝色的grub菜单还是紫色syslinux菜单。这是后面排查时的第一判断依据。3. 核心细节解析与实操要点3.1 dnsmasq配置文件详解dnsmasq的默认配置文件是/etc/dnsmasq.conf我不建议直接改默认文件而是新建一个专属配置比如/etc/dnsmasq.d/pxe.conf然后在主配置里开启conf-dir。这样代码清晰出问题也好回滚。完整的pxe.conf配置如下。port0 interfaceeth1 bind-interfaces dhcp-range192.168.100.100,192.168.100.200,255.255.255.0,12h dhcp-option3,192.168.100.10 dhcp-option6,114.114.114.114 enable-tftp tftp-root/var/lib/tftpboot dhcp-bootpxelinux.0逐行解释一下。port0表示关闭DNS服务我们不需要dnsmasq做DNS解析减少攻击面。interfaceeth1配合bind-interfaces确保DHCP只在eth1接口上工作避免广播到其他网段。dhcp-range是地址池范围注意那个12h是租约时间PXE安装场景建议不要太短我遇到过某些网卡在租约过期瞬间发起续租导致下载引导文件中断的情况设成2h或者12h都行。dhcp-bootpxelinux.0是给传统BIOS客户端指定的启动文件。但UEFI客户端启动时它也会收到这个配置然后尝试加载pxelinux.0结果肯定失败。所以dnsmasq需要识别客户端架构然后下发不同的引导文件。dnsmasq支持用dhcp-match指令区分客户端架构配置修改如下。dhcp-matchset:efi-x86_64,option:client-arch,7 dhcp-matchset:efi-x86_64,option:client-arch,9 dhcp-boottag:efi-x86_64,efi/EFI/BOOT/BOOTX64.EFI dhcp-boottag:efi-x86_64,efi/EFI/BOOT/BOOTX64.EFI dhcp-bootpxelinux.0option:client-arch 的取值中7代表x86_64 UEFI9代表x86_64 UEFI with CB。我在实际中遇到部分新机器报的是9而不是7所以两个都要匹配。经过这样配置后UEFI和传统BIOS客户端各取所需互不干扰。3.2 TFTP根目录与引导文件组织TFTP根目录结构我建议这样规划以区分不同架构和不同系统。/var/lib/tftpboot/ ├── pxelinux.0 ├── pxelinux.cfg/ │ └── default ├── efi/ │ └── EFI/ │ └── BOOT/ │ ├── BOOTX64.EFI │ ├── grub.cfg │ └── shimx64.efi ├── images/ │ └── ubuntu-22.04/ │ ├── vmlinuz │ └── initrd.img └── memdisk把传统BIOS的文件放在根目录UEFI的文件放到efi子目录下这是我自己长期使用的约定。好处是dnsmasq的dhcp-boot配置能区分前缀TFTP查找路径也不会乱。传统BIOS的引导文件pxelinux.0可以从syslinux包里复制过来同时需要把ldlinux.c32这个模块放到和pxelinux.0同一个目录。这个文件容易被忽视少了它pxelinux.0能加载但是马上报错找不到ldlinux.c32屏幕直接卡住。UEFI部分系统安装grub-efi-amd64-bin包后grubx64.efi位于/usr/lib/grub/x86_64-efi/grubx64.efi。我们把它复制到tftpboot/efi/EFI/BOOT/BOOTX64.EFI注意一定要改名成BOOTX64.EFI因为UEFI固件按这个固定路径去查找。为了兼容部分开了Secure Boot的机器把shimx64.efi也复制过去固件优先加载shimshim再引导grubx64.efi。我测过的机器里戴尔和联想的商用机默认开启Secure Boot用shim方案能直接进菜单省去关闭Secure Boot的麻烦。3.3 设备选择传统BIOS和UEFI的配置文件差异传统BIOS的pxelinux默认配置写在pxelinux.cfg/default里这个文件决定了菜单显示和内核加载参数。default install prompt 0 timeout 100 label install menu label ^Install Ubuntu 22.04 kernel images/ubuntu-22.04/vmlinuz append initrdimages/ubuntu-22.04/initrd.img ipdhcp urlhttp://192.168.100.10/ubuntu/22.04/ auto quiet其中url参数指向HTTP安装源这样内核加载完后会自动通过网络安装源启动安装程序。底层原理是initrd中有一个叫casper或者debian-installer的组件它会尝试挂载url指定的路径然后从里面读取squashfs或其他安装组件。UEFI的grub.cfg则不一样它是grub的语法格式。set timeout30 menuentry Install Ubuntu 22.04 (UEFI) { linux efi/images/ubuntu-22.04/vmlinuz ipdhcp urlhttp://192.168.100.10/ubuntu/22.04/ auto quiet initrd efi/images/ubuntu-22.04/initrd.img }注意grub.cfg里的linux和initrd路径是相对于TFTP根目录的。我的grub.cfg放在efi/EFI/BOOT/下但路径写的是efi/images/ubuntu-22.04/vmlinuz这个要和你实际的TFTP目录结构对应上。我一开始就在这里栽了跟头grub菜单出来了选安装项却报错文件找不到检查了半天发现是相对路径算错了。3.4 HTTP与NFS安装源的选择Ubuntu的ISO文件有接近5GB如果直接扔到HTTP里传局域网速度足够几百MB的文件几十秒就搞定了。但ISO里的squashfs文件是压缩过的安装时需要先解压再挂载这会导致CPU在客户端上占高安装速度反而不如直接用NFS。NFS方式不需要解压这一层客户端内核启动后直接通过NFS挂载ISO解压后的目录读取文件的速度快CPU开销还低。我实测同一台机器用NFS装Ubuntu 22.04整个安装过程比HTTP方式能快30%到40%。配NFS很简单把ISO解压到/srv/pxe/nfs/ubuntu-22.04然后编辑/etc/exports。/srv/pxe/nfs 192.168.100.0/24(ro,sync,no_root_squash,no_subtree_check)客户端内核参数改成如下。ipdhcp netbootnfs nfsroot192.168.100.10:/srv/pxe/nfs/ubuntu-22.04HTTP和NFS两种方式我到现在都保留了。日常少量装机用HTTP因为只要nginx在跑就行NFS服务挂了也能装系统。批量装很多台性能要求高的时候切到NFS速度快不少。3.5 ISO镜像的挂载与解压每次下载一个Ubuntu ISO我习惯先挂载ISO到/mnt/iso然后把内容同步到HTTP和NFS目录。这样一份镜像两种发布方式都能提供服务。sudo mount -o loop ubuntu-22.04.3-desktop-amd64.iso /mnt/iso sudo mkdir -p /var/www/html/ubuntu/22.04 sudo cp -a /mnt/iso/. /var/www/html/ubuntu/22.04/ sudo mkdir -p /srv/pxe/nfs/ubuntu-22.04 sudo cp -a /mnt/iso/. /srv/pxe/nfs/ubuntu-22.04/复制大文件需要一点时间但如果只是重复使用ISO可以做个符号链接自动挂载省去拷贝那一步。不过考虑到NFS性能最好还是完整复制过去网络读取的时候文件系统随机读比连续读差不少拷贝后顺序读性能更好。注意NFS导出目录的属主和权限要设置对不能是root挂载后直接拷贝出来的目录带奇怪的权限。我通常把导出目录chown成nobody:nogroup然后在/etc/exports里加no_root_squash这样客户端能正常读写。4. 一键脚本化把整个环境固化成1分钟部署4.1 脚本的整体思路手动操作理解了所有组件后就可以把流程固化成脚本。脚本要处理的状态包括依赖安装、dnsmasq配置生成、TFTP引导文件部署、ISO同步。我写脚本的原则很朴素脚本跑完服务是活的客户端一测就能用不需要任何额外手动步骤。脚本的核心是把之前手动执行的命令集中在一个可重复运行的流程里设计要点如下。#!/bin/bash set -e SERVER_IP192.168.100.10 TFTP_ROOT/var/lib/tftpboot HTTP_ROOT/var/www/html/ubuntu NFS_ROOT/srv/pxe/nfs apt update apt install -y dnsmasq tftp-hpa nginx nfs-kernel-server syslinux pxelinux grub-efi-amd64-bin mkdir -p ${TFTP_ROOT}/pxelinux.cfg ${TFTP_ROOT}/efi/EFI/BOOT ${TFTP_ROOT}/images/ubuntu-22.04 mkdir -p ${HTTP_ROOT} ${NFS_ROOT} cp /usr/lib/PXELINUX/pxelinux.0 ${TFTP_ROOT}/ cp /usr/lib/syslinux/modules/bios/ldlinux.c32 ${TFTP_ROOT}/ cp /usr/lib/grub/x86_64-efi/grubx64.efi ${TFTP_ROOT}/efi/EFI/BOOT/BOOTX64.EFI cp /usr/lib/grub/x86_64-efi/shimx64.efi ${TFTP_ROOT}/efi/EFI/BOOT/shimx64.efi cp /media/iso/vmlinuz ${TFTP_ROOT}/images/ubuntu-22.04/ cp /media/iso/initrd.img ${TFTP_ROOT}/images/ubuntu-22.04/ cat /etc/dnsmasq.d/pxe.conf EOF port0 interfaceeth1 bind-interfaces dhcp-range192.168.100.100,192.168.100.200,255.255.255.0,12h dhcp-option3,192.168.100.10 dhcp-option6,114.114.114.114 enable-tftp tftp-root/var/lib/tftpboot dhcp-matchset:efi-x86_64,option:client-arch,7 dhcp-matchset:efi-x86_64,option:client-arch,9 dhcp-boottag:efi-x86_64,efi/EFI/BOOT/BOOTX64.EFI dhcp-bootpxelinux.0 EOF cat ${TFTP_ROOT}/pxelinux.cfg/default EOF default install prompt 0 timeout 100 label install menu label ^Install Ubuntu 22.04 kernel images/ubuntu-22.04/vmlinuz append initrdimages/ubuntu-22.04/initrd.img ipdhcp netbootnfs nfsroot192.168.100.10:/srv/pxe/nfs/ubuntu-22.04 auto quiet EOF cat ${TFTP_ROOT}/efi/EFI/BOOT/grub.cfg EOF set timeout30 menuentry Install Ubuntu 22.04 (UEFI) { linux efi/images/ubuntu-22.04/vmlinuz ipdhcp netbootnfs nfsroot192.168.100.10:/srv/pxe/nfs/ubuntu-22.04 auto quiet initrd efi/images/ubuntu-22.04/initrd.img } EOF systemctl enable dnsmasq tftpd-hpa nginx nfs-kernel-server systemctl restart dnsmasq tftpd-hpa nginx nfs-kernel-server这里有一个执行顺序的坑要特别说明。脚本里把pxelinux.cfg/default写到了TFTP目录但传统BIOS的默认菜单不一定会在所有机器上生效。部分网卡获取到IP后会先按MAC地址找配置文件也就是pxelinux.cfg/01-你的网卡MAC地址。如果你没有这个文件pxelinux会回退到default。我建议在pxelinux.cfg目录下建一个01-开头的示例文件内容复制default这样万一有机器因为某些原因不读default也有一个入口。4.2 实现批量安装的关键Kickstart自动应答PXE只解决网络引导的问题真正批量部署还得配合自动应答文件。Ubuntu的自动应答使用cloud-init或者debian-installer的preseed格式。我用的是preseed它能在安装过程中自动填好语言、键盘、分区、用户、软件源这些问题全程无人值守。把preseed文件放到HTTP目录下比如/var/www/html/preseed/ubuntu-22.04.seed然后在pxelinux.cfg/default的append参数里加一句preseed/urlhttp://192.168.100.10/preseed/ubuntu-22.04.seed。grub.cfg同样加这个参数。一个最小的preseed文件长这样。d-i debian-installer/locale string en_US d-i keyboard-configuration/xkb-keymap select us d-i netcfg/choose_interface select auto d-i netcfg/get_hostname string ubuntu-pxe d-i netcfg/get_domain string local d-i time/zone string Asia/Shanghai d-i partman-auto/method string regular d-i partman-auto/choose_recipe select atomic d-i partman-partitioning/confirm_write_new_label boolean true d-i partman/confirm_write_new_partition boolean true d-i partman/confirm_nooverwrite boolean true d-i partman/confirm boolean true d-i passwd/root-login boolean false d-i passwd/user-fullname string pxeadmin d-i passwd/username string pxeadmin d-i passwd/user-password password 123456 d-i passwd/user-password-again password 123456 d-i grub-installer/only_debian boolean true d-i grub-installer/bootdev string default d-i finish-install/reboot_in_progress note d-i preseed/late_command string in-target apt-get update; in-target apt-get install -y openssh-server这个文件的配置逻辑是主线没有复杂的交互选项。用了atomic分区方案意思是整块磁盘分一个根分区加一个swap最省事。实际生产环境你可以改成lvm或者自定义方案。preseed的写法有个细节在Ubuntu 20.04以后debian-installer还是使用preseed没问题但Ubuntu Server 22.04官方更推荐用autoinstall语法是YAML格式封装在cloud-init里。如果你装的是Desktop版或者Server版但想快速跑通preseed依然可用我用的就是preseed。arm架构机器上preseed兼容性稍差但x86上稳得很。4.3 多ISO镜像如何管理机房里不可能只装一个Ubuntu大概率还有CentOS、Rocky、Debian甚至国产的OpenEuler。我在PXE里建了多级目录每个系统的镜像文件独立放置然后在引导菜单里加多个label。传统BIOS的pxelinux.cfg/default可以这样扩展。label ubuntu22 menu label ^Install Ubuntu 22.04 kernel images/ubuntu-22.04/vmlinuz append initrdimages/ubuntu-22.04/initrd.img ipdhcp netbootnfs nfsroot192.168.100.10:/srv/pxe/nfs/ubuntu-22.04 auto quiet label ubuntu24 menu label ^Install Ubuntu 24.04 kernel images/ubuntu-24.04/vmlinuz append initrdimages/ubuntu-24.04/initrd.img ipdhcp netbootnfs nfsroot192.168.100.10:/srv/pxe/nfs/ubuntu-24.04 auto quiet label debian12 menu label ^Install Debian 12 kernel images/debian-12/vmlinuz append initrdimages/debian-12/initrd.img ipdhcp netbootnfs nfsroot192.168.100.10:/srv/pxe/nfs/debian-12 auto quiet但注意Debian和Ubuntu的内核路径、加载参数有细微差别例如Debian的server内核在installer目录里不一定是vmlinuz根路径需要你根据ISO解压后的实际目录调整。UEFI的grub.cfg对应加menuentry同样要注意路径。menuentry Install Ubuntu 24.04 (UEFI) { linux efi/images/ubuntu-24.04/vmlinuz ipdhcp netbootnfs nfsroot192.168.100.10:/srv/pxe/nfs/ubuntu-24.04 auto quiet initrd efi/images/ubuntu-24.04/initrd.img }如果有的系统用的还是bios模式有的已经是纯UEFI在菜单里就要尽可能多覆盖。我建议每个系统镜像都同时保留bios和uefi两套目录反正TFTP根目录也不差那几百MB。4.4 虚拟化环境中的PXE需求很多人在VMware Workstation或者Proxmox VE里也需要PXE装系统。虚拟机的网卡PXE行为跟物理机有点区别常见的是VMware Workstation默认用e1000网卡的ROM它能发起PXE但是UEFI模式有时不进TFTP反而会卡在No Boot File Found界面。解决方法很粗暴在虚拟机设置里改成使用物理网卡的MAC地址或者把虚拟机的固件类型改成BIOS而不是UEFI。如果你的虚拟机是用来测试PXE脚本的建议先开一台BIOS模式的虚拟机跑通传统引导链路再去验证UEFI链路。VMware的UEFI支持PXE但和物理机相比启动顺序稍有差异不是所有版本都一样逐一测过才稳。Proxmox VE里创建的虚拟机OVMF固件的PXE启动变量默认是关闭状态需要在虚拟机的引导设置里勾选启用PXE。原生OVMF虽然支持但在部分主板上还需要手动添加启动项比较麻烦。物理机上UEFI PXE大概率没问题虚拟化环境反而坑多。5. 常见问题与排查实录5.1 客户端获取不到IP地址这个问题的可能性很多。先确认物理链路网线灯亮不亮客户端和PXE服务器是不是在同一个二层网络。然后检查dnsmasq状态。sudo systemctl status dnsmasq sudo tail -f /var/log/syslog | grep -i dhcp如果dnsmasq日志完全没记录DHCP Discover说明DHCP广播没有到达服务器。大概率是防火墙的问题。Ubuntu的ufw默认可能开着需要放行DHCP端口。sudo ufw allow 67/udp sudo ufw allow 69/udp sudo ufw allow 4011/udp还有一个容易忽略的点网卡的PXE模式。有些笔记本网卡默认是UEFI且Disabled状态需要在BIOS里把Network Boot设置为Enabled。戴尔机器在BIOS的Secure Boot→Secure Boot Enable旁边有PXE Boot联想的ThinkPad则是在Network菜单下设置Wake on LAN和PXE启动项。5.2 TFTP下载引导文件超时TFTP底层走UDP没有TCP的可靠机制早期TFTP每包512字节传一个pxelinux.0都要好几秒。现在的tftp-hpa默认支持blksize协商可以把包大小提高到1468或8192字节如果还慢就手动指定tftp-blksize选项。dnsmasq内置的TFTP有个限制默认blksize也支持协商但客户端不强求大包的话还是按512来所以速度不稳定。tftp-hpa单独跑就没有这个问题它默认使用blksize 1468配合千兆网很快。如果你看到客户端停在TFTP超时但在服务端日志里没有任何tftp-hpa记录检查tftp-hpa的配置文件/etc/default/tftpd-hpa。TFTP_USERNAMEtftp TFTP_DIRECTORY/var/lib/tftpboot TFTP_ADDRESS:69 TFTP_OPTIONS--secure --create确认TFTP_DIRECTORY指向的路径和dnsmasq的tftp-root一致。dnsmasq用enable-tftptftp-roottftp-hpa用TFTP_DIRECTORY两边指向同一个根目录文件路径才能对上。5.3 UEFI客户端启动黑屏UEFI下PXE启动常见三种黑屏现象屏幕全黑无反应、卡在grub命令行、启动加载一半就报错。全黑无反应基本是BOOTX64.EFI路径不对。UEFI固件会按\EFI\BOOT\BOOTX64.EFI来找你的TFTP目录里必须在efi/EFI/BOOT/BOOTX64.EFI这个位置有文件而且大小写要完全一致。Windows的UEFI固件在查找文件时不区分大小写但Linux的grub是区分大小写的macOS也有些特殊。我这里说的是PXE场景固件本身路径查找不区分大小写但grub找内核时区分两个地方都要检查。卡在grub命令行通常是grub.cfg路径没找对或者grub.cfg里面菜单项注释有问题。在grub命令行手动执行ls命令确认(boot)/efi/EFI/BOOT/路径存在。如果grub能正常识别TFTP根目录它会显示hd0或者memdisk之类此时可以手动敲配置加载内核试试。启动加载一半报错一般是内核参数里网络配置有问题。我在某台机器上报错是initramfs unpacking failed: Invalid magic at start of archive原因是initrd.img复制不完整或者TFTP传输损坏。重新从ISO复制一次就解决了。5.4 传统BIOS机器grub识别成UEFI我遇到过一台很老的台式机BIOS里面明明写着Legacy Only但PXE引导时它却去加载BOOTX64.EFI而不是pxelinux.0。原因是它的网卡ROM支持UEFI PXE部分主板固件在PXE初始化时会选择UEFI路径优先。解决方法是dnsmasq的dhcp-boot仍保留pxelinux.0作为默认同时不去匹配client-arch 0也就是传统BIOS架构标识。部分网卡其实也会发送架构0但机器实现了UEFI优先。面对这种情况我做过一个兼容配置在pxelinux.cfg/default里加上UEFI的内核也同时指向pxelinux然后用efi64的syslinux模块但效果一般后面直接在这些老机器上关了PXE用U盘装。如果你遇到这种机器多建议按网卡MAC分流在pxelinux.cfg目录下创建带MAC的配置文件里面的内核加载参数写上grub路径并用chainload方式变相引导GRUB。5.5 防火墙规则影响NFS挂载NFS在安装时需要访问2049端口但如果你的服务器开了ufw光放行2049还不够。NFS还依赖mountd的状态端口默认是随机分配的。我在ufw下吃过亏服务器都能ping通但客户端挂载NFS一直超时。解决办法是在/etc/nfs.conf里固定mountd端口例如设定为4002。[mountd] port4002然后防火墙放行。sudo ufw allow 2049/tcp sudo ufw allow 2049/udp sudo ufw allow 4002/tcp sudo ufw allow 4002/udp这个配置我自己踩过坑后固定在了脚本里每次重建环境都加进去。5.6 多系统引导的菜单美化默认的syslinux菜单比较简陋只有一行文字。PXE调试时装一次系统无所谓但长期运维用菜单能不能清楚区分系统版本和架构很重要。syslinux支持vesamenu可以做出图形界面。前提是把menu.c32、vesamenu.c32这些模块从/usr/lib/syslinux/modules/bios/复制到TFTP根目录。UI vesamenu.c32 MENU TITLE PXE Boot Menu MENU COLOR title 1;36;44 #ffffffff #00000000 MENU COLOR border 30;44 #ff00aa00 #00000000 label ubuntu22 menu label ^Install Ubuntu 22.04 kernel images/ubuntu-22.04/vmlinuz append initrdimages/ubuntu-22.04/initrd.img ipdhcp netbootnfs nfsroot192.168.100.10:/srv/pxe/nfs/ubuntu-22.04 auto quietgrub的菜单美化比syslinux简单set color_normal和set color_highlight就能调颜色菜单字体默认够用。6. 实操心得与进阶建议整个PXE环境搭建过程最耗时间的不是装软件而是排查那些看起来都对但就是不工作的问题。我总结出两条经验对你后面的维护会有帮助。第一条是日志永远是最可信的。dnsmasq日志看DHCP交互tftp-hpa日志看TFTP文件传输nginx和nfs服务日志看安装源访问。任何一次PXE失败顺着日志的时间线查基本能定位到是哪一步断了。遇到UEFI黑屏时在客户端上接一个显示器确实看不到细节但grub支持串口输出服务器端有IPMI或者SOL功能的话远程的串口日志里能看到grub的详细报错。这个在物理机房部署时特别有用。第二条是把整个PXE环境版本化。我以前手改配置文件改完忘记备份环境崩了重来很痛苦。现在我把整个/var/lib/tftpboot、/etc/dnsmasq.d、/etc/exports收进一个git仓库。每调整一次配置提交一次变更出问题直接git diff看改动或者git checkout回滚。刚开始可能觉得麻烦等你维护超过三个月就知道这个操作有多值。PXE环境的扩展方向其实还有不少比如在菜单里加上Windows镜像的引导配合Windows PE的wim文件实现Windows网络安装或者把Rocky Linux、Debian、FreeBSD都集成进菜单做成一个统一入口的装机平台。已经有同事在做类似的项目把整个PXE环境做成Docker镜像分发到分支机房的物理机上五秒钟就能起一个新环境。这些都是后话但基础链路通了后面怎么扩展都有底气。我在实际维护中还发现一个不太起眼但很重要的点ISO解压出来的目录最好定期确认权限。PXE服务端以root运行nginx和nfs但tftp-hpa以tftp用户运行。如果TFTP根目录下某些文件的权限是root-onlytftp-hpa可能无法读取。所以我把整个tftp根目录统一chown成tftp:tftpnginx和nfs的目录另设置两边不交叉。这个细节如果忽略你会遇到传统BIOS能引导但UEFI下载initrd失败这种诡异问题实际上是tftp用户读不了efi目录下的文件。另外就是PXE服务本身要做一个健康检查脚本。每十分钟检查一次dnsmasq和tftp-hpa是否在监听端口不在就写日志并尝试重启。机房的服务器偶尔会重启掉线加上这个自愈机制能省掉很多大半夜被叫起来处理装机异常的麻烦。最后再分享一个小技巧我习惯在每个镜像的部署菜单里加一个memtest86的选项memtest86的efi文件直接放到TFTP目录就能用。装完系统测内存顺手排查硬件问题一套环境干两件事。你后面接手的机器多了就会明白这个选项有多实用。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

3个核心动作拆解北京网络营销培训最佳实践避坑指南 2026/9/27 0:55:38

3个核心动作拆解北京网络营销培训最佳实践避坑指南

3个核心动作拆解北京网络营销培训最佳实践避坑指南 很多老板一上来就问我:模板网站太丑不够用,能不能直接换个皮肤?我直接泼冷水:换皮解决不了根本问题。如果你还在为那些千篇一律的模板头疼,说明你还没真正搞懂 最佳实践 的逻辑。在北京做…

阅读更多 →
WorkBuddy + Flask + SQLite:个人开发者日更建站实战指南 2026/9/27 0:55:38

WorkBuddy + Flask + SQLite:个人开发者日更建站实战指南

1. 为什么我选择 WorkBuddy Flask SQLite 这套组合1.1 从零建站这件事,工具选型决定了你后面要填多少坑做独立站这件事,我前前后后折腾过不少方案。最早用 WordPress,插件装了一堆,主题换了七八个,结果页面加载慢得离…

阅读更多 →
LXMusic音源配置原理与JS脚本开发实战 2026/9/27 0:55:11

LXMusic音源配置原理与JS脚本开发实战

1. 项目概述:为什么一个播放器能聚合全网音乐?LXMusic——这个名字在2024年之后的中文音乐工具圈里,几乎成了“免费听歌可行性”的代名词。它不是流媒体平台,不卖会员,不搞算法推荐,甚至没有自己的曲库服务…

阅读更多 →
Ubuntu 22.04 CUDA安装全指南:驱动与Toolkit版本匹配避坑实战 2026/9/27 0:55:05

Ubuntu 22.04 CUDA安装全指南:驱动与Toolkit版本匹配避坑实战

1. 安装前的思路梳理:先把“驱动”和“CUDA”的关系搞清楚装CUDA这事,看着就是几步命令的事,但真正动手翻车的概率非常高。我在Ubuntu上装过不下十次CUDA,踩过的坑包括装完重启黑屏、驱动卸载不干净、环境变量配错导致系统命令失效…

阅读更多 →
Claude Architect认证到底考什么?一个重度用户用半年实战逐项拆解TaoToken配置 2026/9/27 0:55:05

Claude Architect认证到底考什么?一个重度用户用半年实战逐项拆解TaoToken配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
PHP自助打印小程序源码实战:从文件上传到打印任务下发全链路拆解 2026/9/27 0:55:05

PHP自助打印小程序源码实战:从文件上传到打印任务下发全链路拆解

简介:这是一套面向开发者与创业者的自助图文打印系统小程序源码,采用全新UI设计,后端基于PHP(ThinkPHP框架)开发,适合需要快速搭建线上打印下单平台的技术人员、学生课程设计或小型商户二次开发使用。资源包…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉