AIGC标识 从局域网到跨站点:PXE 装机环境搭建与 BIOS/UEFI 排障随笔

本文由 AI 根据实际搭建与排障记录协助整理。PE10 的 UEFI 启动已由现场确认成功;资源可下载、进入 PE 与完整安装系统是三个不同的验收阶段。

一、起点:镜像已经有了,能不能统一从网络装机?

这次的需求很直接:把 Windows、Linux 和维护用 PE 镜像集中放在一台服务器上,让待安装电脑从网卡启动,选择系统后安装。既要在局域网使用,也希望到现场后,通过一台 Windows 电脑连接远端安装服务器。

最初容易把问题理解成“把 ISO 放进目录,再开一个 TFTP 服务”。实际做下来发现,需要连通的是整条启动链,而不是单个端口。

本次服务器地址为 192.168.10.220,HTTP 服务端口为 8088。现场电脑的 LAN 口为 192.168.50.1/24,待安装设备通过网线接到这个口。以下地址只是这套环境的例子,换环境要统一修改。

二、先拆开启动链,后面排错才有方向

待安装电脑的 PXE 固件
  → 现场 DHCP:分配 IP、网关和启动文件
  → TFTP:下载与固件架构匹配的 iPXE
  → iPXE:读取 HTTP 菜单
  ├─ Windows:wimboot → WinPE → SMB 安装源 → 安装器
  ├─ 自定义 PE:wimboot → 启动管理器 / BCD / PE WIM
  └─ Linux:本版本内核 + initrd → 本版本安装源

DHCP 负责告诉机器“自己是谁、去哪启动”;TFTP 负责最初的小型引导程序;HTTP 负责菜单和后续资源。Windows 进入 PE 后,仍需要网络驱动、地址、路由以及安装源访问能力。

因此,看到 iPXE 菜单,只能说明前半段基本正常;进入 PE,也不等于 Windows 安装源已经可用。

ISO 也不是通用网络启动格式。固件或引导器能读取 ISO,不代表内核启动后仍能找到原来的虚拟光驱。本项目按系统采用不同方式:Windows 使用安装介质里的 WIM,Ubuntu 使用同一 ISO 内的内核和 initrd,其他发行版按各自安装器的要求提供软件源。

三、服务端怎么组织

运行目录按用途拆开:

/home/javen03/data/netboot/
├── iso/                  原始安装镜像
├── http/
│   ├── boot.ipxe         实际生效的菜单
│   ├── boot/wimboot
│   ├── windows/          Windows 10 安装目录
│   ├── windows11/        Windows 11 安装目录
│   ├── pe/               自定义 PE 资源
│   └── ubuntu/           对应 ISO 的内核和 initrd
└── 其他服务配置与运行文件

HTTP、TFTP、SMB 分别由 netboot-http、netboot-tftp、netboot-smb 服务提供。仓库保存配置和脚本,镜像及微软安装文件不上传到 GitHub。

这里有个后来很关键的细节:仓库中的 examples/boot.ipxe 是示例,HTTP 根目录中的 boot.ipxe 才是客户端实际读取的菜单。改了示例但没部署,现场不会发生变化;只更新菜单却漏了资源,也会立即出现 404。

完整从零部署步骤放在 项目部署 Demo。这篇主要记录设计与排障,不建议直接拿历史脚本覆盖正在运行的环境。

四、DHCP 必须分清 BIOS、UEFI 和已经加载的 iPXE

局域网路由器使用 dnsmasq 时,核心规则如下。它们只是 PXE 分流部分,不能代替完整 DHCP 地址池配置。

dhcp-vendorclass=set:netboot_pxe,PXEClient
dhcp-userclass=set:netboot_ipxe,iPXE
dhcp-match=set:netboot_bios,option:client-arch,0
dhcp-match=set:netboot_efi64,option:client-arch,7
dhcp-match=set:netboot_efi64,option:client-arch,9
dhcp-boot=tag:netboot_ipxe,http://192.168.10.220:8088/boot.ipxe
dhcp-boot=tag:netboot_pxe,tag:!netboot_ipxe,tag:netboot_bios,undionly.kpxe,,192.168.10.220
dhcp-boot=tag:netboot_pxe,tag:!netboot_ipxe,tag:netboot_efi64,ipxe.efi,,192.168.10.220

Legacy BIOS 先取 undionly.kpxe,UEFI x64 先取 ipxe.efi。iPXE 再请求配置时,要给它 HTTP 菜单,否则可能反复加载自己。

现场没有路由器时,由 Windows 电脑提供 DHCP。我们后来做了带 GUI 的便携 DHCP/PXE 工具,可以修改网卡、地址池、网关、DNS、TFTP 地址和启动文件。这里需要准确说明:它是 Go 实现的 DHCPv4/PXE 工具,不是完整 dnsmasq 的 Windows 移植版。

Windows 版本也踩了两个坑:GUI 将 []string 当作 walk.ListModel 导致异常;网络代码调用 Windows 未实现的接口过滤 API,编译成功却启动即退出。修复后使用 Windows 的出站接口选择机制,但不能把它描述成已经实现严格的入站网卡隔离。应在独立装机网段使用,并核对防火墙和实际收发包。

五、跨站点安装:现场 DHCP 与远端资源各司其职

现场电脑可以同时承担本地 DHCP 与网络转发,但这两个功能是独立的。

待安装电脑 192.168.50.100
       │ 网线
现场 Windows 电脑 LAN 192.168.50.1
       │ 已建立的转发 / 隧道链路
远端安装服务器 192.168.10.220

现场 DHCP 可以分配 .50.100 至 .50.199,并把已经配置好转发的 .50.1 作为网关。远端服务器需要有返回客户端的路由,或者现场电脑采用适当的 NAT。服务器共享允许范围也要覆盖实际看到的客户端来源地址。

“我的电脑能访问服务器”与“接在电脑 LAN 口的裸机能访问服务器”不是同一项测试。DHCP 不会自动开启 Windows 的路由转发,隧道连通也不会自动把 DHCP 广播送到远端。

不使用 VPN 时,可以设计本地引导加公网 HTTPS 资源的方案,但 Windows 安装源也要改成适合该方式的流程,例如 PE 下载到本地后安装。本次实现仍以局域网或已有站点互联为前提,不能仅凭 TFTP 可达就宣称完整互联网装机已经实现,也不应把当前 SMB 共享直接暴露到公网。

六、Windows 进了 PE,却提示找不到网络路径

现场出现过:

发生系统错误 53。
找不到网络路径。
NETWORK SHARE CONNECTION FAILED.

这个阶段应检查 WinPE 自己的网络,而不是继续改最初的 PXE 配置。先查看 ipconfig 和路由,再确认共享服务、共享名、访问规则,以及 PE 是否加载了网卡驱动。

当时手动连接 Windows 11 安装源成功:

net use Z: \\192.168.10.220\netboot-win11 /user:netboot-guest ""

这个命令依赖本项目 Samba 的访客映射配置,不是所有共享都能使用空密码。正式部署可以改为受控的只读安装账户。

手动成功后,需要把操作放进 PE 启动脚本:先执行 wpeinit,再有限次数重试共享连接,成功才启动安装程序;失败则保留窗口、输出 IP 和错误,不能让安装器静默退出。

本项目使用的启动方式包含:

X:\sources\setup.exe /installfrom:Z:\sources\install.wim

这要求当前 PE 中存在相应安装器,且共享里的镜像路径正确。Windows 10、Windows 11 应各自使用匹配的启动环境与安装源。boot.wim 的 Setup 索引要检查,不能把本次使用的 index=2 当成所有镜像的固定规则。

七、PE10:为什么昨天 BIOS 能进,今天 UEFI 不行?

这是本次最反复的一段。

1. 先确认启动模式发生了变化

切回 BIOS 后 PE 可以启动,是有价值的对照结果:WIM 不一定坏了,应重点检查 UEFI 那条链路。此次 PE8 是 x86 版本,当前 UEFI x64 链路不支持它,因此菜单提示使用 Legacy BIOS;PE10 则继续处理 UEFI 兼容性。

2. FATAL: no bootloader file found

自定义 PE WIM 可能删减了标准启动资源。只下载 WIM,不保证 wimboot 能从中提取合适的启动管理器。我们检查后为该 PE 补充了 EFI 启动管理器,并明确指定它在内存中的文件名。

wimboot 支持自动提取和显式提供启动管理器,具体行为见 wimboot 官方文档。

3. 补了菜单,接着出现 HTTP Not found

这次错误很直接:菜单已经引用 /pe/bootmgfw.efi,文件却还停留在准备目录,没有安装到实际 HTTP 根目录。

不要只执行 ls 就结束验证。应同时检查客户端使用的 URL,例如:

curl -fI http://192.168.10.220:8088/pe/bootmgfw.efi
curl -fI http://192.168.10.220:8088/pe/boot.sdi

文件存在、服务有读取权限、HTTP 映射正确,缺一不可。

4. Windows Boot Manager 报 0xc000000f

屏幕提示 \EFI\Microsoft\Boot\BCD 缺失或包含错误,不能据此直接断言“服务器少建了这个目录”。原 PE 光盘 BCD 中包含 \modules\PE10.WIM 等路径,而网络启动时提供的是内存中的 boot.wim,两者并不对应。

wimboot 自己会提供虚拟目录映射。官方要求使用平面虚拟文件名,并解释了 --name 与尾部文件名对 UEFI/BIOS 的兼容作用,见 wimboot 架构说明。因此,这次修复重点是统一 BCD 内容与注入文件名,而不是重复注入带完整 EFI 路径的 BCD。

最终现场确认可用的 PE10 UEFI 核心片段如下;它依赖本项目已经准备好的文件,不是任意 PE 的通用替换配方:

#!ipxe
set base http://192.168.10.220:8088
kernel ${base}/boot/wimboot
initrd --name bootx64.efi ${base}/pe/bootmgfw.efi bootx64.efi
initrd --name BCD ${base}/windows/efi/microsoft/boot/bcd BCD
initrd --name boot.sdi ${base}/pe/boot.sdi boot.sdi
initrd --name boot.wim ${base}/pe/pe10.wim boot.wim
boot

BIOS 分支保留此前可用的 bootmgr 与 BIOS BCD。最终 PE10 在 UEFI 下进入成功;PE8 保留 Legacy BIOS 入口。这个结果不代表所有 PE 工具、驱动和后续安装操作都已验证。

八、Linux 的根文件系统错误要沿自己的链路查

测试中还出现过:

VFS: Unable to mount root fs on unknown-block(0,0)

它只能说明内核没能挂载根文件系统,不能单凭这一行断言硬盘损坏。网络启动时要先检查 initrd 是否真正加载、内核与 initrd 是否来自同一镜像,以及安装器能否按启动参数找到根文件系统或 ISO。

不同 Linux 发行版不能套一份菜单:Ubuntu Desktop 常见的是 casper 与对应 ISO;Debian 的 netboot 需要软件包镜像源;Rocky/Alma 的安装树还涉及 .treeinfo、安装器 stage2 和仓库元数据。新增系统时,先按发行版拆分,再验证具体版本。

九、新增 Windows 11、Windows 10 或 Linux 时怎么做

往 iso/ 放文件只是第一步,菜单不会自动生成。建议每个版本使用独立 ID,例如 win11-extra:

  1. 校验 ISO,检查启动文件、架构和 WIM 索引。
  2. 解压到新的版本目录,不覆盖现有 windows11/。
  3. Windows 创建独立只读共享,按 WIM、ESD 或 SWM 的实际格式准备安装源。
  4. 配套修改 PE 启动脚本和菜单入口,核对 HTTP 路径与 SMB 路径。
  5. Linux 从同一版本介质提取内核和 initrd,并按发行版配置安装源参数。
  6. 先验证文件传输,再验证进入安装器,最后做完整安装及重启验收。

具体命令、ESD/SWM 处理、Ubuntu/Debian/Rocky 类示例和回滚步骤,已单独整理在 新增系统详细指南。仓库历史版本可能包含排障期间的配置,使用时要核对所选提交与实际部署版本。

十、真机进了 EFI Shell,不代表 PXE 服务坏了

有一台设备开机进入 EFI Shell,启动菜单只显示 Shell、硬盘和 Setup。进入固件后检查网络启动项:本次 Aptio 界面的 Network Stack 和 IPv4 PXE Support 应启用,保存后重新进入启动菜单,选择网卡对应的 UEFI IPv4 项。

这台机器画面右侧标注的保存键是 F4,不要机械套用其他主板的 F10。Shell 下可先输入 exit 返回固件界面。若保存重启后仍没有网卡启动项,再检查板载 LAN、UEFI 网卡驱动支持和对应固件选项。

十一、这次留下的排障习惯

最有效的方法,是每次只判断当前失败的阶段:

现象 优先核对
没有网络启动项 固件网络栈、网卡启用状态、启动模式
PXE 取不到地址 现场 DHCP、网线、地址池、UDP 67/68
TFTP 超时 引导服务器地址、文件名、路径与网络可达性
HTTP Not found 实际部署目录、URL、大小写、服务映射
no bootloader file found 启动管理器、架构、虚拟文件名
BCD 0xc000000f BCD 内容与 WIM/SDI 路径是否对应
PE 网络错误 53 PE 驱动、IP、路由、共享名与 SMB 服务
Linux 无法挂载根文件系统 initrd 加载、版本匹配、安装源参数

另一条经验是保留已知可用的 BIOS 入口,单独验证 UEFI 分支;每次发布把菜单、资源、启动脚本一起核对。这样出现问题时,可以明确回滚哪一部分。

目前最明确的现场结论是 PE10 的 UEFI 启动已经恢复。Windows/Linux 的完整安装、首次重启以及不同硬件兼容性仍应分别记录,不能用一次下载成功代替全部验收。

项目与配置示例:Javen881/PXE-NetBoot。

posted @ 2026-10-29 15:49  javen_xiao  阅读(10)  评论(0)    收藏  举报