如何在 Linux 上管理 EFI 启动管理器条目
UEFI 是现代机器上取代传统 BIOS 的固件接口。 UEFI 固件的功能之一是能够将启动条目存储在持久且可编辑的 NVRAM 内存(非易失性 RAM)中。在 UEFI 模式下安装 Linux 发行版(或任何其他操作系统)时,通常会将相关的启动项写入 NVRAM,在某些情况下,我们可能需要执行手动操作,例如修改启动顺序、创建或删除启动项入口。
要在 Linux 上完成此类任务,我们可以使用 efibootmgr 实用程序。在本教程中,我们将了解如何在一些最常用的 Linux 发行版上安装它,以及如何使用它来管理 NVRAM 启动项。
在本教程中您将学习:
如何在一些最常用的 Linux 发行版上安装 efibootmgr
如何列出 EFI 启动管理器条目
如何更改条目顺序
如何删除启动项
如何创建启动项
如何设置 EFI 启动管理器超时间隔
使用的软件要求和约定
安装
efibootmgr
实用程序可以通过最常用的 Linux 发行版的包管理器轻松安装,因为它包含在其官方存储库中。让我们从 Fedora 开始吧。在 Red Hat 系列的这个发行版和其他发行版上,包管理器称为 dnf。要安装“efibootmgr”软件包,我们所要做的就是运行以下命令:
$ sudo dnf install efibootmgr
在 Debian 的最新版本以及基于它的许多发行版(例如 Ubuntu 或 Linux Mint)上,可以使用 apt 包装器安装该软件包:
$ sudo apt install efibootmgr
在 Archlinux 上,该软件包包含在“core”存储库中,可以使用 pacman 软件包管理器进行安装:
$ sudo pacman -Sy efibootmgr
一旦该实用程序安装在我们的系统上,我们就可以使用它来管理启动管理器条目。让我们看看如何。
列出 EFI 启动管理器条目
在使用 UEFI 固件的系统上,EFI 启动管理器条目存储在非易失性 RAM 中。要使用 efibootmgr 列出现有的启动条目,我们所要做的就是调用该实用程序,无需任何选项或参数。以下是我的系统上该命令的输出:
$ efibootmgr
BootCurrent: 0000
Timeout: 2 seconds
BootOrder: 0000,0010,0011,0012,0013,0017,0018,0019,001A,001B,001C,001D,001E
Boot0000* Fedora
Boot0010 Setup
Boot0011 Boot Menu
Boot0012 Diagnostic Splash Screen
Boot0013 Lenovo Diagnostics
Boot0014 Startup Interrupt Menu
Boot0015 Rescue and Recovery
Boot0016 MEBx Hot Key
Boot0017* USB CD
Boot0018* USB FDD
Boot0019* NVMe0
Boot001A* ATA HDD0
Boot001B* USB HDD
Boot001C* PCI LAN
Boot001D Other CD
Boot001E Other HDD
Boot001F* IDER BOOT CDROM
Boot0020* IDER BOOT Floppy
Boot0021* ATA HDD
Boot0022* ATAPI CD
Boot0023* PCI LAN
在上面的输出中,我们可以注意到一系列信息,对应于启动变量。首先,我们可以看到 BootCurrent
:该键的值报告了列表中的哪个条目用于启动当前操作系统(在本例中,您可以看到我如何使用 Fedora)。
我们在输出中找到的第二个条目是“Timeout”:这表示在启动菜单上自动选择某个条目之前经过的时间,在本例中为 2 秒。接下来,我们有 BootOrder
:此键的值是以逗号分隔的条目号列表,并显示相关条目的顺序显示在 EFI 启动菜单中。
在我们上面提到的条目之后,该命令会报告可用启动条目的列表。 每个条目都会报告其编号和名称。在列表中,我们可以清楚地看到活动条目,因为它们标有“*”符号。
更改 EFI 启动管理器条目顺序
我们可以使用 efibootmgr 实用程序来更改当前的引导顺序。如果这是我们想要执行的任务,我们所要做的就是使用管理权限运行 efibootmgr,并使用 -o
选项(这是 --bootorder
的简短版本)) 并传递根据我们的意愿排序的启动项列表。在前面的示例中,我们看到我的计算机上的当前启动顺序如下:
0000,0010,0011,0012,0013,0017,0018,0019,001A,001B,001C,001D,001E
根据程序报告的列表,这意味着菜单上出现的第一个条目是“Fedora”,第二个条目是与“Setup”相关的条目。假设我们想要交换这些条目,使“Setup”成为第一个条目。我们所要做的就是运行以下命令:
$ sudo efibootmgr -o 0010,0000,0011,0012,0013,0017,0018,0019,001A,001B,001C,001D,001E
我们所做的只是报告条目列表,作为 -o
选项的参数,只是前两个条目按相反的顺序排列。该命令将通过打印我们在上一个示例中看到的相同输出来响应。在其中,我们可以清楚地看到启动顺序现在是如何使用命令设置的(“Setup”条目不是第一个):
BootCurrent: 0000
Timeout: 2 seconds
BootOrder: 0010,0000,0011,0012,0013,0017,0018,0019,001A,001B,001C,001D,001E
Boot0000* Fedora
Boot0010 Setup
Boot0011 Boot Menu
Boot0012 Diagnostic Splash Screen
Boot0013 Lenovo Diagnostics
Boot0014 Startup Interrupt Menu
Boot0015 Rescue and Recovery
Boot0016 MEBx Hot Key
Boot0017* USB CD
Boot0018* USB FDD
Boot0019* NVMe0
Boot001A* ATA HDD0
Boot001B* USB HDD
Boot001C* PCI LAN
Boot001D Other CD
Boot001E Other HDD
Boot001F* IDER BOOT CDROM
Boot0020* IDER BOOT Floppy
Boot0021* ATA HDD
Boot0022* ATAPI CD
Boot0023* PCI LAN
删除启动项
我们可以使用 efibootmgr 来删除现有的启动项。我们可能想要执行此类操作的典型情况是删除不再存在的操作系统的条目。要使用 efibootmgr 删除启动项,我们所要做的就是使用 -b
选项(--bootnum
的缩写)来选择我们要删除的启动项通过传递其索引作为参数,然后使用 -B
(--delete-bootnum
的缩写)来实际删除它。
例如,要删除索引 0000
(在我们的例子中与 Fedora 相关),我们将运行:
$ sudo efibootmgr --delete-bootnum --bootnum 0
请注意,在传递引导条目号时,我们不要求包含填充 0。删除引导项是一项应小心执行的操作:始终确保删除适当的项!
创建启动项
efibootmgr 实用程序可用于在 EFI 启动管理器菜单中创建新条目。要创建启动项,我们必须知道 EFI 系统分区的位置以及要启动的 EFI 映像的路径。
创建新条目必须使用的选项是-c
(--create
的缩写)。假设我们错误地从启动菜单中删除了“fedora”条目,并且我们想要重新创建它。假设EFI分区是/dev/sda
磁盘的第一个分区,并且要启动的映像的路径(相对于EFI分区)为EFI/fedora/shimx64.efi
,我们将运行以下命令:
$ sudo efibootmgr --create --disk=/dev/sda --part=1 --label="fedora" --loader='EFI\fedora\shimx64.efi'
在上面的示例中,我们使用 -c 选项调用 efibootmgr,以声明我们要创建一个新条目。我们使用 --disk
(-d
) 来指定 EFI 系统分区所在的磁盘,使用 --part
(--part
>-p) 指定该磁盘上的哪个分区是 EFI 分区(按照标准,EFI 分区应始终是第一个分区,格式为 FAT32)。
我们还使用 --label
选项 (-L
) 提供菜单中条目使用的名称,最后使用 --loader
(-l
) 传递要启动的映像的路径。需要注意的一件重要事情是,在传递 EFI 映像的路径时,必须使用反斜杠作为目录分隔符。对于要转义的反斜杠,路径应该用单引号提供(推荐),或者每个反斜杠应该用另一个反斜杠转义(路径将变为:EFI\\fedora\ \shimx64.efi
)。
创建的启动项将自动放置在启动顺序列表的顶部。
更改 EFI 启动管理器超时
正如我们之前看到的,我们可以设置超时间隔,之后会自动选择 EFI 启动管理器中的默认条目。在 efibootmgr 命令的输出中报告,我们看到在本例中超时值设置为 2 秒。假设我们想增加它,并将其设置为 4 秒。这是我们要运行的命令:
$ sudo efibootmgr --timeout=4
正如您在示例中看到的,我们使用了 --timeout
选项 (-t
) 并提供了以秒为单位的超时值。
结论
支持 UEFI 固件的机器将启动条目存储在称为 NVRAM 的非易失性 RAM 中。当我们安装 Linux 发行版时,它的一个条目会自动添加到 EFI 启动管理器菜单中,可以使用 efibootmgr 实用程序进一步自定义该菜单。在本教程中,我们了解了如何在一些最常用的 Linux 发行版中安装后者,以及如何使用它来更改启动顺序、删除和创建新的菜单项以及更改超时值。