UEFI 如何检测分区中的引导设备?

ran*_*nsh 2 bios uefi

UEFI 如何检测引导设备?

如果我只是在某个分区上安装 linux,例如 /dev/sda2,uefi 将如何将其识别为启动项?

BIOS 会检查每个分区吗?如何 ?

use*_*686 7

普通的 PC BIOS不理解分区。它只读取扇区 0(MBR),运行在那里找到的初始引导代码(必须由操作系统安装),并且引导代码本身必须解析分区表。

(并非所有 MBR 引导扇区都以相同的方式执行此任务。Windows 或 Syslinux 安装的引导扇区仅搜索标记为“活动”的分区,而 GRUB 和 LILO 则在某个硬编码位置查找配置文件。一些引导扇区仅理解 MBR ,其他人可以阅读 GPT。)

因此,BIOS 引导菜单将只有磁盘,而不是分区——并且列出操作系统的精美引导菜单由 OS 引导加载程序(例如 GRUB)显示,而不是由 BIOS 显示。搜索操作系统内核分区和启动操作系统本身也是由这个引导加载程序完成的,而不是由 BIOS 完成的。


与 BIOS 不同,UEFI固件实际上理解 MBR 和 GPT 分区表。但是,UEFI 仍然无法识别 Linux 或 Windows 分区,并且无法直接从那里启动操作系统。

相反,UEFI 固件仅查找特定的“EFI 系统分区”,即包含引导加载程序的 FAT32 分区。固件还在NVRAM 中保存了一个操作系统列表,每个安装的操作系统都会在那里添加自己的条目,指向*.efi系统分区中自己的文件。

例如,Windows 总是添加一个标题为“Windows Boot Manager”的条目,它指向文件“\EFI\Microsoft\Bootmfgw.efi”,它是 Windows 引导加载程序。

所以 UEFI 引导菜单可以有几种类型的引导条目:

  1. 手动添加的条目存储在 NVRAM 中——带有自定义标签并指向 EFI 系统分区内的特定文件;
  2. 自动检测在 EFI 系统分区中有文件的磁盘\EFI\Boot\BootX64.efi- 这些没有自定义标签,只有“UEFI:”后跟磁盘型号;
  3. 如果启用 - 具有 BIOS MBR 的磁盘(用于在兼容模式下启动)。

如您所见,UEFI 固件仅使用一个分区(EFI 系统分区),其余部分(查找 OS 内核分区)仍由操作系统自己的引导加载程序完成。

即使在 UEFI 中,用于选择操作系统或内核版本的图形引导菜单通常也由操作系统引导加载程序显示,而不是由 UEFI 本身显示。


也就是说,Linux 引导加载程序仍然不完全了解分区。Linux 引导加载程序的主要任务是找到内核映像 (vmlinuz) 和 initramfs 存档,并为内核提供命令行选项 - 其中包含 Linux 语法中的根分区名称,例如root=/dev/sda2or root=UUID=XYZ-ABC

最后,一旦 Linux 内核启动,它会自行搜索与提供的名称匹配的分区,并将其挂载到/. (这可以由内核内部完成,也可以由 initramfs 完成,如果需要更大的灵活性。)