我有一个磁盘映像:
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 262MB 261MB fat16 MemTest86 legacy_boot, msftdata
2 263MB 524MB 261MB fat16 EFI System Partition boot, esp
在 grub 控制台中我做了:
loopback loop (some partition)/memtest.img
ls
正确显示2个分区(loop,gpt2)
并(loop,gpt1)
ls (loop,gpt2)/efi/boot/
显示:
Benchmark blacklist.cfg BOOTIA32.efi BOOTX64.efi mt86.png unifont.bin
但是,如果我执行以下操作,则会出现错误not a valid root device
root=(loop,gpt2)
chainloader (loop,gpt2)/efi/boot/BOOTX64.efi
我还需要做什么才能正确链加载引导加载程序?
更新1:在loopback命令之后,search命令可以找到分区。例如 ls (loop,gpt2) 显示 UUID E64D-A5AA。search -u E64D-A5AA
展示loop,gpt2
答案1
除非链加载的 efi 和内核支持某种挂载磁盘映像的方式,否则此操作是不可能的。
grub环回启动过程是这样的:
- grub 挂载包含磁盘映像的真实硬件分区
- grub 环回磁盘映像
- grub 在该映像中运行 efi 应用程序。此时,grub 将所有控制权交给了 efi 应用程序。 efi 不知道在哪里可以找到包含磁盘映像的硬件分区。即使它具有此功能,它也不知道如何安装磁盘映像。因此,从这个阶段开始,一切都无法继续。
在现代的 livecd 中,有一些内核选项允许您告诉它在哪里找到图像并且它们可以挂载图像。但是 grub 必须直接运行内核,而不是应该启动内核的 efi 应用程序。因为efi应用程序中的每个路径都是硬编码的并且需要是绝对路径。