UEFI 如何检测启动设备?
如果我只是在某个分区上安装 linux,比如 /dev/sda2,uefi 如何能够将其识别为启动项?
BIOS 会检查每个分区吗?如何检查?
答案1
普通PCBIOS不理解分区。它只读取扇区 0(MBR),运行在那里找到的初始引导代码(必须由操作系统安装),并且该引导代码本身必须解析分区表。
(并非所有 MBR 引导扇区都以相同的方式执行此任务。由 Windows 或 Syslinux 安装的引导扇区仅搜索标记为“活动”的分区,而 GRUB 和 LILO 则会在某些硬编码位置查找配置文件。一些引导扇区仅理解 MBR,其他引导扇区可以读取 GPT。)
因此 BIOS 启动菜单将只有磁盘,不是分区 – 列出操作系统的精美启动菜单由操作系统引导加载程序(例如 GRUB)显示,而不是由 BIOS 显示。搜索操作系统内核分区并启动操作系统本身也是由该引导加载程序完成的,而不是由 BIOS 完成的。
与 BIOS 不同,UEFI固件实际上可以识别 MBR 和 GPT 分区表。但是,UEFI 仍然无法识别 Linux 或 Windows 分区,无法直接从那里启动操作系统。
相反,UEFI 固件只会查找特定的“EFI 系统分区”,一个包含引导加载程序的 FAT32 分区。固件还会在非易失性随机存取存储器,每个安装的操作系统都会在那里添加自己的条目,指向*.efi
系统分区内自己的文件。
例如,Windows 总是添加一个名为“Windows 启动管理器”的条目,该条目指向文件“\EFI\Microsoft\Bootmfgw.efi”,即 Windows 引导加载程序。
因此 UEFI 启动菜单可以有几种类型的启动项:
- 手动添加存储在 NVRAM 中的条目 - 带有自定义标签并指向 EFI 系统分区内的特定文件;
- 自动检测磁盘在 EFI 系统分区内有一个
\EFI\Boot\BootX64.efi
文件 - 这些没有自定义标签,只有“UEFI:”后跟磁盘的型号; - 如果启用 – 具有 BIOS MBR 的磁盘(用于在兼容模式下启动)。
如您所见,UEFI 固件仅使用一个分区(EFI 系统分区),但其余部分(查找 OS 内核分区)仍由操作系统自己的引导加载程序完成。
即使在 UEFI 中,让您选择操作系统或内核版本的图形启动菜单通常也由操作系统引导加载程序显示 - 而不是由 UEFI 本身显示。
尽管如此,Linux 引导加载程序仍然不知道根分区。Linux 引导加载程序的主要任务是查找内核映像 (vmlinuz) 和 initramfs 存档,并向内核提供命令行选项 - 其中包含 Linux 语法中的根分区名称,例如root=/dev/sda2
或root=UUID=XYZ-ABC
。
最后,一旦 Linux 内核启动,它将本身搜索与提供的名称匹配的分区,并将其挂载在 上/
。(这可以由内核内部完成,也可以由 initramfs 完成,如果需要更大的灵活性。)