前情提要。设备是 Dell Latitude 5400,内置硬盘中有 Windows 11 和 Ubuntu 两个系统;外置硬盘中有 macOS (Big Sur),这是一份白苹果的副本,因此,其引导器为另一个 USB 盘上的 OpenCore。
前几天把 macOS 迁移到了内置硬盘上,今天又看着那个一直占用着一个 USB 口的引导盘碍事(其实是闲的),决定把它也解放出来。因此,要解决的问题就成了,如何把一份独立的 OpenCore 引导器,迁移并融合入一份 Grub2 中。下手之前,基本思路是使用 Grub 的 chainloader
功能。
Grub2 所在的 ESP 分区中,其配置文件为 Ubuntu/grub.cfg
,不过看一眼其中的内容(见下),就会知道这其实只是一个中转站,
1 2 3 |
search.fs_uuid 56a9fb5a-ec1c-4819-a94c-f2a5b7a9a09e root set prefix=($root)'/grub' configfile $prefix/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
,编辑其内容为如下(没有列出格式要求的那些语句)。
1 2 3 4 5 |
menuentry 'macOS (Big Sur)' --class macos --class os $menuentry_id_option 'macos-hackintosh-57c57fe1-ff0e-425f-ae9f-05c062f06d32' { set root='hd0,gpt1' chainloader (${root})/EFI/boot/bootx64-oc.efi boot } |
从网上的资料可知,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