为了使用全盘加密,我已经重新换回Grub,不再使用本文描述的方式引导Linux。没有资料表明Clover支持引导全盘加密的Linux,如果你了解相关信息,可以留下评论或通过Telegram联系我。
我的主力电脑是一台黑苹果笔记本,因此安装了Clover Bootloader用来引导MacOS。有时候我也会需要用到Linux和Windows,所以我在笔记本上也安装了这两个操作系统,其中Linux选择了Manjaro发行版。
之前一直都是用Clover链式引导Grub,再由Grub引导Linux,但这样用起来并不舒服,总有一种特别简陋的感觉。Clover其实非常强大,除了引导Hackintosh、直接加载bootmgfw.efi
引导Windows,它还原生支持引导Linux。所以我研究了一下如何避免链式引导,直接用Clover启动Linux内核。
多说一句,Clover另外一个贼强的地方是传统BIOS能引导GPT硬盘上安装的Clover,再由Clover模拟出UEFI环境。这样就能在老式非UEFI电脑上把Windows 10装在GPT硬盘上,不依赖外部设备引导。亲测有效。
把Clover安装到硬盘上不需要MacOS,可以用Clover legacy installer在Windows环境下安装。
前言
众所周知,Linux系统启动时,通常都是由一个Bootloader(一般为Grub)加载Linux内核,再由内核加载整个系统。我安装的时候是UEFI的方式,/boot/efi
挂载了ESP分区,里面存放着Grub的efi文件。既然要用Clover直接引导了,Grub其实就可以删掉了。
比较大的问题是Clover不能读取ext4文件系统。网上说安装VboxExt4驱动就可以读取了,但我实测没有成功。有兴趣的朋友可以试试。这里我采取的方案是把/boot
分区下的内核文件复制到FAT32格式的ESP分区(其它分区也可以,不一定要是ESP),然后让Clover读ESP分区下的启动文件。
为什么不直接把ESP分区挂载到/boot
? 我最初是这样做的,但更新了一次Linux内核后出现了问题:内核文件丢了。我不知道为什么会这样,也没有试着再现这个问题。修复花了很大功夫:制作一个Live USB,启动进去后chroot
到硬盘上的Manjaro里,然后重新安装内核。弄好之后我直接放弃了挂载/boot
的想法,转而直接复制内核文件了。有兴趣的朋友可以尝试使用挂载的方式,如果没问题请告诉我,我再去研究(笑)。
放置内核文件
进入MacOS,先复制内核文件(这一步也可以在Linux下操作)。为了挂载ext4分区,需要安装ext4fuse
。用brew
安装,非常简单。在终端下使用diskutil list
可以查看所有的磁盘和分区:
/dev/disk1 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
4: Linux Filesystem 173.6 GB disk1s4
无关信息我省略了。这里的disk1s4
就是Linux的/
挂载点处挂载的文件系统。用ext4fuse
挂载:sudo ext4fuse /dev/disk1s4 /Volumes/Linux/
,把这个文件系统挂载到/Volumes/Linux
下。此时在Finder里是看不见挂载点的,终端也进不去,只有root
用户才能操作这个分区。
~ $ ls /Volumes/
Linux Windows macOS
~ $ cd /Volumes/Linux
-bash: cd: /Volumes/Linux: No such file or directory
~ $ sudo ls /Volumes/
Linux Windows macOS
~ $ sudo ls /Volumes/Linux
.manjaro-tools lib64 sbin
bin lost+found srv
boot mnt sys
desktopfs-pkgs.txt opt tmp
dev proc usr
etc root var
home rootfs-pkgs.txt
lib run
用Clover Configurator挂载EFI分区并用cp
命令把/boot
整个目录复制过来,复制完之后应该是这个样子:(ManjaroOLD是旧的内核,留了一份备份)
配置Clover启动项
拿到了需要的文件后顺手umount
掉刚刚挂载的Linux分区,现在来配置Clover里Manjaro Linux的启动项。用Clover Configurator打开config.plist
,在这里新建一个条目:
重要的参数如下:
参数 | 值 |
---|---|
Volume | EFI分区的UUID,可以直接在下拉列表里选择EFI分区 |
Path | \Manjaro\vmlinuz-5.4-x86_64 (根据自己的情况设置vmlinuz 文件的路径) |
Title/Fulltitle | 你希望在Clover里看到的启动项名字,建议打上下面的勾 |
Arguments | 见下文 |
Type | Linux |
VolumeType | Internal |
注意Arguments
不要自己填!打开刚才复制出来的/boot
目录,在grub
子目录里有一个grub.cfg
,这是Grub的配置文件。打开它,搜索linux
能搜到这样的两行:
linux /boot/vmlinuz-5.4-x86_64 root=UUID=(一串UUID) rw quiet resume=UUID=(一串UUID) udev.log_priority=3
initrd /boot/intel-ucode.img /boot/initramfs-5.4-x86_64.img
这就是Grub里Linux启动项的配置参数,稍作修改就能让Clover使用这些参数了。把第一行中root=UUID=(一串UUID) rw quiet resume=UUID=(一串UUID) udev.log_priority=3
这些内容复制下来,贴进Arguments
;在最后加一个空格,再加上:initrd=\Manjaro\initramfs-5.4-x86_64.img
(根据自己的情况设置initramfs
文件的路径)。quiet
参数指示不显示启动过程,启动过程会显示Logo,然而在我的HP笔记本上,会被愚蠢的HP Logo替代;再者,我喜欢看启动过程的滚屏(超帅!),所以我把它删掉了。
最后,我的Arguments
内容如下:root=UUID=(一串UUID) rw resume=UUID=(一串UUID) udev.log_priority=3 initrd=\Manjaro\initramfs-5.4-x86_64.img
填好启动项后,保存配置文件,大功告成。
最终效果
来重启一下电脑查看效果吧!这是我的Clover选择操作系统的界面:
默认选择中间的MacOS,3秒超时自动启动;可以按键盘方向键打断倒计时并选择左边的Windows或右边的Manjaro Linux。选中Manjaro Linux后回车开始滚屏,滚屏完成后就来到了Manjaro Linux的登录界面,中间没有看着闹心的链式引导的Grub,清清爽爽。
2020年时用OpenCore更好 (当时的版本为 0.5.4), 2019年推出用于取代Clover的项目, 当时透過一个Aleksey Konovalov的俄语Youtube看到的, 然后我就从Clover切换到了OpenCore, 原始作者vit9696就是俄罗斯人, 很友好