前段时间折腾黑苹果,安装过程没多大问题,一次成功。可在设置 macOS+Windows+Ubuntu 多系统的 EFI 引导时花了不少时间,网上相关教程有些老旧,部分细节疏漏导致博主屡次失败,很有必要在此记录。
先说问题解决过程,后面总结涉及到的知识点。
环境
博主的电脑最初是在一块 SSD 安装了 Windows 10,分区形式用的 MBR,接着在相同磁盘里分出一部分安装了 Ubuntu,此时开机引导后会使用 Ubuntu 的 Grub 来选择启动哪个系统。
之后双十一购买了新固态 MX500,于是将 Windows 10 移动到了新 SSD 里,此时系统分区发生变化,Ubuntu Grub 是启动不了 Windows 的,但可修改硬盘的启动顺序分别启动。
随后因为 Ubuntu 分区太小而进行了扩容操作,同样因为分区信息变更,Ubuntu 启动时的 Grub 菜单都进不去了,但使用文中方法修复成功。
接着又是折腾黑苹果,需要用 UEFI 模式来引导系统、 CLOVER 管理启动菜单。而 UEFI 需要硬盘分区表格式是 GUID 的,干脆借助 DiskGenius 把几块硬盘全部转为 GPT,操作时:对于存在『未建立分区的空闲扇区』的硬盘,直接转换即可;已经全部分区的硬盘,则先用 DiskGenius 调整分区大小,划分出一小块区域,再进行转换。
最终所有硬盘的分区表格式都是 GUID 了,问题也来了:
症状
如果在主板里将“启动设备控制”设置为“Legacy OPROM”,CLOVER 能启动 macOS 和 Windows,或者通过修改启动顺序也能启动 Windows,但 Ubuntu 不行。而改为“仅 EFI”时,CLOVER 仅能启动 macOS,Windows 和 Ubuntu 都不能正常启动。
注意:此时 EFI 引导文件夹应该在和 macOS 同一块硬盘的 ESP 分区里,是我安装黑苹果时划分的。里面有 BOOT 和 CLOVER 两个文件夹。
下面开始修复,在操作前,先备份 ESP 分区中 EFI 文件夹,尤其是 BOOT 目录中的 BOOTX64.efi 文件。
修复 Windows 的 EFI 启动
方法很多,这里用最简单的:一个 WinPE 的 U 盘启动,里面有“修复 Windows 引导“的小工具,打开输入 Windows 系统盘符即可。如果是用”黑果小兵“的镜像安装黑苹果,U 盘的第二个分区就是个 WinPE。
操作完成后进入 Windows,系统盘根目录下出现个 EFI 目录,内有 Boot 和 Microsoft 两个文件夹,Microsoft 文件夹里又有 Boot 和 Recovery 两个子文件夹,Windows 的启动文件就这里了。(实际上在系统盘根目录下也有个 Boot 文件夹,只不过因为是系统文件夹而被隐藏了)
接着先用 DiskGenius 或 BOOTICE 软件给 ESP 分区添加个盘符,再把上面的 Microsoft 文件夹移动到 ESP 分区的 EFI 文件夹中。现在重启后,CLOVER 应该能自动检测到 EFI 里的 Windows 启动项了。或者以防万一,用 BOOTICE 软件来编辑一下 UEFI 启动序列:打开 BOOTICE -- UEFI 选项卡 -- 修改启动序列;添加一个启动项,注意启动磁盘选择 Windows 系统盘;启动分区选择 ESP 分区;启动文件路径为\EFI\Microsoft\Boot\bootmgfw.efi。
至此,Windows 的启动恢复正常。
添加 Ubuntu 的 EFI 启动项
修复 Ubuntu 的启动过程中坑比较多,前面步骤和这篇博文里一样,直到sudo grub-install /dev/sda这步时出现错误:
grub-install:warning :无法嵌入。在此次安装中GRUB只能通过使用块列表安装。但是块列表是不可信赖的,不推荐使用。
grub-install:错误: 停止进行块列表安装.
按照网上教程,先挂载 ESP 分区到 /mnt 目录下,--efi-directory 指定 EFI 文件夹目录或添加 --force 参数强制执行:sudo grub-install --force --efi-directory=/mnt/,还是报错:grub-install:错误: install device isn't specified.
究其原因,是因为之前 Ubuntu 用的 MBR 分区表安装,grub 默认安装的是 grub-pc 这个包,继而 grub-install 无法成功重建并写入到 ESP 分区,所以先 sudo apt-install grub-efi 安装 grub-efi ,随后重新执行上一步操作即可。这里注意挂载 ESP 分区后,sudo grub-install --efi-directory=/mnt/命令中 efi-directory 目录要指定的是 EFI 文件夹所在目录。
上步执行成功后,可发现 ESP 分区 EFI 目录下多了一个 Ubuntu 文件夹,里面有两个文件:grub.cfg 和 grubx64.efi。此外,其实 EFI 下 BOOT 目录中的 BOOTX64.efi 文件也已被替换成 Ubuntu 的了,重启后直接显示的是 Ubuntu grub 引导界面而不是 CLOVER。此时只需将 BOOT 目录中的 BOOTX64.efi 替换为之前备份的 BOOTX64.efi ,或者把 CLOVER 目录下的 CLOVERX64.efi 复制过去重命名为 BOOTX64.efi,即可恢复成 CLOVER 来管理所有操作系统的启动了。
现在,博主的 ESP 分区下 EFI 目录结构如下所示,每个操作系统的引导文件一目了然:

如下图,CLOVER 启动菜单中正常显示 macOS+Windows+Ubuntu 三系统且均可成功启动:

总结知识点
将以上各种设置总结成简单一句话:生成并添加 efi 文件。尤其是撰写完这篇博文后,感觉基本上没做啥很复杂的操作,时间都花在理解各种启动原理上了。顺便也将博主的个人理解记录如下:
一台计算机从按下开机键直到显示系统桌面的过程中发生了什么?安装在一个磁盘里的多个操作系统是如何分别被引导的?熟悉此流程后,相关问题迎刃而解,这里只是简述,详情可看文末参考资料。
要理解启动过程就得先知道啥是引导程序
正常情况下,计算机收到引导程序的指令后才能启动操作系统,但引导程序的运行又必须先启动计算机,所以这里要用到一段保存在主板中的程序即 BIOS。BIOS 的主要功能之一就是告诉计算机要加载的操作系统引导程序放在哪,即接下来该干嘛。另外 BIOS 还要去识别并初始化各种硬件设备,判断计算机是否具备启动条件即自检,这也能解释为何有时需要通过刷 BIOS 来解决对某些硬件设备的兼容性了。同时可看出引导程序的运行和我们使用哪种操作系统无关。
有关不同的引导方式,在很多讲系统启动原理的文章中都提到了 UEFI + GPT 引导和 BIOS + MBR 引导。个人比较赞同这种说法:“BIOS” 这个词算是业界比较口语化的叫法,现在基本上说 BIOS 就是指 UEFI,因为它俩的功能基本一样,只不过 UEFI 更加先进,如果严格的叫法应该是“传统 BIOS”和“UEFI BIOS”。
如果是传统 BIOS + MBR,即主引导记录的形式进行分区,安装操作系统时会在磁盘的第一个扇区(是扇区,不是分区)里记录操作系统的主引导程序和分区表等信息。如果是 UEFI + GPT 分区呢,则会有个单独的 ESP 分区用以存放各种引导文件。
无论“传统 BIOS”还是“UEFI BIOS”,启动步骤大致相同:计算机通电后,CPU 加载主板里的 BIOS 程序,接着初始化其他各种硬件,再扫描磁盘里的引导程序并启动操作系统。
一些 UEFI + GPT 和 BIOS + MBR 的区别
对于传统 BIOS + MBR,会按设置的磁盘启动顺序依次扫描其第一个扇区即 MBR,如果根据 MBR 里的标识判断到该磁盘“可启动”,则继续根据 MBR 里的分区表信息来找到哪个分区是安装了操作系统且是激活状态的,接着去该分区里找操作系统内核进行加载,这样系统就开始启动,之后的工作就交给它了。如果安装了多系统,此时会运行启动管理器来选择启动哪个操作系统。通常启动管理器是由我们安装最后一个操作系统时自动装上的,所以展示界面会不太一样,比如 Ubuntu 用的是 Grub2,黑苹果用的 CLOVER 也是个启动管理器。
而 UEFI BIOS + GPT 则会先加载内置 UEFI 固件,并初始化启动要用的硬件,随后读取 ESP 分区里的引导管理器以确定加载哪个 UEFI 应用,类似安装了多系统时是选择 bootmgfw.efi 来启动 Windows 或 加载 grubx64.efi 来启动 Ubuntu,已启动的 UEFI 应用又可以启动其他应用,比如安装黑苹果时 CLOVER 里有个 drivers 文件夹,里面放着各种 efi 格式的驱动文件,用来驱动我们的 macOS,
传统 BIOS 是由汇编语言写,更易与硬件直接交互,比较底层。UEFI BIOS 大部分由 C 语言完成,更高级,可以完成更复杂的工作,比如支持个性化的图形界面、用鼠标操作设置 BIOS、安全启动等。
其中所谓的 UEFI BIOS 的安全启动:计算机通电加载内置 UEFI 固件后,接着运行 ESP 分区中的各种 UEFI 应用和硬件驱动,这些 eif 文件都要有被认可的数字签名,改签名由操作系统厂商提供,只有符合认证的硬件驱动及应用才会被加载,这在一定程度上降低了启动型程序在操作系统启动前被预加载造成的风险。这就很容易理解安装黑苹果的教程都让我们在 BIOS 里关闭安全启动 Secure Boot:因为有些 efi 驱动文件并没有签名而不被信任,导致无法正常加载后启动安装程序。同理可以明白为什么要设置主板的 CSM(兼容性支持模块) 选项了。
而 MBR 和 GPT 则是磁盘的两种分区表格式。MBR 仅支持最大 2.2TB 磁盘,四个主分区,犹记当年 XP 时代划分超过四个主分区时要创建扩展分区和逻辑分区;GPT 则支持达 18EB 的磁盘,理论上无限个分区。
按照上述原理回想博主的几个系统安装流程,最初安装 Windows 时,安装程序将引导程序写入 MBR;安装 Ubuntu 时,grub 又覆盖并托管了 Windows 在 MBR 上的引导程序,给了个可供选择的菜单。安装黑苹果后因为要用 CLOVER ,仅能用 EFI 分区启动,所以得重新给 Windows 和 Ubuntu 添加新的 efi 启动文件并放到 ESP 分区里。
参考资料:
- 初步了解计算机与操作系统启动原理
- 计算机是如何启动的?
- [grub实现]U盘引导多个linux镜像安装,同时支持BIOS和UEFI模式
- 关于Windows Boot Manager、Bootmgfw.efi、Bootx64.efi、bcdboot.exe 的详解
- EFI系统引导的一些零碎知识点
- 科普贴:BIOS和UEFI的启动项
- UEFI启动背后的原理
- 计算机开机BIOS初始化与MBR操作系统引导详解
- IT之家学院:BIOS、EFI 与 UEFI 详解