13.6 引导管理器与 UEFI 固件

UEFI 系统检测方法

efibootmgr 是 FreeBSD 系统中用于查看和管理 EFI 启动项的工具,通过与 UEFI 固件交互来操作启动项配置。

  • 如果是非 UEFI 将输出如下:

# efibootmgr # 基本系统默认内置,无需额外安装
efibootmgr: efi variables not supported on this system. root? kldload efirt?
  • 如果当前系统是 UEFI,efibootmgr 会输出类似于:

# efibootmgr
Boot to FW : false
BootCurrent: 0004
BootOrder  : 0004, 0000, 0001, 0002, 0003
+Boot0004* FreeBSD
Boot0000* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0001* EFI VMware Virtual IDE CDROM Drive (IDE 1:0)
Boot0002* EFI Network
Boot0003* EFI Internal Shell (Unsupported option)

UEFI 与 efibootmgr

  • 查看当前启动项:

技巧

详细说明可以使用 efibootmgr -v

设置 rEFInd 优先启动(这并不意味着它是默认启动项,仅是改变 BIOS/UEFI 中的启动顺序):

警告

不要使用 efibootmgr -o 0000 直接指定启动顺序,这样会删除其他启动项。

设置 EFI 启动顺序为 0000, 0001, 0002, 0003:

参考文献

UEFI 操作实例

在多硬盘系统中,有时需要将分散的 EFI 分区合并为单一分区管理,以简化启动配置。以下示例演示如何将两块硬盘上的 EFI 配置文件统一到一块硬盘的 EFI 分区中。

EFI 分区的目录结构如下:

此示例删除 nda0 上由 FreeBSD 安装生成的 EFI 分区,并将 FreeBSD 的引导文件迁移到 ada0 硬盘的 EFI 分区中。

首先关闭 Windows 的快速启动:命令为 powercfg /h off。(如果能进入 BIOS 设置界面就不用关)

随后关机并重启进入 FreeBSD 系统,创建挂载点:

检测 ada0p1(硬盘的第一个分区)是不是我们要挂载的 EFI 分区,输入命令:

我的输出是 NTFS,可见不是我们想要的 EFI 分区;

再看看第二块分区:

输出 msdosfs,表明这是 Windows 磁盘上的 EFI 分区

接下来挂载 ada0 磁盘上的 EFI 分区到 FreeBSD 的 /mnt/efi

为 FreeBSD 引导项在 EFI 路径下创建目录:

然后将 FreeBSD 启动文件复制到该路径:

创建名为“FreeBSD 15.0”的 EFI 启动项,指向 FreeBSD 的引导程序:

重启进入 Windows,使用 easyuefi 激活 FreeBSD 15.0 启动项即可。

若再次启动 FreeBSD 没有问题,方可使用 DiskGeniusarrow-up-right 或其他分区工具删除 nda0 磁盘的 EFI 分区及其文件。

Grub

目前测试显示,GRUB 无法直接引导 FreeBSD 内核启动系统,只能通过 GRUB 的 chainload 机制(例如使用 chainloader +1 配置)间接引导。

参考资料

目前配置的报错(grub2-efi FBSD 15.0):

加上参数 -vvv 可以查看详细错误信息,输出内容较长,可在 https://gist.github.com/ykla/9b6de6c8d4eee524840acb9981bf850aarrow-up-right 查看。

课后习题

  1. 使用 efibootmgr 添加、删除和修改 EFI 启动项,追踪这些操作如何影响 UEFI 固件中的变量。

  2. 尝试配置 GRUB 通过 chainload 方式引导 FreeBSD,如遇到文中提到的错误则分析错误信息。

  3. 将两块硬盘的 EFI 分区合并到单一分区管理,对比合并前后的启动流程差异。

最后更新于