跳转至

链式加载 Windows 部署服务

Windows 部署服务(WDS)是一组服务和 API,通过使用 PXE、DHCP 和 TFTP 来引导 WinPE(Windows 预安装环境),从而简化 Windows 操作系统的安装。你可以把它看作提供类似于带服务器端脚本的 iPXE 的功能,客户端根据各种条件(例如硬件架构)获得启动配置和镜像。

本应用笔记介绍如何以直接的方式从 iPXE 链式加载 WDS。

配置 WDS TFTP 服务

WDS TFTP 服务依赖于注册表项 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/WDSServer/Providers/WDSTFTP/ReadFilter,它控制哪些 TFTP 路径被映射到由同一位置的 RootFolder 注册表项定义的包含各种安装文件的目录。

RegEdit WDSTFTP 根据现有配置,很可能需要添加额外的模式才能使 iPXE 和 WDS 启动程序正常工作。

确保 ReadFilter 列表中包含以下模式:

  • boot/*
  • boot\*
  • /boot/*
  • \boot\*
  • /boot\*

这允许正斜杠和反斜杠的所有相关组合,无论是否带有前缀斜杠。最后一个条目特别奇怪,但正如下面示例所示,它实际上由被 iPXE 链式加载后的初始 WDS 网络启动程序使用。

更改 ReadFilter 列表后,重新加载 TFTP 服务以确保它接受完整的模式列表。

链式加载 wdsnbp.com

加载初始 WDS 网络启动程序 wdsnbp.com 可以直接从 iPXE shell 完成,也可以通过菜单项完成。唯一需要修改的是 DHCP next-server 参数,它将让 wdsnbp.com 知道要与哪台服务器通信。

请务必设置 DHCP 选项,使其可供 PXE NBP 使用。例如,next-server 参数可以通过 netX/next-server 设置。

链式加载 wdsnbp.com 的 iPXE 命令示例:

  set netX/next-server ip.of.wds.server
  imgexec tftp://${netX/next-server}/boot/x86/wdsnbp.com

WDS 启动过程

wdsnbp.com 启动后,它会与 DHCP next-server 参数中指定的 WDS 服务器发起会话。该会话协议结合使用 DHCP 请求和响应以及 TFTP,向客户端提供适当的引导加载程序(例如 bootmgr.exebootmgfw.efi)和启动配置数据(BCD)。

wdsnbp.com 程序执行客户端架构检测,并通过 WDS 会话将其报告回服务器。此会话协议把 DHCP 用作 RPC 服务端点,来回传递的数据(例如架构信息)编码在 DHCP 选项 250 中。连同选项 252(WDS 用来指示 BCD 文件名)和 DHCP file 字段(指向客户端的下一个网络启动程序),DHCP+TFTP 协商完成了 WDS 会话。

启动过程示例

  1. 客户端:iPXE 从 ip.of.wds.server 请求 TFTP /boot/x86/wdsnbp.com
  2. 客户端:wdsnbp.comip.of.wds.server 发送直接 DHCP 请求,未定义选项 250 和 252。
  3. 服务器:DHCP 响应:
    • filename: boot\x86\wdsnbp.com
    • option 250: 0b0101100400000001ff
    • option 252: \Tmp\x86{<GUID>}.bcd
  4. 客户端:wdsnbp.comip.of.wds.server 发送直接 DHCP 请求:
    • option 250: 0d0208000e010001020006ff
  5. 服务器:DHCP 响应:
    • filename: boot\x86\wdsnbp.com
    • option 250: 0b0101100400000001ff
    • option 252: \Tmp\x86x64{GUID}.bcd
  6. 客户端:wdsnbp.comip.of.wds.server 请求 TFTP /boot\x86\wdsnbp.com。注意斜杠的使用。
  7. 客户端:wdsnbp.comip.of.wds.server 发送直接 DHCP 请求:
    • option 250: 0c01010d0208000e010001020006ff
  8. 服务器:DHCP 响应:
    • filename: boot\x64\pxeboot.n12
    • option 250: 0b0101100400000001ff
    • option 252: \Tmp\x86x64{GUID}.bcd
  9. 客户端:wdsnbp.com 请求 TFTP /boot\x64\pxeboot.n12
  10. 客户端:pxeboot 请求 TFTP /boot\x64\bootmgr.exe
  11. 客户端:pxeboot 请求 TFTP \Tmp\x86x64{GUID}.bcd
  12. 客户端:bootmgr.exe 执行并读取 BCD。

故障排除

WDS in Wireshark 由于 WDS 启动程序的错误报告很差,首选的故障排除工具应该是像 Wireshark 这样的网络数据包分析器。数据包可以使用 tcpdumptshark 等其他工具转储,然后再加载到 Wireshark 中进行分析。

这是一个 Wireshark 过滤器,通过省略 TFTP 操作码 3(数据包)和 4(确认),只显示 DHCP 和有用的 TFTP 数据包:

  bootp || !(tftp.opcode==3 || tftp.opcode==4)

需要特别注意的事项:

  • TFTP 和 DHCP 请求的目标 IP。
  • TFTP 请求文件名。
  • 来自 WDS 服务器的 TFTP 错误代码。
  • 客户端请求和服务器响应中的 DHCP 选项。
  • Windows 中的 WDS 事件日志。

TFTP 下载错误

确保在 iPXE 命令中正确指定了 DHCP next-server 参数。如果配置不正确,从网络抓包中应该可以明显看出 wdsnbp.com 的第一个 DHCP 或 TFTP 请求指向了错误的 IP。

确保 WDS TFTP 服务器的读取过滤器已映射相关的路径名。检查 DHCP 数据包中斜杠的使用方式,并检查 ''ReadFilter'' 注册表设置是否配置正确。

TFTP 循环

如果 wdsnbp.compxeboot.n12 陷入请求循环,很可能是初始 TFTP 下载成功了,但后续下载失败。这可能是因为 iPXE 在 TFTP 文件路径中使用正斜杠,而 WDS 启动程序倾向于混合使用正斜杠和反斜杠。

确保 WDS TFTP 服务器的读取过滤器已映射相关的路径名。检查 DHCP 数据包中斜杠的使用方式,并检查 ''ReadFilter'' 注册表设置是否配置正确。

替代方案

从 iPXE 链式加载 WDS 的好处是它提供了一个完全可用且隔离的 WDS 设置,同时 iPXE 仍然作为初始启动程序保持控制,WDS 只是众多备选启动选项中的又一个选择。WDS 保持对其自身配置的完全控制。

WDS 的一个缺点是它使用 TFTP(尽管带有允许更大接收窗口的扩展),这远不如 HTTP 快,特别是当客户端和服务器之间的往返时间超过几毫秒时。这导致大型 WIM 镜像的加载时间较长,特别是在中高延迟的链路上。

WDS 的 PXE 机制的一个很好的替代方案是 wimboot,这是一个接管 wdsnbp.compxeboot.n12 角色的引导加载程序。它让你通过 HTTP 获取所有相关文件,并把执行权交给 bootmgr.exe。不过也有一个缺点:WDS 失去了对动态 BCD 启动菜单的控制,因为改为提供静态 BCD 文件。

参考资料