UEFI 执行哪个文件?

UEFI 执行哪个文件?

我想对 UEFI 启动过程进行一些澄清。下面的屏幕截图显示了我当前的配置。

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

我需要澄清 UEFI 执行哪个文件。 UEFI 是否执行 /boot/efi/EFI/Ubuntu/grubx64.efi、/boot/efi/EFI/Ubuntu/shimx64.efi 或 /boot/efi/EFI/Ubuntu/grub.cfg?

查看 /boot/efi/EFI/Ubuntu/grub.cfg 的内容,它显示它指向 /boot/grub/grub.cfg ,我假设这是要执行的文件。那是对的吗?

我感谢大家的帮助。谢谢

答案1

sudo efibootmgr -v准确显示您正在寻找的内容。

如果它说EFI variables are not supported on this system.你需要sudo mount -t efivarfs none /sys/firmware/efi/efivars先这样做。

答案2

BootCurrent: 0002

表示系统当前已使用 UEFI NVRAM 启动变量启动Boot0002

Boot0002*  ubuntu       HD(1,GPT,6ed9354d-32d8-427d-b570-d3cb80fe5986,0x800,0x100000)/File(\EFI\Ubuntu\shimx64.efi)

该变量定义了一个名为 的引导项,该引导项从 PARTUUID 为 的 EFI 系统分区 (ESP)ubuntu引导文件。\EFI\Ubuntu\shimx64.efi6ed9354d-32d8-427d-b570-d3cb80fe5986

因此,固件会加载shimx64.efi,这是安全启动兼容性填充程序。它已使用 Microsoft 的安全启动密钥进行签名,该密钥位于几乎所有支持安全启动的 x86 系统上的安全启动白名单(称为db)中,因此固件将允许其执行。

shimx64.efi将非持久地将 Ubuntu 的安全启动签名密钥添加到允许的列表中(仅适用于本次启动)。如果已配置机器所有者密钥 (MOK),此时它也会以相同的方式添加到安全启动白名单中。然后垫片将告诉固件加载grubx64.efi并尝试执行它。

grubx64.efi使用 Ubuntu 的安全启动签名密钥进行签名(以允许 Ubuntu 更新它而无需与 Microsoft 重复签名过程),并且由于shimx64.efi将该密钥添加到安全启动白名单中,固件也将允许grubx64.efi执行。

Ubuntu将从其所在的同一目录grubx64.efi加载小grub.cfg文件。它不会被执行,而是作为grubx64.efi.该文件将告诉 GRUB 如何找到真正的 GRUB 配置文件:

search.fs_uuid 8fe7176c-3a23-4902-b0db-14bfbacc6601 root
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

(翻译:找到一个带有UUID的文件系统8fe7176c-3a23-4902-b0db-14bfbacc6601,并将其指定为GRUB根文件系统。然后将变量设置prefix<GRUB root filesystem>/boot/grub。然后grub.cfg从变量指示的目录中读取prefix。)

最后,GRUB 会告诉 UEFI 固件将 Linux 内核和 initramfs 加载到内存中,并尝试执行内核。如果内核也使用 Ubuntu 的安全启动签名密钥或 MOK 进行签名,则固件将允许其执行,并且 Linux 内核将启动。内核将读取安全启动密钥白名单并将其添加到特殊的内核密钥环中,该密钥环将用于在执行任何内核模块之前检查它们的签名。这是安全启动实施要求:如果安全启动签名的任何内容允许执行未签名的代码在内核模式下,它将被视为“安全启动翻墙工具”,并将在未来的安全启动固件版本和安全启动黑名单更新中列入黑名单。

实际上,这意味着在启用安全启动时,只有使用发行版的安全启动密钥或 MOK 签名的内核模块才会被内核接受。这也意味着,如果您在启用安全启动的情况下尝试使用单个 GRUB 启动多个不同的发行版,则需要设置 MOK 并对所有发行版的内核进行签名(“拥有”当前 的发行版除外shimx64.efi)您的 MOK 以允许它们启动。

(理论上,使用 Microsoft 的安全启动密钥签名的内核模块也会被接受,但除非您为 Microsoft 工作,否则您不太可能拥有此类模块。)

由于 initramfs 文件未签名,因此固件将其作为不可执行数据读入,但这不是问题,因为它无论如何都需要解压缩:内核将解压缩 initramfs 数据并将其移动到不同的内存位置无论如何,作为启动过程的一部分。此时Linux内核将完全控制处理器,因此它可以根据需要调整任何内存区域的执行保护位,从而执行解压后的initramfs内容在用户模式下(即作为常规过程)完全没有问题。

如果从 initramfs 加载内核模块,它们仍将受到安全启动强制签名检查的约束。

答案3

任何以 结尾的文件.efi都是 uefi 可执行文件并且可以运行。其中有几个几乎做同样的事情——加载内核。有些已签名(用于安全启动),有些则未签名。 (看https://askubuntu.com/questions/342365/what-is-the-difference- Between-grubx64-and-shimx64

其他可能是公用事业;例如,mmx64.efiMOK 更新程序实用程序。

其他不以 结尾的文件.efi可能是配置文件。例如,grub.cfg被 读取grubx64.efi。如果没有这个,grub 就无法在不修改 grub 二进制文件或从其他位置读取配置文件的情况下构建菜单。配置文件在 UEFI 上下文中不可执行。 (在备用上下文视图中,grub.efi 是执行配置文件的解释器。)

相关内容