我安装了 TinyCore 作为我的维护操作系统。我给了GRUB2。但 TinyCore 安装说明告诉您使用 MBR 方法添加 GRUB2。 (它可以工作,但这只是因为 EFI 向后兼容 MBR。)理想情况下,我想将其链接起来,以便 EFI 引导存根矢量到 TinyCore 的 /boot/grub,这样我就可以从 TinyCore 的 GRUB2 引导任何其他操作系统想。或者第二个选择,我想链接它,以便 EFI 引导存根矢量到 TinyCore 的 vmlinuz。
TinyCore 没有 efibootmgr。当我从 Ubuntu USB 记忆棒启动时,efibootmgr 提示“系统不支持 efivars”。
有没有一种方法可以获取 TinyCore 的 grub 目录,将其带到其他 Linux 机器上,并从中创建一个 grub.efi,然后我可以将其带回这台机器并复制到这台机器上的 ESP?
答案1
当我从 Ubuntu USB 记忆棒启动时,efibootmgr 提示“系统不支持 efivars”。
发生这种情况是因为您使用旧版 BIOS 样式从 USB 记忆棒启动,因此 UEFI 的兼容性支持模块将禁用用于访问启动变量的 UEFI 运行时接口。如果您可以在本机 UEFI 模式下启动 USB 记忆棒,那么efibootmgr
就可以工作。如果固件启动设置包含首先尝试 UEFI 或传统启动方法的选择,请尝试在从 U 盘启动时将其切换到“UEFI 优先”模式。
使用旧版 MBR GRUB2,您只能启动可使用旧版 MBR 样式启动的操作系统。为了链接到已安装的操作系统以使用本机 UEFI 引导,您需要 UEFI 版本的 GRUB2。
将 UEFI GRUB 从一个发行版移植到另一个发行版的问题在于,不同发行版的设置方式略有不同:例如,Debian 过去常常使用嵌入式指令将一个非常小的 ESP 植入grub.efi
到 ESP 中,以从另一个发行版读取更多 GRUB 模块和配置文件在 GRUB 安装时指定的文件系统(通常是包含/boot
目录的文件系统)。
这种方法的问题在于,如果启用安全启动,则无法实现这一点:加载的所有可执行代码都必须进行签名,并且由于 GRUB 模块不使用与标准 UEFI 二进制文件相同的二进制文件格式,因此无法以以下方式进行签名:对于 UEFI 固件来说是可识别的。
另一方面,RedHat 派生的发行版倾向于将所有必要的 GRUB 模块嵌入到主grubx64.efi
二进制文件中,然后可以通过安全引导在一次操作中成功加载shim.efi
。 GRUB 配置文件也放置在 ESP 文件系统中,通常反映主 UEFI GRUB 二进制文件的命名,即,如果二进制文件被重命名,它将在同一目录中foo.efi
查找。foo.cfg
知道这一点后,您只需确保安全启动已禁用,grub.efi
从 RedHat/CentOS/Fedora 安装介质中获取二进制文件,手动编写一个最小配置文件,将它们放入您的 ESP 中(可能是\EFI\boot\bootx64.efi
和\EFI\boot\bootx64.cfg
,因此 UEFI 应该选择它们自动,无需 UEFI 变量)并启动一次。然后你可以看看TinyCore原生的GRUB配置生成器生成的GRUB配置文件是否与该版本的GRUB兼容,然后将简化的配置文件替换为真正的GRUB,或者将移植版本的GRUB替换为TinyCore首选版本的UEFI GRUB 。
如果您想直接从 UEFI 固件启动 TinyCore vmlinuz
,则需要使用 编译内核CONFIG_EFI_STUB=y
,然后您需要弄清楚如何处理启动参数和 initramfs 文件。我通过将引导选项配置到 UEFI 引导变量中进行了一次这样的设置。如果没有引导加载程序,您可能无法在引导时更改引导参数,因此您最好提前使用不同的引导参数生成多个 UEFI 引导变量设置,以便您可以访问例如,如果内核更新出现问题。
(如果您的固件级 UEFI 启动选项包括启动进入 UEFI Shell 的方法,则它在设置“无引导加载程序”UEFI 可启动安装时非常有用。)
UEFI 启动变量中使用的 UUID 可以通过运行blkid
命令来发现。 GRUB 使用文件系统 UUID(= 该UUID=
字段),而 UEFI 引导变量使用分区的唯一 UUID(= 该PARTUUID=
字段)。
答案2
我是这样做的。首先,我将 PC EFI 选项设置为仅 EFI 启动。然后我从 DVD 启动了 Ubuntu 16.04.4。 (显然这是 UEFI 启动。)。在 Ubuntu 16.04.4 中我做了以下操作。
- 安装了我的 ESP 分区。 (这是磁盘1的分区1)
- mkdir /path/to/mounted/esp/partition/EFI/prime_boot
- 安装 grub-efi-amd64: sudo apt-get install grub-efi-amd64
- grub-mkimage -o /path/to/mounted/esp/partition/EFI/prime_boot/bootx64.efi --format=x86_64-efi '--prefix=(hd0,gpt1)/EFI/prime_boot' ext2 part_gpt
在 /path/to/mounted/esp/partition/EFI/prime_boot/ 中设置以下 grub.cfg 文件
menuentry "GRUB chainloader" { chainloader (hd0,gpt2)/boot/efi/core.efi }
将目录 /usr/lib/grub/x86_64-efi 复制到 /path/to/mounted/esp/partition/EFI/prime_boot/。
- efibootmgr -c -d /dev/sda -p 1 -l \EFI\prime_boot\bootx64.efi -L “主加载程序”
- 在 EFI 菜单中设置启动顺序以使用“Primary Loader”
是的,您必须转义“efibootmgr”命令中的“\”。现在,您已经有了使用此主加载程序的 EFI 来引导至 TinyCore 分区中的引导加载程序。现在您设置了 TinyCore 分区的引导加载程序。
- 挂载 TinyCore 分区。 (我的是磁盘1分区2)
- grub-mkimage -o /path/to/mounted/tinycore/partition/boot/efi/corex64.efi --format=x86_64-efi '--prefix=(hd0,gpt2)/boot/efi' ext2 part_gpt
- 现在在 /path/to/mounted/tinycore/partition/boot/efi/ 中创建多引导 grub.cfg
我知道有人会想知道为什么我从主引导加载程序跳到多重引导加载程序。我只想在我的 esp 分区中做尽可能少的事情。我希望 TinyCore(我的维护操作系统)成为多重引导引导管理器的所有者。