使用自定义的下一个服务器和文件名为 QEMU/Libvirt 创建 iPXE UEFI 可启动映像

使用自定义的下一个服务器和文件名为 QEMU/Libvirt 创建 iPXE UEFI 可启动映像

我可以使用 libvirt/qemu 创建虚拟机以在 UEFI 模式下启动。我知道它默认使用 iPXE,但我想创建/修改 iPXE 映像以覆盖filenamenext-server属性。

我怎能做这样的事?

编辑

我尝试了以下操作:

git clone git://git.ipxe.org/ipxe.git

在目录 ipxe/src 中创建一个 iPXE 脚本:

文件 ipxe/src/chain.ipxe 的内容:

#!ipxe
prompt --key 0x02 --timeout 2000 Press Ctrl-B for the iPXE command line... && shell ||
dhcp
set net0/filename /pxeserver/loader/uefi/bootx64.efi.0
set net0/next-server <IP>
show net0/filename
show net0/next-server
autoboot

使用嵌入脚本构建图像:

make bin-x86_64-efi/ipxe.efi EMBED=chain.ipxe

构建图像:

truncate -s 3MiB usb.img
mkfs.vfat usb.img
mmd -i usb.img "::/efi"
mmd -i usb.img "::/efi/boot"
mcopy -i usb.img bin-x86_64-efi/ipxe.efi "::/efi/boot/bootx64.efi"

然后我在 VM 存储设备上创建指定此 usb.img 的 VM。它启动 iPXE,打印filenamenext-server覆盖,通过 DHCP 获取 IP,然后尝试从服务器启动,获取相应的引导加载程序,然后启动 grub shell,因为它似乎没有尝试grub从中下载任何配置next-server(仔细检查其日志,它只记录文件bootx64.efi.0,而不是grub.cfg文件,好像它没有将 PXE 启动重定向到第二台服务器。

答案1

至少在 Debian 上,qemu 使用的 iPXE ROM 映像位于和/usr/lib/ipxe/usr/lib/ipxe/qemu具体取决于您在 VM 中使用的虚拟 NIC。

下载 iPXE 源代码,对其进行修改,构建 ROM 图像,并用您定制的图像替换标准图像。

答案2

iPXE 比一般的引导加载程序具有更多功能,在这种情况下,当启动 grub 时,grub 将尝试从启动时的相同位置加载配置,但是由于前面提到的功能,这不起作用。

要解决这个问题,请确保使用正确的配置构建 iPXE,在本例中就是CONFIG=qemu这样的#define EFI_DOWNGRADE_UX(页面上有一些详细信息:https://bugs.launchpad.net/maas/+bug/1789319/comments/16有包含更多详细信息的邮件列表主题)

关于命名配置,请参阅https://ipxe.org/appnote/named_config

然后,您可以将其构建为 ROM 来替换原始 ROM,方法是替换原始文件,或者在命令行中提供 ROM 的路径。其他方法是从原始 ROM 链接到新 ROM,或者像现在一样构建 USB 设备。

我认为你甚至可以将它放在你的目标中以避免手动图像构建步骤:make bin-x86_64-efi/ipxe.usb EMBED=chain.ipxe CONFIG=qemu

答案3

其他答案已经指出了如何使用 IPXE 来解决这个问题,但是,考虑到您能够访问 grub shell,另一个答案可能是使用预配置脚本构建 grub 引导加载程序,类似于您在 ipxe 二进制文件中包含的 ipxe 脚本。除了标准的“grub.cfg”之外,还可以包含“load.cfg”,它将捆绑在 grub 二进制文件中。请参阅grub 手册的一部分。它也可能有助于insmod normal 參考如果您的前缀设置正确,则从 grub shell 加载标准配置。

相关内容