跳转至内容

rEFInd

来自 ArchWiki

rEFInd 是一个 UEFI 引导管理器,能够以 EFI 引导存根 的形式启动内核。它是已不再维护的 rEFIt 的一个分支,并修复了许多与非 Mac UEFI 引导相关的问题。它旨在实现平台中立并简化多操作系统的引导。

注意 在整个文章中,esp 表示 EFI 系统分区 的挂载点。

支持的文件系统

rEFInd 继承了 来自固件 的文件系统支持(即至少 FAT12、FAT16 和 FAT32)。此外,它还会加载放置在其自身安装目录的 ESP 分区中的 driversdrivers_x64 子目录下的任何 UEFI 驱动。例如:esp/EFI/refind/drivers_x64/

rEFInd 还附带了一 小集合 的只读 EFI 文件系统驱动,特别是 ext4Btrfs

安装

安装 refind 包。

安装 rEFInd 启动管理器

rEFInd 附带的 UEFI 驱动 实现了对 ReiserFS(已弃用)、Ext2、Ext4、Btrfs、ISO-9660 和 HFS+ 的 **只读** 支持。此外,rEFInd 还可以访问 UEFI 本身能够访问的任何文件系统,这包括 FAT(如 UEFI 规范所要求的)、Mac 上的 HFS+ 以及某些系统上的 ISO-9660。

要查找其他驱动程序,请参阅 rEFInd 启动管理器:使用 EFI 驱动程序:查找其他 EFI 驱动程序

要使用 rEFInd,您必须将其安装到 EFI 系统分区,方法是使用 refind-install 脚本手动复制文件并设置引导项

警告
  • 您的内核和 initramfs 必须位于 rEFInd 可以读取的文件系统上。
  • 像 Btrfs 的写时复制(copy-on-write)这样的高级功能可能会与 rEFInd 的文件系统驱动程序产生冲突。例如,rEFInd 0.14.2 如果您的 /boot 文件夹位于 Btrfs 上并且启用了 deduplication,则会抛出一个无效的 Not Found 错误。请参阅 Btrfs#禁用写时复制 以了解如何为 /boot 禁用写时复制。

使用 refind-install 脚本安装

rEFInd 包包含 refind-install 脚本,用于简化将 rEFInd 设置为默认 EFI 引导项的过程。该脚本具有多种选项,可处理不同的设置和 UEFI 实现。请参阅 refind-install(8) 或阅读安装脚本中的注释以了解各种安装选项的说明。

对于许多系统来说,只需运行以下命令就足够了

# refind-install

这将尝试查找并挂载您的 ESP,将 rEFInd 文件复制到 esp/EFI/refind/,并使用 efibootmgr 将 rEFInd 设置为默认 EFI 引导应用程序。

或者,您可以将 rEFInd 安装到默认/回退引导路径 esp/EFI/BOOT/bootx64.efi。这对于可引导的 USB 闪存驱动器或在处理 efibootmgr 所做的 NVRAM 更改时出现问题的系统很有帮助。

# refind-install --usedefault /dev/sdXY

其中 /dev/sdXY 是您的 EFI 系统分区(块设备,而非其挂载点)。

提示 默认情况下,refind-install 只安装内核所在文件系统的驱动程序。其他文件系统需要通过从 /usr/share/refind/drivers_x64/ 复制到 esp/EFI/refind/drivers_x64/ 来手动安装,或者您可以使用 --alldrivers 选项安装所有驱动程序。这对于可引导的 USB 闪存驱动器很有用。

将 rEFInd 文件安装到 ESP 后,请验证 rEFInd 是否已在内核的同一目录中创建了包含 内核参数refind_linux.conf 文件。如果您使用了 --usedefault 选项,则不会创建此配置文件。运行 mkrlconf 作为 root 用户即可创建它。

警告 当在 chroot 环境中运行 refind-install 时(例如,在安装 Arch Linux 的 live 系统中),/boot/refind_linux.conf 将会被填充 live 系统的内核选项,而不是已安装系统的内核选项。请编辑 /boot/refind_linux.conf 并确保其中的 内核参数 对于您的系统是正确的,否则您在下次启动时可能会遇到内核恐慌。请参阅 #refind_linux.conf 获取示例文件。

默认情况下,rEFInd 将扫描您所有的驱动器(它有驱动程序的),并为找到的每个 EFI 引导加载程序添加一个引导项,这应该包括您的内核(因为 Arch 默认启用了 EFI 引导存根)。因此,此时您可能已经有一个可引导的系统了。

安全启动

有关 rEFInd 的 安全启动 支持,请参阅 管理安全启动

使用 PreLoader

请参阅 安全启动#设置 PreLoader 来获取签名的 PreLoader.efiHashTool.efi 二进制文件。

使用 --preloader /path/to/preloader 选项执行 refind-install

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

下次启动时,如果启用了安全启动,HashTool 将会启动,您需要注册 rEFInd (loader.efi)、rEFInd 的驱动程序(例如 ext4_x64.efi)和内核(例如 vmlinuz-linux)的哈希值。

有关更多信息,请参阅 refind-install(8)

提示 签名的 HashTool 只能访问启动它的分区。这意味着如果您的内核不在 ESP 上,您将无法从 HashTool 中注册它的哈希值。您可以使用 #KeyTool 来解决这个问题,因为它能够向 MokList 注册哈希值,并且不受限于单个分区。请记住在使用 KeyTool 之前先注册其哈希值。
使用 shim

安装 shim-signedAUR。请阅读 安全启动#shim,但跳过所有文件复制步骤。

使用哈希

要仅与 shim 一起使用哈希,请使用 --shim /path/to/shim 选项执行 refind-install

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

下次启动时,如果启用了安全启动,MokManager 将会启动,您需要注册 rEFInd (grubx64.efi)、rEFInd 的驱动程序(例如 ext4_x64.efi)和内核(例如 vmlinuz-linux)的哈希值。

使用机器所有者密钥

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

提示 如果您已经 创建了 MOK,请将文件放在 /etc/refind.d/keys 目录中,并命名为 refind_local.key(PEM 格式私钥)、refind_local.crt(PEM 格式证书)和 refind_local.cer(DER 格式证书)。

使用 --shim /path/to/shim--localkeys 选项执行 refind-install

# 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
提示 内核签名可以使用 mkinitcpio 后钩子 自动化,请参阅 安全启动#使用 mkinitcpio 后钩子签名内核

进入 MokManager 后,将 refind_local.cer 添加到 MoKList。refind_local.cer 可以在 rEFInd 的安装目录下的一个名为 keys 的目录中找到,例如 esp/EFI/refind/keys/refind_local.cer

有关更多信息,请参阅 refind-install(8)

使用自定义密钥

按照 安全启动#使用您自己的密钥 来创建密钥。

创建目录 /etc/refind.d/keys 并将签名数据库 (db) 密钥和证书放在其中。文件命名为:refind_local.key(PEM 格式私钥)、refind_local.crt(PEM 格式证书)和 refind_local.cer(DER 格式证书)。

运行安装脚本时,添加 --localkeys 选项,例如:

# refind-install --localkeys

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

手动安装

提示 rEFInd 可以以多种方式引导 Linux。有关各种方法的详细介绍,请参阅 rEFInd 启动管理器:引导 Linux 的方法

如果 refind-install 脚本对您不起作用,rEFInd 可以手动设置。

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

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

如果您想将 rEFInd 安装到默认/回退引导路径,请在以下说明中将 esp/EFI/refind/ 替换为 esp/EFI/BOOT/,并将 rEFInd EFI 可执行文件复制到 esp/EFI/BOOT/bootx64.efi

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

然后,使用 efibootmgr 在 UEFI NVRAM 中创建一个引导项,其中 /dev/sdXY 是您的 EFI 系统分区的设备和分区号。如果您将 rEFInd 安装到默认/回退引导路径 esp/EFI/BOOT/bootx64.efi,则可以跳过此步骤。

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

此时,您应该能够重新启动到 rEFInd,但它可能无法引导您的内核。如果您的内核不在 ESP 上,rEFInd 可能需要挂载您的分区来找到它。如果相关文件系统不是 UEFI 支持的类型,则可能需要额外的驱动程序文件。rEFInd 会自动加载其安装目录中 driversdrivers_arch(例如 drivers_x64)子目录下的所有驱动程序。

# 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

示例配置文件注释详细且易于理解。

除非您在配置文件中设置了 textonly,否则您应该复制 rEFInd 的图标以摆脱丑陋的占位符。

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

您可以通过复制不同的字体并更改 refind.conf 中的 font 设置来尝试使用它们。

# cp -r /usr/share/refind/fonts esp/EFI/refind/
提示 在 rEFInd 中按 F10 会将屏幕截图保存到 ESP 的顶层目录。

升级

Pacman 会更新 /usr/share/refind/ 中的 rEFInd 文件,但不会为您将新文件复制到 ESP。如果 refind-install 对您原始安装的 rEFInd 有效,您可以重新运行它来复制更新后的文件。新配置文件将被复制为 refind.conf-sample,以便您可以使用 diff 工具将更改集成到您现有的配置文件中。如果您的 rEFInd 需要 #手动安装,您需要自己确定要复制哪些文件。

Pacman 挂钩

您可以使用 pacman hook 来自动化更新过程。

/etc/pacman.d/hooks/refind.hook
[Trigger]
Operation=Upgrade
Type=Package
Target=refind

[Action]
Description = Updating rEFInd on ESP
When=PostTransaction
Exec=/usr/bin/refind-install

其中 Exec= 可能需要更改为适用于您设置的正确更新命令。如果您进行了 #手动安装,您可以创建自己的更新脚本来通过钩子调用。

  • 如果您 设置了带安全启动的 rEFInd,除了添加 --localkeys 之外,还要在 refind-install 命令中添加 --yes 选项。如果未使用 shim 或在安全启动禁用状态下启动系统,它将阻止命令失败。有关更多信息,请参阅 refind-install(8)
  • 如果 ESP 未挂载到 /boot 并且您依赖于自动挂载,请确保按照 EFI 系统分区#备用挂载点 中的说明预加载 vfat 模块。否则,如果 refind 与内核一起升级,ESP 将变得不可访问。

配置

rEFInd 配置文件 refind.conf 位于 rEFInd EFI 应用程序的同一目录下(通常是 esp/EFI/refindesp/EFI/BOOT)。默认配置文件包含 extensive comments 解释了所有选项,有关更详细的说明,请参阅 配置引导管理器

rEFInd 在运行时检测可引导的 EFI 二进制文件(Linux 内核、其他操作系统引导加载程序、UEFI 引导项等)。这意味着在大多数简单情况下,rEFInd 无需任何配置即可工作。特别是,默认情况下很可能可以引导 Windows。

但这并不意味着不需要配置;对于 Linux,用户可能希望设置内核参数和 initramfs。这可以在另一个配置文件 refind_linux.conf 中完成。下面有详细介绍。

传递内核参数

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

对于 rEFInd 自动检测到的内核

rEFInd 有两个(或更多)配置文件。位于 ESPrefind.conf 配置 rEFInd 本身。另一方面,refind_linux.conf 位于 /boot,即内核映像所在的目录,它配置了内核的引导方式。

对于自动检测到的内核,您可以显式地在 /boot/refind_linux.conf 中指定内核参数,或者依赖 rEFInd 识别根分区和内核参数的能力。有关更多信息,请参阅 引导 Linux 的方法:对于有远见或幸运的人:最简单的方法


提示

为了让 rEFInd 支持 Arch Linux 内核 的命名约定,从而允许将其与相应的 initramfs 镜像匹配,您必须在 refind.conf 中取消注释并编辑 extra_kernel_version_strings 选项。例如:

esp/EFI/refind/refind.conf
...
extra_kernel_version_strings "linux-hardened,linux-rt-lts,linux-zen,linux-lts,linux-rt,linux"
...
警告 未设置 extra_kernel_version_strings,rEFInd 将错误地将找到的第一个 initramfs 作为 initrd= 内核参数传递,而不是使用正确的 initramfs 来匹配内核。这将导致引导失败,因为匹配的可加载内核模块将不可用。
  • rEFInd 只支持为每个内核检测一个 initramfs 镜像,这意味着它将无法检测到回退 initramfs 或 外部微码 initramfs 镜像。如果使用,则必须手动指定它们。
  • 如果没有上面的 extra_kernel_version_strings 行,refind_linux.conf 中的 %v 变量对于 Arch Linux 内核 将不起作用。
refind_linux.conf

如果 rEFInd 自动检测到您的内核,您可以将包含内核参数的 refind_linux.conf 文件放在与您的内核相同的目录中。您可以从 /usr/share/refind/refind_linux.conf-sample 开始。refind_linux.conf 的第一条未注释行将是内核的默认参数。后续行将创建可使用 InsertF2Tab+ 访问的子菜单中的条目。

或者,尝试以 root 身份运行 mkrlconf。它将尝试在 /boot 中查找您的内核并自动生成 refind_linux.conf。该脚本只设置最基本的内核参数,所以请务必检查它创建的文件是否正确。

如果您不指定 initrd= 参数,rEFInd 将通过在与内核相同的目录中搜索常见的 RAM 磁盘文件名来自动添加它。如果您需要多个或非默认的 initrd= 参数,则必须在 refind_linux.conf 中手动指定它们。例如:

/boot/refind_linux.conf
"Boot using default options"     "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap"
"Boot using fallback initramfs"  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\initramfs-%v-fallback.img"
"Boot to terminal"               "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap systemd.unit=multi-user.target"
警告
  • 为了让 rEFInd 支持 Arch Linux 内核,必须按照 #对于 rEFInd 自动检测到的内核 中的说明编辑 esp/EFI/refind/refind.conf 中的 extra_kernel_version_strings
  • initrd 路径相对于内核所在文件系统的根目录。它可以是 initrd=\boot\initramfs-%v-fallback.img,或者,如果 /boot 是一个独立分区(例如 ESP),则为 initrd=initramfs-%v-fallback.img
  • initrd 参数中使用反斜杠 (\) 作为路径分隔符,否则内核可能无法找到 initramfs 镜像:EFI stub: ERROR: Failed to open file: /boot/initramfs-linux-fallback.img
  • 如果使用 Booster 生成的 initramfs 镜像,请将 initramfs 替换为 booster,并确保在主 initramfs 镜像之前指定 外部微码 initramfs 镜像。例如:initrd=boot\amd-ucode.img initrd=\boot\booster-%v.img
  • 引号通过重复来转义(即 """ 的转义版本)。例如,要将选项 acpi_osi="Windows 2015" 传递给上面 refind_linux.conf 的第一个引导项:
    "Boot using default options"     "... acpi_osi=""Windows 2015"" "
  • rEFInd 将 refind_linux.conf 中的 %v 替换为内核的版本(通过从文件名中提取)。
无配置

如果您只是将 rEFInd 安装到 ESP 并直接启动它(例如通过 UEFI shell 或 KeyTool,或直接从固件启动),您仍然会得到一个通过自动检测进行引导的菜单,完全无需配置。

这是因为 rEFInd 有一个可以

  • 通过 可发现分区规范/etc/fstab 识别根分区(用于 root= 参数)。
  • GPT 分区属性(使用属性 60 "只读")或 /etc/fstab 检测内核选项(rorw)。
注意 rEFInd 不支持 /etc/fstab 中的转义码(例如用于 空格)。

对于手动引导项

如果您的内核未被自动检测,或者您只是想对菜单项的选项进行更多控制,您可以使用 refind.conf 中的块手动创建引导项。确保 scanfor 包含 manual,否则这些条目不会出现在 rEFInd 的菜单中。内核参数使用 options 关键字设置。rEFInd 将使用块中 initrd 关键字指定的文件来附加 initrd= 参数。

提示 如果您需要额外的 initramfs 镜像,例如在使用 外部微码 initramfs 镜像 时,您可以在 options 中指定它们(而由 initrd 关键字指定的那一个将被添加到最后)。

手动引导项的解释请参阅 创建手动引导项

esp/EFI/refind/refind.conf
...

menuentry "Arch Linux" {
	icon     /EFI/refind/icons/os_arch.png
	volume   "Arch Linux"
	loader   /boot/vmlinuz-linux
	initrd   /boot/initramfs-linux.img
	options  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap"
	submenuentry "Boot using fallback initramfs" {
		initrd /boot/initramfs-linux-fallback.img
	}
	submenuentry "Boot to terminal" {
		add_options "systemd.unit=multi-user.target"
	}
}

您很可能需要将 volume 更改为与内核映像所在分区的 filesystem 的 LABEL、PARTLABEL 或 PARTUUID 匹配。有关分配卷标签的示例,请参阅 持久块设备命名#按标签。如果未指定 volume,则默认为 rEFInd 启动的卷(通常是 EFI 系统分区)。

警告
  • loaderinitrd 路径相对于 volume 的根目录。如果 /boot 是一个独立分区(例如 ESP),路径将分别是 /vmlinuz-linux/initramfs-linux.img
  • 在所有引用的 initrd 参数中使用反斜杠 (\) 作为路径分隔符,否则内核可能无法找到 initramfs 镜像:EFI stub: ERROR: Failed to open file: /boot/initramfs-linux.img
  • 如果使用 Booster 生成的 initramfs 镜像,请将 initramfs 替换为 booster。例如:initrd /boot/booster-linux.img
  • rEFInd 0.14.2 在某些设备上错误地将 LABEL 填充为 PARTLABEL,这可能导致 volume 匹配失败,并回退到默认引导卷。解决方法是加载任何驱动程序或在进入主菜单后按 Esc 重新扫描卷。请参阅 [1]
注意 引号通过重复来转义(即 """ 的转义版本)。例如,要将选项 acpi_osi="Windows 2015" 传递给上面 "Arch Linux" 引导项:
options  "... acpi_osi=""Windows 2015"" "

与现有 UEFI Windows 安装并存安装

注意 与 Windows 双重引导 的通常注意事项适用。

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

注意 在某些情况下,Windows 的行为可能不同(低分辨率启动屏幕、OEM Logo 被 Windows Logo 替换、启动屏幕后黑屏、出现伪影)。如果您遇到此类问题,请尝试在 esp/EFI/refind/refind.conf 中设置 use_graphics_for +,windows 或在 Windows 引导项中添加 graphics on

工具

本文档或章节可能适合与 Unified Extensible Firmware Interface 合并。

注意:尽管 rEFInd 为这些常用工具提供了特殊界面,但它们并非 rEFInd 的功能。(在 Talk:REFInd#template:move at refind#tools: to uefi 中讨论)

rEFInd 支持运行各种 第三方工具。工具需要单独安装。编辑 refind.conf 中的 showtools 来选择显示哪些工具。

esp/EFI/refind/refind.conf
...
showtools shell, memtest, mok_tool, gdisk, fwupdate ...
...

UEFI shell

请参阅 Unified Extensible Firmware Interface#UEFI Shell

shellx64.efi 复制到 EFI 系统分区 的根目录。

Memtest86+

安装 memtest86+-efi 并将其复制到 esp/EFI/tools/

# cp /boot/memtest86+/memtest.efi esp/EFI/tools/memtest86.efi

密钥管理工具

如果安全启动密钥管理工具被放置在 ESP 上的 rEFInd 目录,esp/esp/EFI/tools/ 中,rEFInd 可以检测到它们。

HashTool

按照 #使用 PreLoader 进行操作,HashTool.efi 将会被放置在 rEFInd 的目录中。

MokManager

按照 #使用 shim 进行操作,MokManager 将会被放置在 rEFInd 的目录中。

KeyTool

安装 efitools

将 KeyTool EFI 二进制文件放在 esp/esp/EFI/tools/ 中,文件名为 KeyTool.efiKeyTool-signed.efi

有关对 KeyTool.efi 进行签名的说明,请参阅 安全启动#使用 KeyTool

GPT fdisk (gdisk)

下载 gdisk EFI 应用程序并将 gdisk_x64.efi 复制到 esp/EFI/tools/

fwupd

安装 fwupd-efi 并设置 fwupd

fwupdx64.efi 二进制文件和固件文件复制到 esp/EFI/tools/

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

关机或重启

据报道,rEFInd 内置了关机和重启菜单项。由于这个列表是本维基中最全面的,UEFI shell 或其他 UEFI 引导管理器(如 systemd-boot)的用户可能对 powerofforreboot.efiAUR 感兴趣。

自定义

rEFInd 支持广泛的自定义,允许您修改启动屏幕上的图标、背景和字体。

手动自定义

要自定义 rEFInd,您需要编辑位于 esp/EFI/refindrefind.conf 配置文件。在以下示例中,所有资源都将存储在 esp/EFI/refind/assets 中。

要设置自定义背景图像(横幅),请在 refind.conf 中使用 wallpaper 指令。

banner assets/banner.png

要设置自定义图标集,请在 refind.conf 中使用 icons_dir 指令,并将其指向包含您的图标的文件夹。

icons_dir assets/icons

refind 包提供了大多数发行版(包括 Arch Linux)的一套图标。这些图标可以在 esp/EFI/refind/icons 中找到。

安装外部主题

安装外部主题很简单。首先,在您的 rEFInd 目录中创建一个 themes 文件夹。

# mkdir esp/EFI/refind/themes

克隆主题(例如,如果它托管在 GitHub 上)。

# git clone url-to-theme esp/EFI/refind/themes/theme-name

或者,手动复制主题。

# cp -r path-to-theme esp/EFI/refind/themes/theme-name

refind.conf 中,包含主题的配置文件。

include themes/theme-name/theme-name.conf
注意 确保您的主题与 rEFInd 兼容,并查阅主题的文档以获取任何特定的设置说明。

技巧与提示

在 UEFI Shell 中使用驱动程序

本文档或此部分已提交给 Unified Extensible Firmware Interface#UEFI drivers 以进行合并。

注意: rEFInd 的驱动程序并非唯一可以加载的驱动程序。将所有关于 UEFI 驱动程序的通用信息迁移到一个文章中。(在 Talk:REFInd 中讨论)

要在 UEFI Shell 中使用 rEFInd 的驱动程序,请使用 load 命令加载它们,并使用 map -r 刷新映射的驱动器。

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

现在您可以从 UEFI Shell 访问您的文件系统。

设置 efifb 分辨率

本文章或章节需要扩充。

原因: 应该可以直接依赖 resolution max。(在 Talk:REFInd 中讨论)

如果在 refind.conf 中设置了不正确的分辨率,则在 Apple Mac 以外的所有系统上,rEFInd 都会显示支持的分辨率列表。对于 Apple Mac,它将静默使用默认分辨率。

要确定 efifb 支持的帧缓冲分辨率,请将 /usr/lib/gnuefi/apps/modelist.efignu-efi 复制到 ESP 的根目录。进入 UEFI Shell 并运行 modelist.efi

Shell> FS0:\modelist.efi
GOP reports MaxMode 3
 0: 640x480 BGRR pitch 640
*1: 800x600 BGRR pitch 800
 2: 1024x768 BGRR pitch 1024

refind.conf 中设置一个。重新启动并运行 dmesg | grep efifb 以 root 身份检查设置是否已应用。

Btrfs 子卷支持

提示 确保安装了 btrfs_x64.efi 驱动程序。可以手动复制 /usr/share/refind/drivers_x64/btrfs_x64.efiesp/EFI/refind/drivers_x64/btrfs_x64.efi 来安装,或者使用 refind-install /dev/sdx --alldrivers 选项安装所有驱动程序。
警告 btrfs_x64.efi 不支持 raid1c3/4

自动检测

要允许在 Btrfs 子卷上自动检测内核,请在 refind.conf 中取消注释并编辑 also_scan_dirs

esp/EFI/refind/refind.conf
...
also_scan_dirs +,subvolume/boot
...

接下来,在 refind_linux.conf 中将 subvol=subvolume 添加到 rootflags,然后将 subvolume 添加到 initramfs 路径的前面。

/boot/refind_linux.conf
"Boot using standard options"  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw rootflags=subvol=subvolume initrd=subvolume\boot\initramfs-%v.img"

手动启动条目

如果将 btrfs 子卷作为根目录启动,请将子卷的路径添加到加载器和 initramfs 路径的前面,并使用 rootflags=subvol=root_subvolume 修改 options 行。在下面的示例中,根目录已挂载为一个名为“ROOT”的 btrfs 子卷(例如,mount -o subvol=ROOT /dev/sdxY /mnt)。

esp/EFI/refind/refind.conf
...
menuentry "Arch Linux" {
        icon     /EFI/refind/icons/os_arch.png
        volume   "[bootdevice]"
        loader   /ROOT/boot/vmlinuz-linux
        initrd   /ROOT/boot/initramfs-linux.img
        options  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw rootflags=subvol=ROOT"
...
}

否则,未能这样做将导致以下错误消息:ERROR: Root device mounted successfully, but /sbin/init does not exist.

LoaderDevicePartUUID

从 0.13.1 版本开始,rEFInd 支持设置 UEFI 变量 LoaderDevicePartUUID。启用此功能允许 systemd-gpt-auto-generator(8) 自动挂载 EFI 系统分区,而无需在 /etc/fstab 中指定它。请参阅 systemd#GPT partition automounting

为了让 rEFInd 设置 LoaderDevicePartUUID,请编辑 refind.conf 并取消注释 write_systemd_vars true

esp/EFI/refind/refind.conf
...
write_systemd_vars true
...

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

ISO 镜像

rEFInd 不支持启动 ISO 文件,因为它缺少一个回环驱动程序,但它可以启动直接写入分区的 ISO 镜像。这需要 iso9660 驱动程序,可以在 /usr/share/refind/drivers_x64/iso9660_x64.efi 中找到。

故障排除

Apple Mac

从 macOS 中使用 bless 将 rEFInd 设置为默认启动项。

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

rEFInd 菜单屏幕空白

如果您的 drivers_x64 文件夹包含多个文件系统驱动程序(请参阅 #Installing the rEFInd Boot Manager 获取说明),这可能导致 rEFInd 因文件系统驱动程序错误而运行不正常,只显示一个空白屏幕和 rEFInd 徽标(对于自定义主题,这将是设置的背景图像)。要解决此问题,只需删除所有驱动程序,但保留内核所在的那个文件系统的驱动程序

另一个潜在的空白屏幕原因发生在与 Windows 双重启动时,rEFInd 无法自动扫描其他磁盘上的 EFI 系统分区。要解决此问题,请使用 blkid 识别 Windows 分区,并将每个 Windows 分区的 PARTUUID 作为逗号分隔的条目添加到 refind.conf 中的 dont_scan_volumes 变量。例如:

# blkid
/dev/nvme0n1p1: LABEL="SYSTEM" UUID="4CE7-C215" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="13aa9955-1234-5678-9098-006c334b5088"
/dev/nvme0n1p5: LABEL="Windows RE Tools" BLOCK_SIZE="512" UUID="08C4E6C5C4E6B45A" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="4eced110-0987-6543-2123-b0ab8576869b"
esp/EFI/refind/refind.conf
...
dont_scan_volumes 13aa9955-1234-5678-9098-006c334b5088,4eced110-0987-6543-2123-b0ab8576869b
...

如果您看到 Tux 而不是 Arch 徽标,那么您可能受到此问题的影响(您的根分区类型是 Linux x86-64 root (/) 而不是 Linux filesystem)。

您可以使用 fdisk#Change partition type 来修复此问题。

此外,如果您的根分区的标签只是“Linux”或者包含“linux”这个词,可能会显示 Tux。要指定您的发行版的名称,请考虑将分区标签重命名为反映您的发行版名称。

您可以使用 文件系统标签来修复此问题。

另一种获取 Arch 徽标而不是 Tux 的方法是,将 Arch 徽标图像文件复制到您的内核旁边(例如 vmlinuz-linux),并将图像文件名与您的内核名称相同。

# cp /usr/share/refind/icons/os_arch.png /boot/vmlinuz-linux.png

错误:加载 vmlinuz-linux 时未找到

如果您添加了一个 menuentry 并正确设置了卷令牌,但仍然收到“Error: Not Found while loading vmlinuz-linux”消息,您可能需要检查内核所在文件系统的驱动程序是否已正确安装。请记住,不受支持的文件系统将不会被检测到,即使它们在配置文件中。

参见