服务器修改bios中uefi,浅谈UEFI~BIOS,申精。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

UEFI 启动管理器

UEFI 规范定义了名为 UEFI 启动管理器的一项功能(Linux发行版包含名为efibootmgr 的工具,可用于更改 UEFI 启动管理器的配置)。如果你确实阅读过 UEFI 规范,那么就会发现,UEFI 规范对 UEFI 启动管理器作出了如下规定:

“UEFI 启动管理器是一种固件策略引擎,可通过修改固件架构中定义的全局NVRAM 变量来进行配置。启动管理器将尝试按全局 NVRAM 变量定义的顺序依次加载 UEFI 驱动和 UEFI 应用程序(包括 UEFI 操作系统启动装载程序)。”

好, 既然已经明确了这一概念,那我们就继续吧。不,先等等。我来先把那一项规定解释清楚,便于理解。简单来说,你可以把 UEFI 启动管理器视为启动菜单。在 BIOS 固件上,固件层的“启动菜单”(当然)是,启动时连接到计算机的各个磁盘——不多不少。但是对于 UEFI 固件而言,情况有所不同。

UEFI 启动管理器可以进行配置——简言之,你可以向“启动菜单”添加项或者从中删除项。固件也可以(事实上, UEFI 规范也有此要求)根据连接到计算机的磁盘或根据某些固件配置,在此启动菜单中“生成”有效项。你也可以检查启动菜单,确保正确无误。

UEFI 提供了一种非常优秀的机制,可以从上层架构执行此操作:你可以从已启动的操作系统中配置系统启动行为。如果已通过 UEFI 启动 Linux,就可以使用 efibootmgr 工具来完成所有这些操作。Windows 也有相应的工具,但是我对 Windows 下的工具非常不熟悉。我们不妨看一些典型的 efibootmgr 输出,这些是我从 Fedora 论坛转过来的,稍微进行了调整:

[root@system directory]# efibootmgr -v

BootCurrent: 0002

Timeout: 3 seconds

BootOrder: 0003,0002,0000,0004

Boot0000* CD/DVD Drive BIOS(3,0,00)

Boot0001* Hard Drive HD(2,0,00)

Boot0002* Fedora HD(1,800,61800,6d98f360-cb3e-4727-8fed-5ce0c040365d)File(\EFI\fedora\grubx64.efi)

Boot0003* opensuse HD(1,800,61800,6d98f360-cb3e-4727-8fed-5ce0c040365d)File(\EFI\opensuse\grubx64.efi)

Boot0004* Hard Drive BIOS(2,0,00)P0: ST1500DM003-9YN16G .

[root@system directory]#

这个示例非常清晰。我们可以从中观察细节。

第一行表示,目前你从“启 动菜单”的哪个项进行了启动。第二行非常明显(如果固件的 UEFI 启动管理器显示了类似启动菜单的界面,那么这一行表示继续启动默认项之前的超时)。BootOrder 是列表中启动项的尝试顺序。其余输出显示了实际的启动项。我们稍后会说明每一个启动项具体作用。

如果完全正常启动 UEFI 固件,而不进行任何调整(我们稍后会讨论),UEFI 固件将按照BootOrder 中列出的顺序,尝试从“启动菜单”中的每个“项”进行启动。因此,在这台计算机上,UEFI 固件将尝试启动名为“opensuse”的项,如果启动失败,然后再尝试启动名为“Fedora”的项,然后再是“CD/DVD Drive”,接着是第二项“Hard Drive”。

UEFI原生启动:实际工作原理——启动管理器项

那么,这些项的 实际含义是什么?实际上,UEFI 规范之所以显得复杂,很大程度上是因为其中的不确定因素太多。如果你正在阅读 UEFI 规范,那么先做好心理准备,然后前往 EFI_DEVICE_PATH_PROTOCOL 一节。但是请注意,这个协议是通用的,虽然这个协议不涉及启动过程,但是有其他作用——这实际上就是 UEFI 官方的设备标识方法,这种标识方法可用于启动管理器项以及各种其他用途。出于各种原因,并不是每一种潜在的 EFI 设备都像 UEFI 启动管理器项一样起作用(如果你想从视频适配器启动,很可能不会成功)。但是启动菜单中显然可以包含指向 PXE 服务器(而不是磁盘分区)的项。UEFI 规范进行了多项规定,可以向 UEFI 启动管理器配置中添加除磁盘以外的启动目标。

但是对我们而言,只需要考虑连接到计算机的一般磁盘即可。既然这样,我们来讨论下可能遇到的三种启动项类型。

BIOS 兼容启动项

在 本示例中,Boot0000 和 Boot0004 实际上是 BIOS 兼容模式启动项,而不是原生 UEFI 启动项。这些启动项不是通过外部工具添加到 UEFI 启动管理器配置中的,而是由固件本身生成的——这也是 UEFI 固件实现 BIOS 兼容启动的常见方式,通过生成 UEFI 启动管理器项,可触发指定设备的 BIOS 启动。至于 UEFI 启动管理器如何呈现给用户,这是另一个问题,我们稍后讨论。根据具体固件及其配置,其中有些项可能无法显示。每一项只会具有一个名称(“CD/DVD Drive”、“Hard Drive”),这表示“如果选中此项,那么就以 BIOS 兼容模式启动本磁盘”(其中,对于 Boot0000,“本磁盘”为 3,0,00,对于 Boot0004,“本磁盘”为 2,0,00)。

“回退路径 (Fallback path)”UEFI 原生启动项

Boot0001 项(我虚构的,实际操作中可能不存在,这里只是为了举例说明)用于通知固件尝试从特定磁盘启动(以 UEFI 模式而不是 BIOS 兼容模式),但是并没有向固件提供其他信息。它没有指定磁盘上的具体启动目标,而只是让固件启动磁盘。

UEFI 规范定义了一种“回退”路径 (Fallback path),用于启动此类启动管理器项,其工作原理类似于 BIOS 驱动器启动:它会在标准位置查找某些启动装载程序代码。但是其中的细节和 BIOS 不同。

当 尝试以这种方式启动时,固件真正执行的操作相当简单。固件会遍历磁盘上的每个 EFI 系统分区(按照磁盘上的分区顺序)。在 ESP 内,固件将查找位于特定位置的具有特定名称的文件。在 x86-64 PC 上,固件会查找文件 \EFI\BOOT\BOOTx64.EFI。固件实际查找的是 \EFI\BOOT\BOOT{计算机类型简称}.EFI,其中,“x64”是 x86-64 PC 的“计算机类型简称”。文件名还有可能是 BOOTIA32.EFI (x86-32)、BOOTIA64.EFI (Itanium)、BOOTARM.EFI(AArch32,即32位ARM)和 BOOTAA64.EFI(AArch64,即64位ARM)。然后,固件将执行找到的第一个有效文件(当然,文件需要符合UEFI规范中定义的可执行格 式)。

这种机制的设计目的不在于启动日常使用的操作系统。它的设计目的更像是为了启动可热插拔、与设备无关的介质(如 Live 映像和操作系统介质)。这也是这种机制的常见用途。如果查看 Linux 或其他操作系统的 UEFI 兼容 Live 或安装介质,你会发现其中包含 GPT,以及位于(或靠近)设备起始位置的 FAT 分区,该分区的 GPT 分区类型标识为 EFI 系统分区。在那个分区中,会有一个 \EFI\BOOT 目录,目录中至少包含上述特殊命名的文件之一。当以原生 UEFI 模式启动 Fedora Live 或安装介质时,就会采用这种机制。BOOTx64.EFI(或其他)文件将处理剩余启动过程,从而启动介质上包含的真正操作系统。

完全原生 UEFI 启动项

Boot0002 和 Boot0003 是存储设备上所安装操作系统的“典型”项。这些项显示了 UEFI 启动机制的全部优势,不仅仅是“从此磁盘启动”,而是“启动此特定磁盘上此特定位置中的这一特定启动装载程序”。

Boot0002 是由原生 UEFI Fedora 安装生成的启动项。Boot0003 是由原生 UEFI OpenSUSE安装生成的启动项。按照字面意思,这些启动项表示“从此分区加载这一文件”。分区指的是 HD(1,800,61800,6d98f360-cb3e-4727-8fed-5ce0c040365d) 这个东西:表示某一特定分区(使用 EFI_DEVICE_PATH_PROTOCOL,我不打算对此进行详细介绍。如果你通过固件界面和 efibootmgr 与启动管理器进行交互,你也不需要知道其中的细节)。文件指的是 (\EFI\opensuse\grubx64.efi) 这个东西:它仅表示“加载所述分区上此位置中的文件”。这里所指的分区基本上始终指的就是充当 EFI 系统分区的那个分区,因此:可以放心地让固件访问 EFI 系统分区。

UEFI 规范提供这一机制,以便操作系统可启动:操作系统将启动装载程序(作用为加载操作系统内核等)安装到 EFI 系统分区中,并使用某一名称(显然,这一名称通常来源于操作系统名称)以及启动装载程序(EFI 可执行格式,用于加载操作系统)的位置向 UEFI 启动管理器配置中添加启动项。

Linux发行版使用 efibootmgr 工具处理 UEFI 启动管理器。进行原生 UEFI 安装时,有关启动装载方面,Linux 发行版实际进行的操作相当简单:它会创建一个 EFI 系统分区(如果不存在此分区),使用相应配置将 EFI 启动装载程序(通常为 grub2-efi,但是也有例外)安装到 EFI 系统分区中的正确路径下,然后调用 efibootmgr 添加相应的 UEFI 启动管理器项(指向其启动装载程序)。如果已存在 EFI 系统分区,大部分发行版会使用现有分区(尽管完全可以创建新的 EFI 系统分区并使用这个新分区):我们已经提到过,UEFI 是一种宽松规范,只要在逻辑上遵循其设计,那么有多少个 EFI 系统分区都没问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值