我想使用 UEFI PXE 引导一些 ESXi 主机,但不断收到以下消息:
我正在使用虚拟机进行测试,可以看到它在数据包捕获中命中了 DHCP/TFTP 服务器(CentOS 7)(捕获了 3 次重新启动,如下所示):
09:18:04.995404 IP 192.168.0.136.rsc-robot > stager.test.lab.tftp: 50 RRQ "efi.x64/syslinux.efi" octet tsize 0 blksize 1468
09:18:04.997399 IP 192.168.0.136.cera-bcm > stager.test.lab.tftp: 42 RRQ "efi.x64/syslinux.efi" octet blksize 1468
...
09:18:40.700760 IP 192.168.0.136.itm-mcell-u > stager.test.lab.tftp: 50 RRQ "efi.x64/syslinux.efi" octet tsize 0 blksize 1468
09:18:40.704583 IP 192.168.0.136.optika-emedia > stager.test.lab.tftp: 42 RRQ "efi.x64/syslinux.efi" octet blksize 1468
...
09:18:57.525302 IP 192.168.0.136.altalink > stager.test.lab.tftp: 50 RRQ "efi.x64/syslinux.efi" octet tsize 0 blksize 1468
09:18:57.528201 IP 192.168.0.136.tunstall-pnc > stager.test.lab.tftp: 42 RRQ "efi.x64/syslinux.efi" octet blksize 1468
我曾是只要我直接指向“mboot.efi”中的映像文件(我从 syslinux 6.03 中将其放入其中),就可以让 ESXi 安装程序通过 UEFI 运行,但我想使用 syslinux 从默认值传递 PXE 配置配置文件。我通过 DHCP 定向到那里,如下所示:
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
authoritative;
log-facility local7;
allow booting;
allow bootp;
option client-system-arch code 93 = unsigned integer 16;
class "pxeclients" {
match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
#TFTP Server
option tftp-server-name "192.168.0.250";
next-server 192.168.0.250;
if option client-system-arch = 00:00 {
filename = "bios/pxelinux.0";
} elsif option client-system-arch = 00:07 {
filename = "efi.x64/syslinux.efi";
}
}
subnet 192.168.0.0 netmask 255.255.255.0 {
option domain-name-servers 192.168.0.250;
range 192.168.0.100 192.168.0.145;
}
我的 tftpboot/pxelinux.cfg/default 文件:
UI vesamenu.c32
PROMPT 0
menu title UEFI Deployment
MENU INCLUDE graphics.conf
LABEL -
MENU label Standard Builds
MENU DISABLE
LABEL ESXi 6.7
MENU LABEL ^esxi 6.7
MENU INDENT 3
MENU DEFAULT
KERNEL images/ESXiv6.7/mboot.efi
APPEND initrd=/images/ESXiv6.7/boot.cfg ks=nfs://192.168.0.250/nfsshare/ks-prime.cfg
我可以完全移动默认文件并得到相同的结果。我不相信靴子会被推过去使用它。
编辑:我正在添加 TFTP 日志。看起来它从未加载过 syslinux.efi。值得注意的是,我的 BIOS 实现正确地在加载各自的 pxelinux.0 文件后从映像中提取 boot.cfg 文件。我假设默认文件实际上在此实例中工作,而不是 EFI 默认文件。
TFTP UEFI 日志:
Jul 24 08:28:49 stager in.tftpd[49849]: Client ::ffff:192.168.0.136 finished efi.x64/syslinux.efi
Jul 24 08:35:58 stager in.tftpd[50227]: connect: Invalid argument
Jul 24 08:36:05 stager in.tftpd[50233]: connect: Invalid argument
答案1
显然(至少某些版本的)UEFI PXE 标准要求使用 DHCP 选项指定启动文件的大小option boot-size <value>
。对于基于 BIOS 的传统 PXE 引导,则不需要这样做。
您可以通过执行以下操作获得正确的大小值du -B 512 syslinux.efi
。
因此,如果该du
命令报告的大小syslinux.efi
为 400 个块,您会希望 DHCP 配置显示如下内容:
...
} elsif option client-system-arch = 00:07 {
filename = "efi.x64/syslinux.efi";
option boot-size 400;
}
...
如果没有此选项,我测试的某些系统无法使用 UEFI PXE 启动。
该vesamenu.c32
模块对于 UEFI 也可能存在问题,因为 UEFI 固件将提供其自己类型的显示 API,与 VESA VBIOS 扩展无关。我已经取得了一些成功menu.c32
。
我已经测试了syslinux.efi
两者ipxe.efi
ipxe.org。我可以让它们都在我的环境中工作,但 iPXE 对我来说似乎更强大。
答案2
对于任何来到这里寻求解决方案的人。由于此原因,目前无法进行此设置漏洞在 Syslinux/GRUB EFI 引导加载程序中。您需要直接从 DHCP 传递 mboot.efi。遗憾的是,这意味着在 UEFI 模式下无法进行基于菜单的选择。