PXE的简单过程为:

  1. 机器上电,从PXE启动;
  2. 固件(BIOS或UEFI)发送dhcp请求,请求中包含PXE相关的选项
  3. DHCP server收到DHCP请求,返回DHCP response
  4. PXE client收到DHCP回复,其中包含bootfile-name和bootfile-size。
  5. PXE从DHCP server下载bootfile并执行。bootfile可能是bootloader,bootloader接下来加载kernel等。

根据架构提供不同的PXE启动文件

一个PXE/DHCP server可以给不同架构的机器提供服务。而不同架构有不同的指令集和执行环境,所以bootfile无法通用。 那么当DHCP server收到不同机器的DHCP请求时,如何判断应该返回哪个bootfile呢?

RFC 4578中定义了PXE的DHCP option。 其中包含了客户端系统架构选项,根据规范,PXE客户端的DHCP请求必须包含该选项。格式如下:

                Code  Len  16-bit Type
               +----+-----+-----+-----+
               | 93 |  n  | n1  | n2  |
               +----+-----+-----+-----+

dnsmasq支持通过该选项识别客户端架构,示例设置为:

dhcp-match=set:UEFI64_x86,option:client-arch,7
dhcp-boot=tag:UEFI64_x86,grub/grubx64.efi,boothost,10.10.10.1

# inspect the vendor class string and match the text to set the tag
dhcp-match=set:EFI_aarch64,option:client-arch,11
dhcp-boot=tag:EFI_aarch64,grub/grubaa64.efi,boothost,10.10.10.1

以上片段把client-arch为7的PXE 请求tag设置为UEFI64_x86,并使用bootfile grub/grubx64.efi,类似地,对aarch64,使用grubaa64.efi作为bootfile。

References