我可以使用 libvirt/qemu 创建虚拟机以在 UEFI 模式下启动。我知道它默认使用 iPXE,但我想创建/修改 iPXE 映像以覆盖filename
和next-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,打印filename
并next-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