跳转到内容

Clover

来自 Arch Linux 中文维基

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

注意:传统 BIOS 下依然需要使用 UEFI/GPT 分区模式,唯一的区别是需要在 EFI 系统分区上设置“Legacy BIOS Bootable”标识。

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 系统分区

将传统引导加载程序复制到 EFI 系统分区中:

# cp /mnt/iso/usr/standalone/i386/x64/boot6 /boot/boot

配置

Clover 的配置是通过编辑 EFI 系统分区EFI/CLOVER 目录下的 XML 文件 config.plist 来完成的。

各配置参数的详情请参见 Clover 的 wikiVolume 应是 EFI 系统分区的 UUID 且必须大写。Arguments 中的 最小 initramfs initramfs-linux.imgPath 中的 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>


参见