PXE(Preboot eXecute Environment) 不是一门新技术,实际上它已经非常成熟了。早在上个世纪末就已经有这项技术了。仔细看看,它已经有20年左右的历史(~2000年)了啊!PXE技术一直被广泛运用在机房,网吧等需要大批量维护计算机系统的场合。因为给数十数百台计算机分配安装介质是不实际的。通过PXE技术,可以让局域网内部的机器通过网络启动系统安装程序,进而统一部署。网吧的无盘(硬盘)系统也是基于PXE开发出来的。
什么是PXE?
PXE 是由 Intel 公司开发的最新技术,工作于 Client/Server 的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端(客户端)基本软件设置,从而引导预先安装在服务器中的终端操作系统。
一个PXE服务系统由局域网中的 DHCP 服务器,TFTP 服务器组成。其中 DHCP 服务器在分配客户机IP地址外,还提供 Options 66(Next Server, 下一启动服务器), Options 67(Boot File Name, 启动文件名称) 字段。注意,此处 DHCP 必须兼容 BOOTP 协议,存粹的 DHCP 笔者测试失败。TFTP 负责提供启动文件。可以理解为一个局域网公开的文件服务器。
配置PXE服务端环境
基本DHCP的搭建
上文提到,PXE服务环境由一个DHCP(BOOTP)服务与一个TFTP服务组成。所以,我们首先要配置DHCP服务器。因为笔者自家华为路由器(光猫原厂界面)提供的DHCP服务端软件不兼容BOOTP,所以测试失败。这里我们以 Windows DHCP Server 为例。

按照常规途径配置DHCP服务器,保证基本配置工作正常:Options 3 路由器(默认网关);Options 6 DNS。同时,新建一个 Options 66,内容为 TFTP 服务器的IP。
定义厂商类(Define vendor classes)
因为现在的计算机BIOS以及PXE ROM复杂多样,系统架构也不尽相同。DHCP 协议中,预留了 Options 60 字段来供 DHCP 服务端判断客户端类型并给出对应的DHCP应答。通过 60 号字段,我们可以知道 PXE 客户端的处理器架构类型,进而发送适合这台计算机的启动信息。这对多架构混合的计算机机房大有帮助。
右击 IPv4 选项,点击“定义厂商类”。点击“添加”。

输入名称(自行定义),以及下方的数据内容。这里列出4中常见的系统架构:
UEFI x64: PXEClient:Arch:00007
UEFI x86: PXEClient:Arch:00006
UEFI x86 & x64 混合 (VMware ESXi 6 虚拟机会发送这个字段): PXEClient:Arch:00009
传统BIOS: PXEClient:Arch:00000
例如图中新建一个UEFI 32位(x86) 供应商类,则需要在下方输入 “PXEClient:Arch:00006”。点击确定保存。
定义判断策略
右击定义域下方的策略,点击新建策略。

输入策略名称,点击下一步。然后点击添加,在值中选择刚刚新建的厂商类,勾选附加通配符,依次点击 “添加”,“确定”。

选择否,全局域网覆盖(根据实际情况设置)。

选择 Options 67,数据项中输入对应架构的启动文件名。点击下一步,保存。

于是,DHCP至此配置完毕。
配置TFTP服务器
笔者采用的是 Windows 系统,可以使用 tftp64。原因吗,简单易用。将 Current Directory 设置为 PXE 启动文件所在目录。点击 Settings,只保留 TFTP Server。不使用 tftpd 自带的 DHCP Server。

如图设置 TFTP服务器,将 Base Directory 也同样设置为 PXE 启动文件所在的目录。安全性选择只读(Read Only)。勾选 PXE 兼容性(PXE Compatibility)。勾选启动系统时隐藏窗口(Hide Window at startup)。勾选 TFTP 监听地址(Bind TFTP to this address) 为服务器所在IP。点击确定保存,然后去服务管理器重启 tftpd 服务。

至此,TFTPD 配置完毕。接下来就是将PE/操作系统安装文件中的引导文件提取至TFTPD设置的根目录中即可。文件名要与DHCP中设置的一致。
测试PXE启动
测试环境:Hyper-V 第二世代主机(UEFI)。




参考(References)
1. RFC 2132(DHCP Options and BOOTP Vendor Extensions): https://tools.ietf.org/html/rfc2132
2. Use DHCP to detect UEFI or Legacy BIOS system and PXE boot to SCCM: http://www.itfaq.dk/2016/07/27/use-dhcp-to-detect-uefi-or-legacy-bios-system-and-pxe-boot-to-sccm/
注:笔者所使用的启动文件提取自《任意WINPE改造成PXE网启工具-支持UEFI+bios双启动》 UEFI + BIOS 方案中的文件,只需要替换其中的 boot.wim 即可。http://www.upantool.com/iso/cdrom/10609.html