Linux怎么知道有MBR分区表呢?

Linux怎么知道有MBR分区表呢?

您可能认为这个问题很简单,因为 msdos 分区表 MBR 以 55 AA(十六进制)结尾。但这并不是因为格式化为 FAT32(没有分区表)的磁盘也以 55 AA 结尾。

我这样格式化磁盘:

mkfs.vfat -F32 /dev/sdX

此类磁盘没有分区表,在 Linux 和 Windows 上均可识别。前 512 个字节以 55 AA 结尾。

Linux 如何知道在这样的磁盘上没有有效的分区表,即使它以 55 AA 结尾?

答案1

Linux 内核如何知道这不是 MBR,尽管它是块设备的第一个扇区并且以 0x55 0xAA 结尾?

答案就在代码中:https://elixir.bootlin.com/linux/latest/source/block/partitions/msdos.c#L616

首先,它尝试将该扇区中的数据解释为分区表,然后解释为 FAT 元数据。在第二种情况下,您不会为块设备创建任何分区。这是一种启发式方法,因此可能会出现一些边缘情况,错误检测到 PBR 中不存在的分区表。


这就是原始 DOS 引导过程的工作原理:

第一个扇区包含主引导记录、分区表和一小段代码。现代系统上的此代码调用更复杂的引导加载程序。当时它查看分区表条目,并开始执行第一个活动(可引导)分区的第一个扇区。

第一个扇区是 FAT 分区的引导记录(https://wiki.osdev.org/FAT#Boot_Record)还包含一小段代码 - 这是 DOS 所需的整个引导加载程序(其任务是加载 IO.SYS 和 MSDOS.SYS 文件)。

分区引导记录和主引导记录的签名都是 0x55 0xAA。现在,在软盘等可移动驱动器上,仅仅为了浪费空间而拥有分区表是没有意义的,因此磁盘以 FAT 分区及其引导记录开始。这对 BIOS 没有什么影响,因为加载程序代码与 MBR 一样从偏移量 0 开始,因此它只需要执行那里的任何内容。

当然,PBR 具有与 MBR 不同的结构,描述了 FAT 文件系统的特征。

答案2

Linux是怎么知道的

我们必须清楚这里的术语:什么是Linux在这种情况下?

  • Linux(或任何其他操作系统启动过程):您的mkfs.vfat格式化的磁盘以 MBR 引导扇区和只有一个条目的分区表开始将要在启动时执行。检查man mkfs.vfat的部分--mbr=no

    使用磁盘签名填充(假)MBR 表一个分区,该分区从扇区 0 开始(包括 MBR 本身)并跨越整个磁盘设备。仅当 Microsoft Windows 系统上使用的不可移动磁盘以及格式化整个未分区磁盘时才需要它。磁盘签名和分区表的位置与第一个 FAT 扇区的末尾(引导代码位置)重叠,因此没有额外的空间使用。

    • Linux 分区工具也会检测该表:fallocate -l 100M fatimg; mkfs.vfat -F32 fatimg; echo print all | parted fatimg
  • 但请注意,现代似乎存在一个错误,mkfs.vfat因此--mbr=no通常会被忽略,至少在格式化文件时是如此。
  • Linux 内核分区扫描将只关心预期的 MBR 表,即磁盘的开头
  • 当 Linux 看到一个分区时,挂载工具会探测文件系统;检查 VFAT 很容易。是否为VFAT文件系统包含 MBR 记录:与此无关。文件系统驱动程序并不关心。

答案3

必须知道的不是Linux,而是BIOS。

BIOS将加载引导扇区(磁盘的第一个扇区)并执行它(它具有您编写的签名)。引导扇区的最后部分包含 4 个分区。引导代码只会找到活动分区,将其加载到内存中并执行它(因为引导扇区预计位于内存的精确位置,因此还有实际扇区的副本并跳转到其中)。新的引导扇区可以引导操作系统,或者只是它可能与 MBR 非常相似,但在这种情况下它是辅助分区表),如此递归。 GRUB 只是修改引导扇区,它利用磁盘扇区大于 512 字节(软盘扇区的大小)的事实来存储更多代码(以加载辅助 GRUB 代码)。

这就是代码的执行方式。

Linux(以及Linux)中的程序知道MBR的表结构(以及其他分区表格式,如您所见,这只是一种约定),因此他们知道在硬盘中它应该位于第一个扇区,并且每个扩展表应该有一个分区,并最终有一个到扩展表的附加链接。

如果程序或内核无法识别它,则无法编辑它。但 BIOS 可能可以启动(或者更好的是启动扇区中的代码可以做到这一点)。我们正在与旧程序进行对话,内存非常有限,因此不要期望太多逻辑。最坏的情况:“按任意键重新启动”。

相关内容