用Clover引导Linux

2020-09-01 Technical Salty Fish 2条
为了使用全盘加密,我已经重新换回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是旧的内核,留了一份备份)

efi_structure.png

配置Clover启动项

拿到了需要的文件后顺手umount掉刚刚挂载的Linux分区,现在来配置Clover里Manjaro Linux的启动项。用Clover Configurator打开config.plist,在这里新建一个条目:

clover_config.png

重要的参数如下:

参数
VolumeEFI分区的UUID,可以直接在下拉列表里选择EFI分区
Path\Manjaro\vmlinuz-5.4-x86_64(根据自己的情况设置vmlinuz文件的路径)
Title/Fulltitle你希望在Clover里看到的启动项名字,建议打上下面的勾
Arguments见下文
TypeLinux
VolumeTypeInternal

注意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选择操作系统的界面:

clover_bootup.png

默认选择中间的MacOS,3秒超时自动启动;可以按键盘方向键打断倒计时并选择左边的Windows或右边的Manjaro Linux。选中Manjaro Linux后回车开始滚屏,滚屏完成后就来到了Manjaro Linux的登录界面,中间没有看着闹心的链式引导的Grub,清清爽爽。

已有 2 条评论
  1. 2020年时用OpenCore更好 (当时的版本为 0.5.4), 2019年推出用于取代Clover的项目, 当时透過一个Aleksey Konovalov的俄语Youtube看到的, 然后我就从Clover切换到了OpenCore, 原始作者vit9696就是俄罗斯人, 很友好