EFI 如何找到引导加载程序?

EFI 如何找到引导加载程序?

这似乎是一个相当基本的问题,但我很难找到答案......

EFI 实际上如何找到要启动的东西?

在旧 BIOS 方案下,如果 MBR 具有特殊标记,则内容将加载到 RAM 中并执行。接下来发生的事情取决于该代码的作用。简而言之,要使操作系统可启动,您需要将您选择的引导加载程序安装到 MBR 中,然后执行您选择的引导加载程序所期望的任何其他操作以对其进行配置。通常,BIOS 有一些菜单可让您配置它搜索可启动 MBR 的顺序,但仅此而已。

在 EFI 下...我完全不知道这些东西是如何工作的。据我所知,它根本不涉及启动块,只涉及 EFI 系统分区。但我找不到除此之外的任何细节。这个分区中的文件是否必须放在某个文件夹中或以特定方式命名?因为我的测试笔记本电脑是完全忽略我放在那里的任何东西。

安全启动为此增加了第二层乐趣。为了工作,二进制文件必须经过签名。但我不知道签名是在文件本身内,还是旁边应该有一个单独的签名文件……

答案1

首先固件寻找EFI 变量 Boot####(例如Boot0000Boot0001等等)。它们描述 EFI 启动菜单条目,并包含相应可执行文件的完整位置。例如:

$ sudo efibootmgr -v
启动电流:0000
超时:2 秒
启动顺序:0000,0001,0006,0007
Boot0000* Linux 启动管理器    HD(1,800,32000,785c8ca2-bb16-48fd-917b-19d69543338f)文件(\EFI\gummiboot\gummibootx64.efi)
Boot0001* EFI 外壳HD(1,800,32000,785c8ca2-bb16-48fd-917b-19d69543338f)文件(\shellx64.efi)
Boot0006 硬盘 BIOS(2,0,00)P0:ST9640320AS。
Boot0007 CD/DVD 驱动器 BIOS(3,0,00)P1:SlimtypeDVD A DS8A5SH。

这描述了 SATA 硬盘的位置、GPT 分区 UUID 以及该分区内的路径。

通常,所有启动项都将指向 EFI 系统分区(EFMBR 的类型代码和C12A7328-F81F-11D2-BA4B-00A0C93EC93BGPT 的类型代码 – 如图EF00所示磁盘分区),但这不是必需的。)

如果固件没有存储任何启动条目,或者您从可移动媒体启动,它将使用后备位置 - 它将查找所有 EFI 系统分区(具有匹配的分区类型和 FAT32 文件系统),并且在这些分区中它将期望在 处找到 EFI 可执行文件\EFI\BOOT\BOOTX64.EFI。(此路径适用于 Intel x86_64 系统;其他架构在同一目录中使用不同的文件名)。

EFI 将不是自动尝试启动任何随机*.EFI文件,即使它位于 EFI 系统分区上。

也可以看看:

答案2

据我所知,您似乎应该通过创建 ESP(类型代码为 0xEF 的 MBR 分区,格式化为 FAT 的某种变体)并将文件复制到*.efi其中来启动 EFI。

在我的测试中,所有此类文件都是完全被忽视,除非文件的名称完全一样

/EFI/BOOT/bootx64.efi

所以看起来这就是您必须使用的魔法名称。

目前,我不知道这是官方 EFI 规范的一部分,还是仅仅是我特定主板的一个怪癖。我在这里发布此信息,希望它能帮助其他人……

利用这些知识,我能够将 rEFInd 文件复制到 USB 磁盘上,重命名主可执行文件,并观察到笔记本电脑抱怨二进制文件未签名。(它确实没有签名。)所以现在它看到那里有一些可能可启动的东西。看来如果我可以关闭安全启动,笔记本电脑此时将启动。

(遗憾的是我目前无法让 Shim 工作 - 但这是另一个问题...)

相关内容