嗯,显然我可以,因为所有 Linux 发行版都是作为混合 ISO 提供的,可以引导 BIOS 和 UEFI。
问题是如何?我以为我可以跑grub-install
两次:
grub-install --target=i386-pc --recheck --boot-directory=/mnt/boot /dev/sdX
grub-install --target x86_64-efi --efi-directory /mnt --boot-directory=/mnt/boot --removable
Run Code Online (Sandbox Code Playgroud)
并且它会安装两者。然而,一个不会破坏另一个吗?
归根结底,我不太了解 grub 在 MBR(BIOS 或 UEFI 模式)中安装的内容。理论上,UEFI 不应该关心 MBR 本身,而只是不确定。
仅供参考,grub-install
在 VirtualBox 中运行Ubuntu LiveCD,因为它在那里。
假设我有一个带有kernel
和initrd
线的引导程序。出于所有意图和目的,我现在有 2 或 3 个“内核”阶段:
以上将适用于 MBR。对于 EFI,引导加载程序(或引导管理器)只是一个 EFI 应用程序,它在固件是“内核”时运行:
实际的内核切换过程是什么。从 2 到 3,或者 EFI 固件从 1 到 2,MBR grub 实际上做了什么?它类似于kexec
?
其次,在 EFI 的情况下,一些钩子被传递给 EFI 应用程序,然后传递给 Linux 内核(所以我们可以做像 efibootmgr 之类的事情),它是如何传递的?
最后,是否有可能不止一次这样做?例如,如果我在加载“常规”操作系统之前需要做一些自定义工作,例如测量和验证 TPM 条目、解密等,也许使用 grub、rEFInd 或其他方法不容易完成的事情,我可以加载“临时”阶段内核和initrd,执行它们,然后移交?
我正在 mkisofs 模式下使用 xorriso 构建自定义 iso。构建似乎是正确的,之后检查 iso 显示 2 个引导映像(1 个 BIOS,2 个 UEFI),但使用 OVMF 固件从 qemu 引导到 ISO 无法找到任何可引导媒体。
如果我在 qemu 中尝试完全相同的启动,但使用干净下载的 ubuntu 16.04 服务器 iso,它可以毫无问题地启动。
如果我使用 BIOS(不是 UEFI),两者都可以正常启动。
xorriso 命令:
xorriso -as mkisofs \
-l -J -R -V version \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \
-isohybrid-mbr isohhdpfx.bin \
-eltorito-alt-boot -e EFI/BOOT/BOOTX64.EFI -no-emul-boot \
-isohybrid-gpt-basdat \
-o testos.iso ./cddir/
Run Code Online (Sandbox Code Playgroud)
检查 2 个 iso(ubuntu 和我定制的一个)的详细信息xorriso -report_el_torito plain
和cmd
以下要点https://gist.github.com/deitch/e069268f92402d6a2b1c7e060ddba622