显示磁盘或分区是 BIOS 可启动还是 UEFI 可启动

显示磁盘或分区是 BIOS 可启动还是 UEFI 可启动

我有一个笔式驱动器或磁盘,可以在以下位置访问它

/dev/sda

分区位于

/dev/sda1
/dev/sda2
/dev/sda...

我想知道磁盘本身和每个分区:

  • 是经典的可启动(BIOS 启动模式/UEFI 之前)(我认为使用了 MBR)
  • 它是 UEFI 可启动的吗(我想那时没有使用 MBR)
  • 以上都不是
  • 以上两者

我知道有 fdisk,但它不支持 GPT,所以我不能将它用于 GPT 磁盘。并且parted只显示“启动”标志,但它不告诉它是BIOS可启动还是UEFI可启动。

我知道这个任务不会那么困难,因为每个现代 BIOS 都可以列出可启动设备,并且还显示它是否是 UEFI。

答案1

如果磁盘的第一个 512 字节块(块 #0)的最后两个字节是 0x55 和 0xaa,则该磁盘是可引导 BIOS 样式的。如果这是真的,那么 BIOS 固件将假定该块包含有效的主引导记录 (MBR) 并尝试执行它。前 446 个字节左右应包含 16 位 8086 兼容模式下 x86 处理器的可执行代码。

# dd if=/dev/sda bs=512 count=1 2>/dev/null | od -t x1z -A x | tail -2
0001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa  >..............U.<
000200              

除此之外的任何事情都将取决于 MBR 代码的作用:大多数标准 Microsoft MBR 将查找已标记为活动的主分区,并将继续加载和执行该分区的第一个块。但是像 GRUB 这样的另一个引导加载程序可以完全忽略分区标志,并在需要时执行完全不同的操作。


如果可移动介质包含 UEFI 固件可识别的文件系统(该规范最初规定了 FAT32 的特定版本,但它也扩展到涵盖 FAT12 和 FAT16;此外,固件实现可以自由添加),则它是可启动的 UEFI 样式支持其他文件系统类型),文件系统有一个名为EFI(不区分大小写)的目录,该目录有一个名为 的子目录boot,并且该子目录有一个引导加载程序文件 ( *.efi),其名称特定于系统体系结构。或者换句话说,正如 Windows 风格的绝对路径所示,从特定文件系统的根开始:

  • \EFI\boot\bootx64.efi适用于 64 位 x86 系统
  • \EFI\boot\bootia32.efi适用于 32 位 x86 系统(某些迷你笔记本电脑和旧的 x86 Mac)
  • \EFI\boot\bootia64.efi适用于 Intel Itanium 系统(主要是运行某些版本的 Windows、HP-UX 或 OpenVMS 的服务器)
  • \EFI\boot\bootarm.efi适用于具有 UEFI 固件的 32 位 ARM 处理器
  • \EFI\boot\bootaa64.efi适用于带有 UEFI 固件的 64 位 ARM 处理器
  • \EFI\boot\bootriscvNN.efi适用于具有 UEFI 固件的 32 位、64 位和 128 位 RISC-V 处理器(NN分别可以是 32、64 或 128)
  • ...随着 UEFI 固件针对新处理器架构的实施,此列表可以扩展。

如果磁盘具有 GPT 分区表,则包含 UEFI 引导加载程序的分区预计具有分区类型 GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B,将其标识为EFI系统分区,或简称 ESP。任何具有 UEFI 固件的系统都应支持 GPT 分区。

如果磁盘具有 MBR 分区表,则包含 UEFI 引导加载程序的分区应具有0xef... 的 MBR 分区类型代码,但这不是严格要求。

不可移动磁盘可以在不同路径中包含其他 UEFI 引导加载程序,因为已安装操作系统的引导加载程序路径名将存储在用于保存其他 UEFI 固件设置的同一非易失性内存中。这些应该放置在 ESP 分区中目录的特定于供应商的子目录中\EFI。在 Linux 中以 root 身份使用efibootmgr -v来查看 UEFI 引导加载程序路径名和关联的引导设置。

不可移动磁盘还可以在上面为可移动介质指定的固定路径之一中包含 UEFI 引导加载程序文件:这称为后备引导加载程序路径如果非易失性存储器设置丢失,则可以使用。 Windows 默认情况下会像这样放置一个副本bootmgfw.efi; Linux 发行版的安装程序通常不会执行此操作,除非您特别要求。

由于 ESP 通常(但并非总是)安装/boot/efi/在 Linux 中,因此您会在 处找到 RHEL 的安全启动垫片引导加载程序,/boot/efi/EFI/redhat/shimx64.efi以及在 处找到实际的 GRUB /boot/efi/EFI/redhat/grubx64.efi。第一个efi只是挂载点目录的名称,第二个EFI是 UEFI 规范所需的子目录的名称。


根据GPT规范,GPT分区表从磁盘块#1开始,块#0被保留用于保护性MBR:一个虚拟的 MBR 分区表,应该只有一个分区条目,描述一个占用整个磁盘的分区(或 MBR 绝对最大值约为 2 TiB,以较小者为准),分区类型设置为0xee

这告诉不支持 GPT 的系统“是的,该磁盘已被格式化和分区并且正在使用,并且不,它不是您所了解的分区类型。请不要为用户提供一种简单的方法来一键格式化我。”

当然,这使得构建磁盘成为可能混合 GPT/MBR 分区:对于不支持 GPT 的系统,提供有效的 MBR(可能包括引导代码);对于支持 GPT 的系统,提供有效的 GPT 分区表,其中 ESP 分区包含适用于不同系统架构的任意数量的 UEFI 引导加载程序。

答案2

启动修复, 跑过启动信息脚本不进行任何自动修复,您应该获得有关驱动器(以及其他驱动器)引导结构的信息。

如果引导结构与 Ubuntu 的引导结构差异太大,引导信息脚本可能会失败。然后,您应该检查是否存在带有 FAT 文件系统的 EFI 系统分区 (ESP),以及是否存在带有“bios_grub”标志的非常小的分区。看这个链接更多细节。不同操作系统的可启动驱动器和克隆的混合 iso 文件之间的情况可能会有很大不同。

因此,最好在计算机上进行测试,您知道该计算机可以在 UEFI 模式和 BIOS 模式下启动(别名 CSM 别名传统启动)。

相关内容