把 OpenCore 集成到 Grub2 中

前情提要。设备是 Dell Latitude 5400,内置硬盘中有 Windows 11 和 Ubuntu 两个系统;外置硬盘中有 macOS (Big Sur),这是一份白苹果的副本,因此,其引导器为另一个 USB 盘上的 OpenCore。

前几天把 macOS 迁移到了内置硬盘上,今天又看着那个一直占用着一个 USB 口的引导盘碍事(其实是闲的),决定把它也解放出来。因此,要解决的问题就成了,如何把一份独立的 OpenCore 引导器,迁移并融合入一份 Grub2 中。下手之前,基本思路是使用 Grub 的 chainloader 功能。

Grub2 所在的 ESP 分区中,其配置文件为 Ubuntu/grub.cfg,不过看一眼其中的内容(见下),就会知道这其实只是一个中转站,

真正的配置文件是 root 分区(通常 Linux 正常引导后会被 mount 至 /boot)中的 grub/grub.cfg。而此处的 grub.cfg,是 Linux 的相关命令生成的。

按照最小干扰的原则,OpenCore 的加入,最好是不和 Linux 产生纠葛,而是只影响 Grub2 本身,但老夫目前还不知道如何能在上面那个中转性质的 grub.cfg 配置文件中附加入新的 OpenCore 引导项而不影响之前的内容和工作预期。所以还是要去 /etc/grub.d/40_custom 搏斗。

在此之前,需要把 OpenCore 的文件准备就绪。OpenCore 有属于自己的 bootx64.efi,将其改名为 bootx64-oc.efi 后跟 Grub2 的 bootx64.efi 一同放在 EPS 分区的 EFI/boot 目录下。其次再把 OC 整个目录复制到 EFI 目录下。

最后,来处理 40_custom ,编辑其内容为如下(没有列出格式要求的那些语句)。

从网上的资料可知,menuentry--class 参数仅用于主题显示时的辩识(可以类比 CSS),而 menuentry_id_option 也并无太多的实质性意义,就都按自己的习惯改写了一下。理论上,其中的 root 变量为了稳定(尤其是像我这种动不动全盘克隆后要使用,却发现磁盘设备的 UUID 会有变化的情况下),可以用搜索命令得到并赋值,此处是根据当前实际情况手动固定指定了。最后别忘了 update-grub

有关 Grub2 和 OpenCore 的并存,以及相互之间的跳转,以下两个链接里还有一些进一步的内容。因为其中有些内容之前毫无接触(例如看上去 systemd 有用于 EFI 的 loader?),罗列于此,以为备忘。

https://superuser.com/questions/1534161/dual-triple-efi-boot-from-different-drives-without-going-through-bios
https://github.com/dortania/OpenCore-Multiboot/blob/master/oc/linux.md

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注