统一可扩展固件接口

出自 ArchWiki
(重定向自UEFI shell

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

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

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

如果 efivarfs 没有在启动期间被 systemd 自动挂载到 /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
  • rEFIndsystemd-boot 如果 shellx64.efi 在 EFI 系统分区的根目录中,将自动为 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 软件包具有驱动程序,支持从 EFI 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 启动光盘/DVD 启动。如果希望使用光盘介质继续安装,则可能需要先移除 UEFI 支持。

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

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

然后使用来自 libisoburnxorriso(1) 重建 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 操作系统启动。这种方法正在被广泛讨论。预构建的 DUET 映像可以从 repos[死链 2023-04-07 ⓘ] 之一下载。阅读设置 DUET 的具体说明[死链 2023-04-07 ⓘ]。但是,截至 2018 年 11 月,DUET 代码已从 TianoCore git 仓库中移除。

您也可以尝试 Clover,它提供了修改后的 DUET 映像,可能包含一些特定于系统的修复程序,并且比 gitlab 仓库更频繁地更新。

故障排除

当卡在 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 Boot Manager 设置为第一启动项,例如使用 efibootmgr 以及您在 UEFI 的配置工具中看到的内容。如果某些主板检测到 Windows,则默认会覆盖 Windows 使用 efibootmgr 设置的任何设置。这已在 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 Boot Manager。将 bootnumber 替换为实际的 Windows Boot Manager 启动编号;您可以通过不带任何选项运行 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 文件未手动授权,则会发生此问题。请参阅 Laptop/Acer#Linux 安装后固件设置变得不可访问

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

efibootmgr 可能无法检测到 EDD 3.0,因此在 NVRAM 中创建不可用的启动项。有关详细信息,请参阅 efibootmgr 问题 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 应用程序更改伪造的操作系统加载程序,只要您保留标准的回退名称即可。

另请参阅