Clover
Clover EFI 是一个用于在传统引导模式或 UEFI 引导模式下启动 macOS(Hackintoshes)、Windows 和 Linux 的 引导加载程序。
Clover 的主要优势有:
- 在传统 BIOS 系统上模拟 UEFI。
- 启动支持 EFI boot stub 的 Linux 内核。
- 在如今常见的宽屏上支持原生分辨率的图形界面。
- 简单易用
- 易于配置和自定义
支持的文件系统类型
Clover 继承了固件所支持的文件系统(例如,至少支持 FAT12、FAT16 和 FAT32),除此以外还会加载位于安装目录中的 drivers 子目录下的所有 UEFI 驱动(目录位置示例:esp/EFI/clover/drivers)[1]。
此外 Clover 也有多个EFI 文件系统驱动。
安装
由于 Clover 在 BIOS 系统上模拟 UEFI 环境,其在不同系统上的安装流程是类似的。
UEFI
若直接从 UEFI 启动到一个 EFI boot stub 内核中,推荐将 EFI 系统分区挂载到 /boot。
然后使用 mkinitcpio 生成早期用户空间环境。
从 Clover 发布页面 上下载可引导的 Clover ISO 文件。
解压已下载的压缩文件,然后找到文件名为 Clover-*-X64.iso 的镜像文件,将其挂载到如 /mnt/iso 之类的目录下。需要注意的是,所有文件或目录名称在 Linux 中都会显示为小写字母,这和 Windows 与 Mac OS 上是不同的。
如果已按上述流程将镜像文件挂载到 /mnt/iso 下,请将整个 /mnt/iso/efi 目录复制到 EFI 系统分区中。/boot 目录树应该像下面这样:
/boot/EFI /boot/EFI/BOOT /boot/EFI/CLOVER /boot/initramfs-linux-fallback.img /boot/initramfs-linux.img /boot/vmlinuz-linux
如果当前有其他的操作系统(例如 Windows)接管了你的 EFI 分区,不要忘记备份 EFI 分区中 BOOT 文件夹下的 bootx64.efi 文件。
BIOS
从 Clover 发布页面 上下载可引导的 Clover ISO 文件。
解压已下载的压缩文件,然后找到文件名为 Clover-*-X64.iso 的镜像文件,将其挂载到如 /mnt/iso 之类的目录下。
此时必须将 Clover 与主分区记录(MBR)和启动分区记录(PBR)合并。
以下是示例,此示例中有一个块设备 /dev/sda,ESP 位于其第一个分区 /dev/sda1 上:
# dd if=/dev/sda1 of=/tmp/original_PBR bs=512 count=1 conv=notrunc # cp /mnt/iso/usr/standalone/i386/boot1f32 /tmp/new_PBR # dd if=/tmp/original_PBR of=/tmp/new_PBR skip=3 seek=3 bs=1 count=87 conv=notrunc # dd if=/tmp/new_PBR of=/dev/sda1 bs=512 count=1 conv=notrunc # dd if=/mnt/iso/usr/standalone/i386/boot0ss of=/dev/sda bs=440 count=1 conv=notrunc
然后将 EFI 系统分区挂载到 /boot。
将整个 /mnt/iso/efi 目录复制到 EFI 系统分区。
# cp /mnt/iso/usr/standalone/i386/x64/boot6 /boot/boot
配置
Clover 的配置是通过编辑 EFI 系统分区中 EFI/CLOVER 目录下的 XML 文件 config.plist 来完成的。
各配置参数的详情请参见 Clover 的 wiki。Volume 应是 EFI 系统分区的 UUID 且必须大写。Arguments 中的 最小 initramfs initramfs-linux.img 和 Path 中的 Linux 内核可执行文件 vmlinuz-linux 路径都是基于 EFI 系统分区的相对路径。反斜杠应根据 EFI 标准使用。对于 Arguments 中的其他可用参数,请参见 EFI boot stub 和内核参数#参数列表。
下面的例子中,initramfs 和内核文件都位于 EFI 系统分区的根目录下,即 efi 的同一级目录,并且 EFI 系统分区挂载于 /boot:
/boot/EFI/CLOVER/config.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>GUI</key> <dict> <key>Custom</key> <dict> <key>Entries</key> <array> <dict> <key>Arguments</key> <string>initrd=\initramfs-linux.img root=PARTUUID=d5d0fceb-c58e-c745-a7ff-f2f1b2824e66 rw add_efi_memmap</string> <key>Path</key> <string>\vmlinuz-linux</string> <key>Title</key> <string>Arch Linux</string> <key>Type</key> <string>Linux</string> <key>Volume</key> <string>33BA6C23-4772-294D-9053-72A49FCAEF39</string> <key>VolumeType</key> <string>Internal</string> </dict> <dict> <key>Arguments</key> <string>initrd=\initramfs-linux-fallback.img root=PARTUUID=d5d0fceb-c58e-c745-a7ff-f2f1b2824e66 rw debug add_efi_memmap</string> <key>Path</key> <string>\vmlinuz-linux</string> <key>Title</key> <string>Arch Linux Rescue Mode</string> <key>Type</key> <string>Linux</string> <key>Volume</key> <string>33BA6C23-4772-294D-9053-72A49FCAEF39</string> <key>VolumeType</key> <string>Internal</string> </dict> </array> </dict> </dict> </dict> </plist>
链式加载 systemd-boot
若需要一个遵守 The Boot Loader Specification 的引导加载程序,systemd-boot 可以完成这项功能。以下是一份令 Clover 链式加载 systemd-boot 的配置文件:
/boot/EFI/CLOVER/config.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Boot</key> <dict> <key>DefaultVolume</key> <string>EFI</string> <key>DefaultLoader</key> <string>\EFI\systemd\systemd-bootx64.efi</string> <key>Fast</key> <true/> </dict> <key>GUI</key> <dict> <key>Custom</key> <dict> <key>Entries</key> <array> <dict> <key>Hidden</key> <false/> <key>Disabled</key> <false/> <key>Image</key> <string>os_arch</string> <key>Volume</key> <string>EFI</string> <key>Path</key> <string>\EFI\systemd\systemd-bootx64.efi</string> <key>Title</key> <string>Arch Linux</string> <key>Type</key> <string>Linux</string> </dict> </array> </dict> </dict> </dict> </plist>