统一可扩展固件接口

出自 ArchWiki
(重定向自 EFI

统一可扩展固件接口 (UEFI) 是操作系统和固件之间的接口。它为启动操作系统和运行预启动应用程序提供了标准环境。

它与传统 BIOS 系统使用的 MBR 引导代码 方法不同。请参阅 Arch 启动过程 了解它们之间的差异以及使用 UEFI 的启动过程。要设置 UEFI 启动加载器,请参阅 Arch 启动过程#启动加载器

注意
  • 早期的供应商 UEFI 实现可能比其 BIOS 对应物携带更多错误。如果遇到无法解决的问题,请考虑为此类系统使用传统 BIOS 启动。
  • Apple UEFI 实现不符合标准。除非明确声明,否则这些说明是通用的,其中一些可能不适用于 Mac 或有所不同。

UEFI 固件位宽

在 UEFI 下,每个程序,无论是操作系统加载器还是实用程序(例如,内存测试或恢复工具),都应该是与 UEFI 固件位宽/架构相对应的 EFI 应用程序。

绝大多数 x86_64 系统,包括最新的 Apple Mac,都使用 x64 (64 位) UEFI 固件。唯一已知的使用 IA32 (32 位) UEFI 的设备是较旧的 (2008 年前) Apple Mac、Intel Atom 片上系统 (截至 2013 年 11 月 2 日)[1] 以及一些已知在 Intel EFI 1.10 固件上运行的较旧的 Intel 服务器主板。

x64 UEFI 固件不包含启动 32 位 EFI 应用程序的支持(与包含此类支持的 x86_64 Linux 和 Windows 版本不同)。因此,EFI 应用程序必须针对该特定固件处理器位宽/架构进行编译。

注意: 具有 IA32 UEFI 的系统需要使用支持混合模式启动的 启动加载器

检查固件位宽

可以从已启动的操作系统检查固件位宽。

从 Linux

在运行 Linux 内核 4.0 或更高版本的发行版上,可以通过 sysfs 接口找到 UEFI 固件位宽。运行

$ cat /sys/firmware/efi/fw_platform_size

对于 64 位 (x64) UEFI,它将返回 64,对于 32 位 (IA32) UEFI,它将返回 32。如果该文件不存在,则说明您尚未在 UEFI 模式下启动

从 macOS

2008 年之前的 Mac 大多具有 IA32 EFI 固件,而 2008 年及之后的 Mac 大多具有 x64 EFI。所有能够运行 Mac OS X Snow Leopard 64 位内核的 Mac 都具有 x64 EFI 1.x 固件。

要找出 Mac 中 EFI 固件的架构,请在 Mac OS X 终端中键入以下命令

$ ioreg -l -p IODeviceTree | grep firmware-abi

如果命令返回 EFI32,则它是 IA32 (32 位) EFI 固件。如果返回 EFI64,则它是 x64 EFI 固件。大多数 Mac 没有 UEFI 2.x 固件,因为 Apple 的 EFI 实现不完全符合 UEFI 2.x 规范。

从 Microsoft Windows

64 位版本的 Windows 不支持在 32 位 UEFI 上启动。因此,如果您的 32 位版本的 Windows 在 UEFI 模式下启动,则您拥有 32 位 UEFI。

要检查位宽,请运行 msinfo32.exe。在“系统摘要”部分中,查看“系统类型”和“BIOS 模式”的值。

对于 64 位 Windows 在 64 位 UEFI 上,它将是 系统类型: x64-based PCBIOS 模式: UEFI,对于 32 位 Windows 在 32 位 UEFI 上 - 系统类型: x86-based PCBIOS 模式: UEFI。如果“BIOS 模式”不是 UEFI,则 Windows 未在 UEFI 模式下启动。

UEFI 变量

UEFI 定义了变量,操作系统可以通过这些变量与固件交互。UEFI 启动变量由启动加载器使用,并且仅在早期系统启动时由操作系统使用。UEFI 运行时变量允许操作系统管理固件的某些设置,例如 UEFI 启动管理器或管理 UEFI 安全启动协议等的密钥。您可以使用以下命令获取列表

$ efivar --list

Linux 内核中的 UEFI 变量支持

Linux 内核通过 efivarfs (EFI VARiable FileSystem) 接口 (CONFIG_EFIVAR_FS) 向用户空间公开 UEFI 变量数据 - 使用 efivarfs 内核模块挂载在 /sys/firmware/efi/efivars - 它没有每个变量的最大大小限制,并且支持 UEFI 安全启动变量。在内核 3.8 中引入。

UEFI 变量支持的要求

  1. 内核应通过 EFI 启动存根(可选地使用 启动管理器)或 UEFI 启动加载器 在 UEFI 模式下启动,而不是通过 BIOS 或 CSM,或者 Apple 的 Boot Camp(也是 CSM)。
  2. 内核中应存在 EFI 运行时服务支持 (CONFIG_EFI=y,使用 zgrep CONFIG_EFI /proc/config.gz 检查是否存在)。
  3. 内核中的 EFI 运行时服务 不应 通过 内核命令行 禁用,即 不应 使用 noefi 内核参数。
  4. efivarfs 文件系统应挂载在 /sys/firmware/efi/efivars,否则请按照下面的 #挂载 efivarfs 部分操作。
  5. efivar 应列出 (选项 -l/--list) UEFI 变量而没有任何错误。

如果在满足上述条件后 UEFI 变量支持仍然不起作用,请尝试以下解决方法

  1. 如果 UEFI 变量列表 (efivar -l) 导致 efivar: error listing variables: Function not implemented 并且系统启动到 实时内核 中,请将 efi=runtime 添加到 内核参数 并重新启动(在这些内核上默认禁用 efivarfs 功能)。
  2. 有关更多故障排除步骤,请参阅 #用户空间工具无法修改 UEFI 变量数据

挂载 efivarfs

如果 systemd 在启动期间未自动将 efivarfs 挂载到 /sys/firmware/efi/efivars,则您需要手动挂载它以向 用户空间工具(如 efibootmgr)公开 UEFI 变量

# mount -t efivarfs efivarfs /sys/firmware/efi/efivars
注意: 如果有 chroot,则上述命令应在外部(即在之前)内部(即之后)都运行。

有关内核文档,请参阅 efivarfs.html

用户空间工具

有一些工具可以访问/修改 UEFI 变量,即

  • efivar — 用于操作 UEFI 变量的库和工具(由 efibootmgr 使用)
https://github.com/rhboot/efivar || efivar
  • efibootmgr — 用于操作 UEFI 固件启动管理器设置的工具
https://github.com/rhboot/efibootmgr || efibootmgr
  • uefivars — 转储 UEFI 变量列表以及一些额外的 PCI 相关信息(内部使用 efibootmgr 代码)
https://github.com/fpmurphy/Various/tree/master/uefivars-2.0 || uefivars-gitAUR
  • efitools — 用于操作 UEFI 安全启动平台的工具
https://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git || efitools
  • Ubuntu 的固件测试套件 — 对 Intel/AMD PC 固件执行健全性检查的测试套件
https://wiki.ubuntu.com/FirmwareTestSuite/ || fwts-gitAUR

efibootmgr

您将必须 安装 efibootmgr 软件包。

注意
  • 如果 efibootmgr 在您的系统上不起作用,您可以重新启动到 #UEFI Shell 并使用 bcfg 为引导加载程序创建启动项。
  • 如果您无法使用 efibootmgr,某些 UEFI 固件允许用户直接从其启动时界面管理 UEFI 启动项。例如,某些固件具有“添加新的启动选项”选项,使您可以选择本地 EFI 系统分区并手动输入 EFI 应用程序位置,例如 \EFI\refind\refind_x64.efi
  • 以下命令使用 rEFInd 启动管理器作为示例。

要使用 efibootmgr 添加新的启动选项,您需要了解三件事

  1. 包含 EFI 系统分区 (ESP) 的磁盘。例如:/dev/sda/dev/nvme0n1
  2. 该磁盘上 ESP 的分区号。/dev/sdaY/dev/nvme0n1pY 中的 Y
  3. EFI 应用程序的路径(相对于 ESP 的根目录)

例如,如果您要为 /efi/EFI/refind/refind_x64.efi 添加启动选项,其中 /efi 是 ESP 的挂载点,请运行

$ findmnt /efi
TARGET SOURCE    FSTYPE OPTIONS
/efi   /dev/sda1 vfat   rw,flush,tz=UTC

在此示例中,findmnt(8) 指示 ESP 在磁盘 /dev/sda 上,分区号为 1。EFI 应用程序的路径(相对于 ESP 的根目录)是 /EFI/refind/refind_x64.efi。因此,您将按如下方式创建启动项

# efibootmgr --create --disk /dev/sda --part 1 --loader '\EFI\refind\refind_x64.efi' --label 'rEFInd Boot Manager' --unicode

获取所有启动项的概述

# efibootmgr --unicode

设置启动顺序

# efibootmgr --bootorder XXXX,XXXX --unicode

其中 XXXX 是先前 efibootmgr 命令输出中出现的数字。

删除不需要的条目

# efibootmgr --delete-bootnum --bootnum XXXX --unicode

有关更多信息,请参阅 efibootmgr(8)efibootmgr README

注意: UEFI 规范使用反斜杠 \ 作为路径分隔符,但 efibootmgr 可以自动转换 UNIX 样式的 / 路径分隔符。

禁用 UEFI 变量访问

访问 UEFI 可能会造成超出正在运行的操作系统级别的损害。存在危险的 UEFI 漏洞,例如 LogoFAIL,它允许恶意行为者完全控制机器。在某些 UEFI 实现不良的情况下,甚至可能发生硬件级变砖 [2]

因此,由于日常系统使用不需要 UEFI 变量访问,您可能需要禁用它,以避免潜在的安全漏洞或意外损害。

可能的解决方案是

  • 使用 fstab 以只读模式挂载 efivars。例如
    efivarfs /sys/firmware/efi/efivars efivarfs ro,nosuid,nodev,noexec 0 0
  • 使用 noefi 内核参数 完全禁用操作系统对 UEFI 的访问。
注意: UEFI 用户空间工具 无法在此类设置中使用,因此请在之前执行所有必要的配置。UEFI 相关命令(例如 systemctl reboot --firmware-setup)也将无法工作。

UEFI Shell

UEFI Shell 是固件的 shell/终端,允许启动 EFI 应用程序,其中包括 UEFI 启动加载程序。除此之外,shell 还可以用于获取有关系统或固件的各种其他信息,例如内存映射 (memmap)、修改启动管理器变量 (bcfg)、运行分区程序 (diskpart)、加载 UEFI 驱动程序、编辑文本文件 (edit)、hexedit 等。

获取 UEFI Shell

您可以从 TianoCore EDK2 项目获取 BSD 许可的 UEFI Shell

Shell v2 在 UEFI 2.3+ 系统中效果最佳,并且在这些系统中建议使用 Shell v2 而不是 Shell v1。Shell v1 应在所有 UEFI 系统中工作,而与固件遵循的规范版本无关。更多信息请访问 ShellPkg 和 EDK2 邮件列表线程 — 在 Linux 发行版 ISO 中包含 UEFI shell

启动 UEFI Shell

一些华硕和其他基于 AMI Aptio x64 UEFI 固件的主板(从 Sandy Bridge 开始)提供了一个名为从文件系统设备启动 EFI Shell 的选项。对于这些主板,将 x64 UEFI Shell 复制到 EFI 系统分区的根目录,命名为 shellx64.efi

提示
  • Arch Linux 安装介质在卷的根目录中具有 shellx64.efi
  • 如果 shellx64.efi 位于 EFI 系统分区的根目录中,rEFIndsystemd-boot 将自动为 UEFI shell 添加一个启动菜单项。

已知具有 Phoenix SecureCore Tiano UEFI 固件的系统具有嵌入式 UEFI Shell,可以使用 F6F11F12 键启动。

注意: 如果您无法使用上述任何方法直接从固件启动 UEFI Shell,请创建一个 FAT32 USB 闪存盘,并将 EFI 二进制文件复制为 /USB_drive_mointpoint/EFI/BOOT/BOOTx64.EFI。此 USB 应出现在固件启动菜单中。启动此选项将为您启动 UEFI Shell。

重要的 UEFI Shell 命令

UEFI Shell 命令通常支持 -b 选项,该选项使输出在每页之后暂停。运行 help -b 以列出可用的内部命令。可用命令要么内置于 shell 中,要么是离散的 EFI 应用程序。

有关更多信息,请参阅 Intel 脚本指南 2008[死链 2023-07-30 ⓘ]Intel “课程” 2011[死链 2023-07-30 ⓘ]

bcfg

bcfg 修改 UEFI NVRAM 条目,使用户可以更改启动项或驱动程序选项。在 UEFI Shell 规范 2.2 文档的第 96 页(第 5.3 节)中详细描述了此命令。

注意
  • 仅当 efibootmgr 无法在您的系统上创建工作启动项时才尝试 bcfg
  • UEFI Shell v1 官方二进制文件不支持 bcfg 命令。有关可能在 UEFI pre-2.3 固件中工作的修改后的 UEFI Shell v2 二进制文件,请参阅 #获取 UEFI Shell

转储当前启动项列表

Shell> bcfg boot dump -v

将 rEFInd(例如)添加为启动菜单中的第 4 个(编号从零开始)选项的启动菜单项

Shell> bcfg boot add 3 FS0:\EFI\refind\refind_x64.efi "rEFInd Boot Manager"

其中 FS0: 是对应于 EFI 系统分区的映射,FS0:\EFI\refind\refind_x64.efi 是要启动的文件。

要添加直接启动到您的系统而无需启动加载程序的条目,请参阅 EFI 启动存根#bcfg

删除第 4 个启动选项

Shell> bcfg boot rm 3

将启动选项 #3 移动到 #0(即 UEFI 启动菜单中的第 1 个或默认条目)

Shell> bcfg boot mv 3 0

有关 bcfg 帮助文本

Shell> help bcfg -v -b

Shell> bcfg -? -v -b

map

map 显示设备映射列表,即可用文件系统 (FS0) 和存储设备 (blk0) 的名称。

在运行文件系统命令(如 cdls)之前,您需要通过键入其名称将 shell 更改为相应的文件系统

Shell> FS0:
FS0:\> cd EFI/

edit

edit 提供了一个基本的文本编辑器,其界面类似于 nano,但功能稍逊。它处理 UTF-8 编码并处理 LF 与 CRLF 行尾。

例如,要编辑 EFI 系统分区 (固件中的 FS0:) 中的 rEFInd 的 refind.conf

Shell> edit FS0:\EFI\refind\refind.conf

Ctrl+e 获取帮助。

UEFI 驱动

本文或章节需要扩充。

原因: 解释什么是 UEFI 驱动程序以及如何使用它们。使用 efibootmgr 的 -r/--driver 选项添加自动 UEFI 驱动程序加载设置。(在 Talk:Unified Extensible Firmware Interface 中讨论)

UEFI 驱动程序是支持某些功能的软件片段。例如,通常无法从 UEFI shell 访问 NTFS 格式化的分区。efifs 软件包具有驱动程序,支持从 UEFI shell 中读取更多文件系统。一个用法示例是将此类驱动程序复制到可以从 UEFI shell 访问的分区。然后,从 UEFI shell 中,发出如下命令

Shell> load ntfs_x64.efi
Shell> map -r

执行 map 命令后,用户应该能够从 UEFI shell 访问 NTFS 格式化的分区。

提示
  • systemd-bootesp/EFI/systemd/drivers/ 自动加载 UEFI 驱动程序。
  • rEFInd 从 ESP 上其自身安装目录的 driversdrivers_x64 子目录自动加载 UEFI 驱动程序。例如 esp/EFI/refind/drivers_x64/。可以配置它以扫描其他目录。

UEFI 启动介质

从光盘介质移除 UEFI 启动支持

注意
  • 本节提到仅从 CD/DVD(通过 EL Torito 的光盘介质启动)移除 UEFI 启动支持,而不是从 USB 闪存驱动器移除。
  • 为了隐藏 USB 闪存盘上的 UEFI 设备,请在将 ISO 复制到闪存驱动器后使用分区编辑器。删除类型为 EF 的分区。不要 接受转换为 GPT 的提议。

大多数 32 位 EFI Mac 和一些 64 位 EFI Mac 拒绝从 UEFI(X64)+BIOS 可启动 CD/DVD 启动。如果希望使用光盘介质继续安装,则可能需要首先删除 UEFI 支持。

提取 ISO,跳过 UEFI 特定的目录

$ mkdir extracted_iso
$ bsdtar -x --exclude=EFI/ --exclude=loader/ -f archlinux-version-x86_64.iso -C extracted_iso

然后使用 xorriso(1)libisoburn 重新构建 ISO,排除 UEFI 光盘介质启动支持。请务必设置正确的卷标,例如 ARCH_202103;可以使用 file(1) 在原始 ISO 上获取它。

$ xorriso -as mkisofs \
    -iso-level 3 \
    -full-iso9660-filenames \
    -joliet \
    -joliet-long \
    -rational-rock \
    -volid "ARCH_YYYYMM" \
    -appid "Arch Linux Live/Rescue CD" \
    -publisher "Arch Linux <https://archlinux.org.cn>" \
    -preparer "prepared by $USER" \
    -eltorito-boot syslinux/isolinux.bin \
    -eltorito-catalog syslinux/boot.cat \
    -no-emul-boot -boot-load-size 4 -boot-info-table \
    -isohybrid-mbr "extracted_iso/syslinux/isohdpfx.bin" \
    -output archlinux-version-x86_64-noUEFI.iso extracted_iso/

archlinux-version-x86_64-noUEFI.iso 刻录到光盘介质并正常继续安装。

在没有原生支持的系统上测试 UEFI

用于虚拟机的 OVMF

OVMF 是 TianoCore 项目,旨在为虚拟机启用 UEFI 支持。OVMF 包含一个示例 UEFI 固件和一个单独的非易失性变量存储,用于 QEMU

您可以从 extra 仓库安装 edk2-ovmf

建议为您的虚拟机制作非易失性变量存储的本地副本 建议

$ cp /usr/share/edk2/x64/OVMF_VARS.4m.fd my_OVMF_VARS.4m.fd

要使用 OVMF 固件和此变量存储,请将以下内容添加到您的 QEMU 命令

-drive if=pflash,format=raw,readonly,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \
-drive if=pflash,format=raw,file=my_OVMF_VARS.4m.fd

例如

$ qemu-system-x86_64 -enable-kvm -m 1G -drive if=pflash,format=raw,readonly,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd -drive if=pflash,format=raw,file=my_OVMF_VARS.4m.fd …

用于仅 BIOS 系统的 DUET

DUET 是一个 TianoCore 项目,它允许从 BIOS 系统链式加载完整的 UEFI 环境,方式类似于 BIOS 操作系统启动。这种方法正在被广泛 讨论。可以从 repos[死链 2023-04-07 ⓘ] 之一下载预构建的 DUET 镜像。阅读特定的 说明[死链 2023-04-07 ⓘ] 以设置 DUET。但是,截至 2018 年 11 月,DUET 代码已从 TianoCore git 仓库中删除。

您也可以尝试 Clover,它提供了修改后的 DUET 镜像,其中可能包含一些特定于系统的修复程序,并且与 gitlab repos 相比,更新频率更高。

故障排除

当卡在 Windows 时启动回 Arch Linux

当您卡在 Windows 中时要启动回 Arch Linux,请通过 Windows PowerShell 命令 shutdown /r /o 或通过设置 > 更新和安全 > 恢复 > 高级启动 并选择立即重新启动,到达 Windows 中的高级启动。当您到达高级启动菜单时,选择使用设备,它实际上包含您的 UEFI 启动选项(不限于 USB 或 CD,也可以启动硬盘驱动器中的操作系统),然后选择“Arch Linux”。

在没有功能键的情况下进入固件设置

在某些笔记本电脑上,例如 Lenovo XiaoXin 15are 2020,使用 F2F12 等键没有任何作用。这可以通过将笔记本电脑退回 OEM 以修复主板信息来解决,但有时这是不可能或不希望的。但是,还有其他方法可以进入固件设置

  • 使用 systemctl
    $ systemctl reboot --firmware-setup
    这将重启您的计算机并进入固件设置。
  • 使用 GRUB:按 c 键进入命令行,然后在 GRUB 命令行中使用 fwsetup 命令进入固件设置。
  • 在 Windows 中:进入高级启动,请参阅 #当卡在 Windows 时启动回 Arch Linux

用户空间工具无法修改 UEFI 变量数据

如果任何用户空间工具无法修改 UEFI 变量数据,请检查是否存在 /sys/firmware/efi/efivars/dump-* 文件。如果存在,请删除它们,重启并重试。如果上述步骤无法解决问题,请尝试使用 efi_no_storage_paranoia 内核参数启动,以禁用内核 UEFI 变量存储空间检查,该检查可能会阻止写入/修改 UEFI 变量。

警告: efi_no_storage_paranoia 仅应在需要时使用,不应作为常规启动选项保留。此内核命令行参数的效果是关闭一个安全措施,该措施旨在帮助避免在 NVRAM 过满时导致机器变砖。请参阅 FS#34641 以获取更多信息。

无法使用 efibootmgr 创建新的启动项

某些内核和 efibootmgr 版本组合可能拒绝创建新的启动项。这可能是由于 NVRAM 中缺少可用空间。您可以尝试 #用户空间工具无法修改 UEFI 变量数据 中的解决方案。

您也可以尝试降级您的 efibootmgr 安装到 0.11.0 版本。此版本适用于 Linux 4.0.6 版本。请参阅错误讨论 FS#34641,特别是 结束评论,以获取更多信息。

Windows 更改启动顺序

如果您与 Windows 双启动,并且您的主板直接启动 Windows 而不是您选择的 EFI 应用程序,则可能有几种可能的原因和解决方法。

  • 确保在 Windows 电源选项中禁用 快速启动
  • 确保在您的固件中禁用 安全启动(如果您未使用已签名的启动加载程序)
  • 确保您的 UEFI 启动顺序没有将 Windows 启动管理器设置为第一位,例如使用 efibootmgr 以及您在 UEFI 配置工具中看到的内容。某些主板默认会覆盖 Windows 使用 efibootmgr 设置的任何设置,如果它检测到 Windows。这在 Packard Bell 笔记本电脑中得到证实。
  • 如果您的主板正在启动默认启动路径 (\EFI\BOOT\BOOTx64.EFI),则此文件可能已被 Windows 启动加载程序覆盖。尝试设置正确的启动路径,例如使用 efibootmgr
  • 如果之前的步骤不起作用,您可以告诉 Windows 启动加载程序运行不同的 EFI 应用程序。从 Windows 管理员命令提示符运行 bcdedit /set "{bootmgr}" path "\EFI\path\to\app.efi"
  • 或者,通过以 root 身份运行 efibootmgr -A -b bootnumber 来停用 Windows 启动管理器。将 bootnumber 替换为实际的 Windows 启动管理器启动编号;您可以通过不带任何选项运行 efibootmgr 来查看它。
  • 或者,您可以在 Windows 中设置一个启动脚本,以确保每次启动 Windows 时都正确设置启动顺序。
    1. 以管理员权限打开命令提示符。运行 bcdedit /enum firmware 并找到您想要的启动项。
    2. 复制标识符,包括括号,例如 {31d0d5f4-22ad-11e5-b30b-806e6f6e6963}
    3. 创建一个批处理文件,其中包含命令 bcdedit /set "{fwbootmgr}" DEFAULT "{copied-boot-identifier}"
    4. 打开 gpedit.msc,然后在本地计算机策略 > 计算机配置 > Windows 设置 > 脚本(启动/关机)下,选择启动
    5. 脚本选项卡下,选择添加按钮,然后选择您的批处理文件
注意:Windows 10 家庭版官方不包含 gpedit.msc,尽管有一些不受支持的解决方法可以手动安装它。
  • 或者,可以使用任务计划程序在 Windows 中运行启动脚本
    1. 按照上面的步骤 1-3 创建批处理文件。
    2. 运行 taskschd.msc,然后从操作菜单中选择创建任务...
    3. 常规选项卡上
      输入任何合适的名称描述
      确保选择的用户帐户是“管理员”,而不是“标准用户”。
      选择“无论用户是否登录都运行”。
      选择“以最高权限运行”。
    4. 触发器选项卡上,从菜单中选择“启动时”,然后单击确定
    5. 操作选项卡上,单击新建...,然后单击浏览...,并找到步骤 1 中的批处理文件。
    6. 条件选项卡上,取消选中电源选项,以便脚本在电池供电时运行(对于笔记本电脑)。
    7. 单击确定,并在提示时输入步骤 4 中选择的用户帐户的密码。

USB 媒体卡在黑屏

此问题可能是由于 KMS 问题引起的。尝试在启动 USB 时禁用 KMS

UEFI 启动加载程序未在固件菜单中显示

某些固件不支持自定义启动项。相反,它们只会从硬编码的启动项启动。

一个典型的解决方法是不依赖 NVRAM 中的启动项,并将启动加载程序安装到 EFI 系统分区上的常用后备路径之一。

以下部分描述了后备路径。

可移动驱动器的默认启动路径

UEFI 规范定义了从可移动媒体启动的 EFI 二进制文件的默认文件路径。相关的路径是

  • esp/EFI/BOOT/BOOTx64.EFI 用于 x64 UEFI
  • esp/EFI/BOOT/BOOTIA32.EFI 用于 IA32 UEFI。

虽然规范仅为可移动驱动器定义了这些路径,但大多数固件都支持从任何驱动器启动这些路径。

请参阅相应的 启动加载程序 文章,了解如何将启动加载程序安装或迁移到默认/后备启动路径。

Microsoft Windows 启动加载程序位置

在某些 UEFI 主板上,例如某些带有 Intel Z77 芯片组的主板,使用 efibootmgr 或 UEFI Shell 中的 bcfg 添加条目将不起作用,因为它们在添加到 NVRAM 后不会显示在启动菜单列表中。

此问题的原因是主板只能加载 Microsoft Windows。要解决此问题,您必须将 .efi 文件放置在 Windows 使用的位置。

将 Arch Linux 安装介质 (FSO:) 中的 BOOTx64.EFI 文件复制到硬盘 (FS1:) 上的 ESP 分区的 Microsoft 目录中。通过启动到 EFI Shell 并键入以下内容来执行此操作

Shell> mkdir FS1:\EFI\Microsoft
Shell> mkdir FS1:\EFI\Microsoft\Boot
Shell> cp FS0:\EFI\BOOT\BOOTx64.EFI FS1:\EFI\Microsoft\Boot\bootmgfw.efi

重启后,添加到 NVRAM 的任何条目都应显示在启动菜单中。

UEFI/BIOS 卡在加载屏幕

这是 Acer 笔记本电脑上的一个常见问题,如果 .efi 文件未手动授权,则会发生此问题。请参阅 笔记本电脑/Acer#在安装 Linux 后固件设置变得不可访问

使用 efibootmgr 创建的启动项未在 UEFI 中显示

efibootmgr 可能无法检测到 EDD 3.0,因此在 NVRAM 中创建不可用的启动项。有关详细信息,请参阅 efibootmgr issue 86

为了解决这个问题,在手动创建启动项时,请将 -e 3 选项添加到 efibootmgr 命令。例如:

# efibootmgr --create --disk /dev/sda --part 1 --loader '\EFI\refind\refind_x64.efi' --label 'rEFInd Boot Manager' --unicode -e 3

要修复启动加载程序安装程序,如 grub-installrefind-install,请创建一个包装脚本 /usr/local/bin/efibootmgr 并使其可执行

/usr/local/bin/efibootmgr
#!/bin/sh

exec /usr/bin/efibootmgr -e 3 "$@"

UEFI 启动项在删除其引用的驱动器后消失

某些固件会删除引用启动时不存在的驱动器的启动项。当频繁分离/连接驱动器或从可移动驱动器启动时,这可能是一个问题。

解决方案是将启动加载程序安装到默认/后备启动路径

启动项被随机删除

某些主板可能会由于 NVRAM 中缺少可用空间而删除启动项,而不是在创建时给出错误。为了防止这种情况发生,请通过最小化您的条目创建过程来减少添加的启动项数量,并通过禁用 UEFI 设置中的兼容性支持模块 (CSM) 来减少自动驱动器启动项的数量。请参阅 BBS#1608838

启动项可能已被删除的另一个原因是 UEFI 规范允许 OEM 在启动过程中进行“NVRAM 维护”。这些制造商的做法很简单:他们只是在设备上预定义的硬编码路径中查找 EFI 应用程序。如果他们找不到任何应用程序,他们就会断定设备上没有操作系统,并擦除 NVRAM 中与其关联的所有启动项,因为他们认为 NVRAM 包含一些损坏或过时的数据。如果您不打算安装 Windows 并且仍然想直接从固件加载 Linux 内核,一种可能的解决方法是创建一个空文件 esp/EFI/BOOT/BOOTx64.EFI

# mkdir -p esp/EFI/BOOT 
# touch esp/EFI/BOOT/BOOTx64.EFI

并恢复已删除的启动项。现在重启后,主板将看到“假操作系统”,并且不应擦除 NVRAM 中的其他启动项。如果您愿意,您可以将假操作系统加载程序更改为实际的 EFI 应用程序,只要您保留标准的后备名称即可。

另请参阅