rEFInd (简体中文)

rEFInd 是一个 UEFI 能够启动 EFISTUB 内核的启动管理器。它是 rEFIt (不再维护)的一个分支并且针对非 Mac 硬件修复了若干问题。它被设计为平台无关,可启动多个操作系统。

注意: 整篇文章中 esp 代表 EFI system partition (简体中文) 的挂载点。

翻译状态:本文是 rEFInd翻译。上次翻译日期:2021-03-19。如果英文版本有所更改,则您可以帮助同步翻译。

安装

安装 refind 包。

安装 rEFInd 启动管理器

rEFInd 附带了实现了对 ReiserFS, Ext2, Ext4, Btrfs, ISO-9660 and HFS+ 只读支持的 UEFI drivers。而且 rEFInd 能够访问任何 UEFI 本身能够存取的文件系统,包括 FAT (由 UEFI 规范强制要求), 在 Mac 上的 HFS+ 和一些系统上的 ISO-9660。

额外的驱动可以参考 The rEFInd Boot Manager: Using EFI Drivers: Finding Additional EFI Drivers

为了使用 rEFInd, 务必将它安装到 EFI 分区, 使用 rEFInd 安装脚本或者手动复制文件并设置启动入口.

以 rEFInd 安装脚本安装

rEFInd 包含有一个 refind-install 脚本来简化将你的 rEFInd 设置为默认 EFI 启动项的过程。这个脚本有几个选项用于处理不同的设置和 UEFI 实现。想要了解不同选项的含义,请参见 或者读安装脚本里面的注释。

对于许多系统来说,运行下面的命令就足够了:

# refind-install

此操作会尝试找到并挂载您的 ESP,将 rEFInd 的文件复制到 ,并使用 efibootmgr 将 rEFInd 设置为默认的 UEFI 启动项。

或者您可以将 rEFInd 安装到默认/回退(fallback)启动路径 。这对于可启动的 USB 驱动器或者在那些 efibootmgr 做的 NVRAM 更改有问题的系统上会有帮助:

# refind-install --usedefault /dev/sdXY

其中 /dev/sdXY 是你的 EFI 分区 (块设备, 不是挂载点).

将 rEFInd 的文件安装到 ESP 之后, 验证 rEFInd 已经在你的内核所在文件夹创建了包含内核参数的 文件。如果你用了 选项,该文件不会被创建,请以 root 身份运行 mkrlconf 来创建它。

默认情况下,rEFInd 会扫描你的所有的驱动器(它有驱动的那些)并为它找到的每一个 EFI bootloader 添加一个启动入口,其中就包含你的内核(因为 Arch 默认启用了 EFISTUB )。因此你在这时候就可能有一个可以启动的系统。

Secure Boot

要在 rEFInd 中使用 Secure Boot,请参考 Managing Secure Boot

使用 PreLoader

要获取经过签名的 和 二进制文件,请参考 Secure Boot#Set up PreLoader

以 选项执行 。

# refind-install --preloader /usr/share/preloader-signed/PreLoader.efi

当你下次以 Secure Boot 开启状态启动时,HashTool 会启动并让你注册 rEFInd (loader.efi) 、rEFInd 的驱动器 (如 )和内核 (如 ) 的 hash。

更多信息参见 。

使用 shim

安装 。阅读 Secure Boot#shim,但是跳过所有的文件复制。

使用 hash

要只使用带有 hash 的 shim,请以 参数执行 :

# refind-install --shim /usr/share/shim-signed/shimx64.efi

当你下次以 Secure Boot 开启状态启动时, MokManager 会启动并让你注册 rEFInd (loader.efi) 、rEFInd 的驱动器 (如 )和内核 (如 ) 的 hash。

使用机器所有者密钥(Machine Owner Key)

要使用计算机所有者密钥(MOK)对 rEFInd 进行签名,请安装 。

以 和 选项执行 :

# refind-install --shim /usr/share/shim-signed/shimx64.efi --localkeys

refind-install 会为你创建密钥并为它和它的驱动器签名。你需要用同一个密钥为内核签名,如:

# sbsign --key /etc/refind.d/keys/refind_local.key --cert /etc/refind.d/keys/refind_local.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux

进入 MokManager 之后,将 refind_local.cer 添加到 MoKList。在 rEFInd 的安装目录下,如 esp/EFI/refind/keys/refind_local.cer,一个叫做 的文件夹里面可以找到 refind_local.cer

更多信息参见 。

使用你自己的密钥

跟随 Secure Boot#Using your own keys 来创建密钥。

创建目录 并将 Signature Database (db) 密钥和证书放在其中。 将文件命名为: (PEM 格式私钥), (PEM 格式证书) 和 refind_local.cer (DER 格式证书)。

在运行安装脚本时添加 选项,如:

# refind-install --localkeys

rEFInd EFI 二进制文件将会被用提供的密钥和证书签名。

手动安装

如果 脚本没有正常工作,您可以手动设置 rEFInd。

首先,将可执行文件复制到 EPS:

# mkdir -p esp/EFI/refind
# cp /usr/share/refind/refind_x64.efi esp/EFI/refind/

如果想要将 rEFInd 安装到默认/回退(fallback) 启动路径,请在下面将 替换为 ,并将 rEFInd EFI 可执行文件复制到 :

# mkdir -p esp/EFI/BOOT
# cp /usr/share/refind/refind_x64.efi esp/EFI/BOOT/bootx64.efi

然后使用 efibootmgr 来在 UEFI NVRAM 中创建一个启动入口,其中 和 Y 是你的 EFI 分区的设备和分区号。如果你要将 rEFI 安装到默认/回退(fallback) 启动路径 ,你可以跳过这一步。

# efibootmgr --create --disk /dev/sdX --part Y --loader /EFI/refind/refind_x64.efi --label "rEFInd Boot Manager" --verbose

此时,你应该能重启到 rEFInd,但是它无法引导你的内核。如果你的内核不在你的 ESP 上,那么 rEFInd 可以挂载你的分区来查找它,只要它具有正确的驱动程序即可。

rEFInd 会从其安装目录中的子目录 和 (例如 )自动加载所有驱动程序。

# mkdir esp/EFI/refind/drivers_x64
# cp /usr/share/refind/drivers_x64/drivername_x64.efi esp/EFI/refind/drivers_x64/

现在,rEFInd应该为你的内核提供了一个启动项,但是不会传递正确的内核参数。设置#传递内核参数。现在,你应该可以使用 rEFInd 引导内核了。如果仍然无法启动或想要调整 rEFInd 的设置,则可以使用配置文件来更改许多选项:

# cp /usr/share/refind/refind.conf-sample esp/EFI/refind/refind.conf

该示例配置文件具有很好的注释并且不言自明。

除非你在配置文件中设置了,否则你应该复制 rEFInd 的图标以摆脱难看的占位符:

# cp -r /usr/share/refind/icons esp/EFI/refind/

你可以尝试通过复制不同的字体并更改 中的 font 设置来进行尝试:

# cp -r /usr/share/refind/fonts esp/EFI/refind/

更新 rEFInd

Pacman 只更新在 中的文件,不会将新文件复制到 ESP。 如果最初 成功安装了 rEFInd,则可以再次运行以更新文件。 新的配置文件会被复制为 ,你可以使用一个 diff 工具选择、改变合并到你的配置文件。如果你的 rEFInd 需要#手动安装,你需要自己找出需要复制哪些文件。

Pacman 钩子

你可以使用一个 pacman 钩子来自动化更新过程:

你可能需要为你的设置将 更改为正确的更新命令。如果您进行了#手动安装,则可以创建自己的更新脚本以使用钩子进行调用。

提示: 如果你使用 #Secure Boot 设置 rEFInd,则可能需要在 refind-install 命令中额外添加选项 --yes。如果在禁用 Secure Boot 后执行该命令,它将防止该命令失败。更多信息参见 refind-install(8)

配置

rEFInd 的配置文件 存放在 rEFInd EFI 应用的同一目录下(通常为 或 )。默认的配置文件包含了解释了所有选项的扩展注释,更详细的解释参考 Configuring the Boot Manager

传递内核参数

有两种方法可以设置 rEFInd 传递给内核的内核参数

对于 rEFInd 自动检测到的内核

对于自动检测到的内核,你可以在 中显式指定内核参数,也可以依靠 rEFInd 识别 root 分区和内核参数的能力。更多信息参见Methods of Booting Linux: For Those With Foresight or Luck: The Easiest Method

为了使 rEFInd 支持 Arch Linux 内核的命名方案并因此使其与各自的 initramfs 镜像相匹配,必须取消注释并编辑 中的 选项。例如:

注意:
  • rEFInd 仅支持为每个内核检测一个 initramfs 镜像,这意味着它将不检测 fallback initramfs 或微码镜像,必须手动指定它们。
  • 如果没有上述 extra_kernel_version_strings 行,refind_linux.conf 中的 %v 变量将不适用于 Arch Linux 内核
refind_linux.conf

如果 rEFInd 自动检测到你的内核,你可以将包含内核参数的 文件放置在与内核相同的目录中。你可以使用 作为起点。 未注释的第一行将是内核的默认参数。随后的行将在子菜单中创建可使用 , F2, 或 访问的条目。

或者,尝试以 root 身份运行 mkrlconf。它将会尝试在 中找到你的内核,并自动生成 。该脚本只会设置最基本的内核参数,因此请确保检查其创建的文件的正确性。

如果未指定 参数,rEFInd 将通过在与内核相同的目录中搜索常用RAM磁盘文件名来自动添加它。如果需要多个 参数,则必须在 中手动指定它们。例如,一个在 initramfs 之前传递的微码

无需配置的情况

如果你仅将 rEFInd 安装到 ESP 上并毫不费力地启动它(例如通过 UEFI Shell 或 KeyTool,或直接从固件),您仍然可以通过自动检测从启动菜单,而无需进行任何配置。

这之所以可行,是因为 rEFInd 具有回退机制,可以:

手动启动项

如果未自动检测到内核,或者你只想对菜单项的选项进行更多控制,则可以使用 中的 stanzas 来手动创建引导项。确保 包含 ,否则这些条目将不会出现在 rEFInd 的菜单中。内核参数使用 关键字设置。 rEFInd 将使用 stanza 中的 initrd 关键字指定的文件附加 参数。如果你需要其他 initrd(例如微码),则可以在 中指定它们(并且 initrd 关键字指定的会添加到末尾)。

手动启动项在 Creating Manual Boot Stanzas 中有详细解释。

您可能需要更改 volume以匹配文件系统的标签、PARTLABEL 或内核镜像所在分区的 PARTUUID。PARTUUID 必须大写的。有关分配卷标的示例,请参见 Persistent block device naming (简体中文)#by-label。如果未指定 volume,则默认为启动 rEFInd 的卷(通常是EFI系统分区)。

在已有的 Windows UEFI 安装中使用 rEFInd

rEFInd 兼容 UEFI Windows 安装时创建的 EFI 系统分区,因此没有必要创建或格式化另一个 FAT32 分区。只需挂载 Windows 的 ESP 并像往常一样安装 rEFInd。默认情况下,rEFInd 的自动检测功能应该识别任何现有的 Windows 引导程序。

工具

rEFInd支持运行各种。工具需要单独安装。在 中编辑 文件选择要显示的内容。

UEFI shell

参见 Unified Extensible Firmware Interface#UEFI Shell

复制 到 EFI 分区 的根目录。

Memtest86

安装 并将它复制到 esp/EFI/tools/

# cp /usr/share/memtest86-efi/bootx64.efi esp/EFI/tools/memtest86.efi

密钥管理工具

rEFInd 能够检测 Secure Boot 密钥管理工具,如果他们被放在 EPS 上的 rEFInd 的文件夹内,如 或 esp/EFI/tools/

HashTool

参照 #使用 PreLoader, 将被放在 rEFInd 的文件夹内。

MokManager

参照 #使用 shim,MokManager 将被放在 rEFInd 的文件夹内。

KeyTool

安装 。

将 KeyTool EFI 二进制文件放在 或者 esp/EFI/tools/ 中,并命名为 或 。

关于签名 的指导,请参考 Secure Boot#Using KeyTool

GPT fdisk (gdisk)

下载 gdisk EFI 应用 并将 复制到 esp/EFI/tools/

fwupdate

安装并设置好 fwupd

将 和固件复制到 esp/EFI/tools/

# cp /usr/lib/fwupd/efi/fwupdx64.efi esp/EFI/tools/

关机或重启

据报道,rEFInd 内置了关机和重启菜单项。由于这个工具列表是这个 wiki 中的同类工具中最广泛的,因此 UEFI shell 或其他 UEFI 引导管理器(如 systemd-boot )的用户可能会对 powerofforreboot.efiAUR 感兴趣。

提示与小技巧

在 UEFI shell 中使用驱动

要在 UEFI shell 中使用 rEFInd 的驱动,请使用 命令来加载它们,并使用 来刷新驱动器映射。

Shell> load FS0:\EFI\refind\drivers\ext4_x64.efi
Shell> map -r

现在你可以从 UEFI shell 访问你的文件系统了。

设置 efifb 分辨率

如果 中的分辨率被设置为一个不正确的值,在除了 Apple Mac 的所有系统中, rEFInd 都会展示一个支持的分辨率列表。对于 Apple Mac, 它会静默使用默认分辨率。

要确定 efifb 支持的帧缓冲区分辨率,请 将 复制到 ESP 的根目录。进入 UEFI shell 并运行 modelist.efi

在 中设置一个。重启并用 来检查设置是否已被应用。

自动检测

要允许在 Btrfs 子卷上进行内核自动检测,请取消注释并编辑 中的 。

然后在 中将 添加到 rootflags,之后将 添加到 initrd 路径之前。

手动启动项

如果将一个 btrfs 子卷作为根目录引导,请将子卷的路径预先添加到 loader 和 initrd 路径之前,并用 修改 行。在下面的示例中,root 已作为名为“ROOT”的btrfs子卷挂载(例如 mount -o subvol=ROOT /dev/sdxY /mnt):

如果失败将导致以下错误信息:

LoaderDevicePartUUID

从 0.13.1 版本开始,rEFInd 支持设置 UEFI 变量 LoaderDevicePartUUID。启用此选项允许 自动挂载 EFI 系统分区,而无需在 中指定它。请参阅 systemd#GPT partition automounting

对于 rEFInd, 要设置 , 请编辑 并取消注释 :

您可以通过使用 cat /sys/firmware/efi/efivars/LoaderDevicePartUUID-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f 检查它的值,或者通过查看 输出中 “Boot loader sets ESP partition information” 的状态来验证它是否已设置。

疑难解答

Apple Macs

AUR 上的 是 "bless" 工具的实验性替代品。如果它不能正常工作, 在 OS X 中使用 "bless" 来将 rEFInd 设置为默认启动项。

 # bless --setBoot --folder esp/EFI/refind --file esp/EFI/refind/refind_x64.efi

VirtualBox

6.1 版本之前的 VirtualBox 将只引导默认的 路径,因此 至少需要与 选项一起使用。有关详细信息,请参阅 VirtualBox/Install Arch Linux as a guest#Installation in EFI mode on VirtualBox < 6.1

参见

This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.