我已经使用 pxelinux 设置了 PXE 启动环境,但自从我更新了主板固件后,它不再支持传统模式。因此,我在 PXE 设置中添加了对 UEFI 模式的支持。
我已经编译了 grub 2.06 及其所有模块,现在我可以启动 grub 了,它实际上从 TFTP 服务器加载 grub.cfg。我可以从 NFS、Clonezilla 和 Parted Magic 启动我的无盘 ubuntu 安装,它们都是从 ISO 中提取的,并带有自定义启动标志。NFS、TFTP 和 DHCP 服务器均由 raspberry pi 4 (aarch64) 提供。
之前我能够使用 syslinux 的 memdisk 工具从 ISO 映像启动。我读过它的文档我发现我应该能够使用如下条目来通过 grub2 进行启动:
menuentry "Memtest (ISO)" {
linux16 /memdisk iso
initrd16 /memtest/mt86plus64.iso
}
但是,当我选择该条目时,我得到一个指示,提示正在下载 memdisk,然后是 mt86plus64.iso,之后它就挂起了。在提示符中输入这些命令时,它在尝试发送时挂起了boot
。我得到了换行符,然后它就挂起了。
我知道我可以使用这样的环回设备
menuentry "Memtest (ISO)" {
set isofile=/memtest/mt86plus64.iso
loopback loop $isofile
chainloader (loop)/EFI/bootx64.efi
loopback --delete loop
}
但是与 memdisk 选项相比,它有多个缺点。首先,它要求对每个选项进行单独配置,以便加载内核或引导加载程序。这已经是一个问题,因为我甚至不知道如何从具有 msdos 文件的 Magic Boot Disk 或根本不支持环回启动但与 memdisk 配合良好的 SuperGrubDisk2 启动。
其次,每次访问文件时它都会下载整个 iso 映像。我想从 ParrotOs ISO 文件启动,输入以下内容:
menuentry "ParrotOS (ISO)" {
set iso_path="/parrotos/Parrot-security-5.2_amd64.iso"
export iso_path
loopback loop $iso_path
root=(loop)
configfile /boot/grub/loopback.cfg
loopback --delete loop
}
然后它下载 5GB iso 来获取 loopback.cfg,然后再次下载整个 iso 来获取 grub.cfg,然后每次再次下载 5GB 来获取 3 个字体、4 个 mod 等。为了让 bootloader 工作,下载整个文件 500 次根本行不通。实际上,我还没有看完整个过程,3 小时后就放弃了,所以我甚至不知道这样做是否可行。
我可以通过从 ISO 中提取文件然后将该目录设置为 NFS 根目录来启动它,但这同样仅限于支持 NFS 的内核。
那么我该如何启动任意 iso 文件呢?最好如何修复 memdisk,或者如何将 iso 映像移动到 RAM 中,这样我就不需要一次又一次地下载它了?
编辑 我找到了部分答案这里但是我仍然希望有某种方式来启动 iso 映像(和其他映像),以便允许在 UEFI 模式下启动。