大多数情况下,局域网内都已经有DHCP服务了,一般是通过路由器或则三层的交换机提供DHCP服务。

此时若需要PXE服务,那么势必会有DHCP冲突,即便是PXE的DHCP地址池配置与主DHCP服务相同,也会存在多个DHCP服务响应的问题,PXE客户端会有几率获取IP失败。而DHCP代理模式,也无法添加额外选项。

openwrt配置文档较多,就不多做介绍了,无非就是通过添加DHCP选项而已,看下DHCP标准文档和各DHCP服务的文档即可轻松搞定。

常见协议文档

syslinux

PXElinux

RFC 2132

RFC 4578

RFC 5071

RFC 5494

RFC 5970

H3C 配置思路

这里我用h3c,其他厂商设备同理,命令查下手册,大同小类。

h3c官网给的方案时使用 option 43选项,但是当同时存在option 66、67、150之一时,PXE的option 43优先级是最低的,其他选项会优先使用,因此我们不需要使用option 43选项。

1
2
# 开启DHCP服务
dhcp enable
1
2
# 开启DHCP服务数据库,避免断电重启后重新分配IP情况
dhcp server database filename database.dhcp

option 93 选项可查看rfc4578协议
文档

x86 BIOS 为 0000

x64 UEFI 为 0007

1
2
3
4
5
6
7
8
# 创建legacy dhcp用户类
dhcp class legacy

# legacy dhcp用户类添加规则1,规则为匹配到 option 93 选项为十六进制 0000
if-match rule 1 option 93 hex 0000

# 退出legacy dhcp用户类
quit
1
2
3
4
5
6
7
8
# 创建uefi_x64 dhcp用户类
dhcp class uefi_x64

# 创建uefi_x64 dhcp用户类添加规则1,规则为匹配到 option 93 选项为十六进制 0007
if-match rule 1 option 93 hex 0007

# 退出uefi_x64 dhcp用户类
quit

通过rfc4578标准,获知TFTP优先级为 option 150 > option 66

可是在设备上添加option 66、150选项都不生效,抓包查看dhcp服务是正确响应了对应选项的,爬墙翻了会资料也没找到问题根源。

无论是手动添加option,或是使用tftp-server ip-address 自动添加 150,使用tftp-server domain-name 自动添加 66 选项都没效果,抓包是能看见DHCP服务的响应的,自己编译了最新的ipxe后也还是不行,因此觉得ipxe没有正确使用dhcp option,有空的老哥可以去看看ipxe的源码,有发现可以顺带告诉我一下。

更恶心的是刚开始使用的华硕主板,竟然会将解析的option添加一个十六进制的空截止符号,显示器字符中不会显示,导致整整半天我都在自我怀疑和调整配置中度过,最后抓包才发现此问题,换了块微星的主板一测就过。

目前测试过的方案有两种:

1
2
3
4
5
6
7
8
# 创建dhcp option-group 1
dhcp option-group 1

# dhcp option-group 1 添加选项 63 为 ascii 类型,值为 bootx64.efi
option 67 ascii bootx64.efi

# 退出dhcp option-group 1
quit
1
2
3
4
5
6
7
8
# 创建dhcp option-group 2
dhcp option-group 2

# dhcp option-group 2 添加选项 63 为 ascii 类型,值为 lpxelinux.0
option 67 ascii lpxelinux.0

# 退出dhcp option-group 2
quit

此处假设我们要应用于vlan1这个dhcp地址池

dhcp地址池中的ip、网关、dns等等请根据自己情况配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进入(创建)vlan1 dhcp地址池
dhcp server ip-pool vlan1

# 应用 uefi_x64 用户类且关联 option-group 1
class uefi_x64 option-group 1

# 应用 legacy 用户类且关联 option-group 2
class legacy option-group 2

# 添加tftp服务地址,请根据自身情况修改IP地址
next-server 192.168.0.180

# 退出vlan1 dhcp地址池
quit
1
2
3
4
5
6
7
8
# 进入(创建)vlan1接口管理
interface Vlan-interface1

# 应用dhcp vlan1地址池
dhcp server apply ip-pool vlan1

# 退出vlan1接口
quit

此时就可以测试一下了,如果是legacy引导,则应该使用lpxelinux.0引导,如果是uefi引导,则应该使用bootx64.efi引导,可以使用不同设备引导类型,返回不同的引导文件

验证没有问题不要忘了保存设置

资源记录

syslinux 引导

安全启动:shim-signed

amd64 grub引导:grub-efi-amd64-signed

grub字体:grub-common

可参考ubuntu官方文档

同设备类型引导方式可以通用,如legacy可以用一个syslinux的lpxelinux,amd64 用shim-signed和grub-efi-amd64-signed。不同系统的引导和初始内核不同共用,如vmlinuz、initrd