3、MBR分区详解:MBR结构、主分区、扩展分区、逻辑分区的概念与限制

MBR 分区,说白了就是硬盘上最早的那套分区方案。我入行那会儿,几乎所有 x86 机器都在用这套东西。虽然现在 GPT 越来越普及,但 MBR 在老旧系统、嵌入式设备、以及某些特殊场景下依然坚挺。你想想看,搞懂它,不光是为了应付考试,更是为了以后遇到分区表损坏、系统引导失败时,能快速定位问题。

3.1 MBR 的物理结构

MBR 位于硬盘的 0 柱面、0 磁头、1 扇区,也就是 LBA 0 这个位置。它总共只有 512 字节,却要承载整个硬盘的分区信息和引导代码。空间非常紧张,每一字节都得精打细算。

偏移地址 长度 内容 说明
0x000 - 0x1BD 446 字节 引导代码区 存放第一阶段引导程序(Bootloader)
0x1BE - 0x1FD 64 字节 分区表 4 个分区表项,每项 16 字节
0x1FE - 0x1FF 2 字节 魔数签名 固定为 0x55AA,标识该扇区为有效 MBR

这里有个关键点:分区表只有 64 字节,每个分区表项固定 16 字节。所以最多只能记录 4 个分区。这就是 MBR 最根本的限制——主分区数量上限为 4。

核心结论:MBR 的 512 字节结构决定了它只能容纳 4 个主分区表项。这是所有后续扩展分区、逻辑分区概念的根源。

3.2 主分区(Primary Partition)

主分区就是直接记录在 MBR 分区表中的分区。每个主分区都可以独立安装操作系统,并且可以被 BIOS 直接识别并引导。我见过不少新手以为只有第一个主分区才能引导,其实不是——只要分区表项中的引导标志位(80h)被设置,BIOS 就会尝试从该分区启动。

主分区的 16 字节表项结构如下:

字节0   :引导标志(80h 可引导,00h 不可引导)
字节1-3 :CHS 起始地址
字节4   :分区类型(如 0x83 为 Linux,0x07 为 NTFS)
字节5-7 :CHS 结束地址
字节8-11:LBA 起始扇区(4 字节)
字节12-15:分区总扇区数(4 字节)

嗯,这里要注意:CHS 地址在现在的硬盘上基本已经失效了,实际使用的是 LBA 地址。但分区表里依然保留着 CHS 字段,这是为了兼容老旧的 BIOS。

3.3 扩展分区(Extended Partition)

既然主分区最多只能有 4 个,那我要用 5 个、6 个分区怎么办?扩展分区就是用来解决这个问题的。

扩展分区本身也是一个主分区,但它不直接存放数据。它的作用是一个“容器”,用来容纳多个逻辑分区。你可以把扩展分区理解成一个“二级分区表”的入口。

具体做法是:在 MBR 的 4 个主分区表项中,拿出一个来标记为扩展分区(分区类型通常为 0x05 或 0x0F)。这个扩展分区的起始扇区,存放着一个 EBR(Extended Boot Record),它的结构和 MBR 类似,但只包含两个分区表项:

  • 第一个表项:指向当前逻辑分区的起始位置和大小。
  • 第二个表项:指向下一个 EBR 的位置(形成链表结构)。

我曾经在帮客户恢复数据时,遇到过 EBR 链表断裂的情况。整个扩展分区里的逻辑分区全部丢失,但数据其实还在。只要手动修复 EBR 的链表指针,就能把分区找回来。这种问题,不懂 MBR 结构的人根本无从下手。

3.4 逻辑分区(Logical Partition)

逻辑分区就是挂在扩展分区下面的“子分区”。它们不直接出现在 MBR 分区表中,而是通过 EBR 链表来管理。

逻辑分区的数量理论上没有上限,但受限于操作系统和磁盘大小。比如 Windows 最多支持 24 个逻辑驱动器号(C: 到 Z:),Linux 则基本没有限制。

逻辑分区的结构关系可以用下面这张图来理解:

MBR 分区结构关系图 MBR 引导代码 + 分区表 主分区 1 /dev/sda1 主分区 2 /dev/sda2 扩展分区 容器 EBR 1 链表节点 逻辑分区 1 /dev/sda5 EBR 2 链表节点 逻辑分区 2 /dev/sda6 逻辑分区 3 /dev/sda7 EBR 3 链表末尾 关键说明 • 主分区最多 4 个 • 扩展分区占 1 个主分区名额 • 逻辑分区通过 EBR 链表管理

3.5 MBR 的核心限制

搞清楚了结构,咱们来总结一下 MBR 的硬伤。这些限制在实际工作中经常会遇到,尤其是做大容量存储规划时。

限制项 具体数值 实际影响
主分区数量 最多 4 个 超过 4 个分区必须使用扩展分区
最大磁盘容量 2 TiB(2^32 扇区 × 512 字节) 超过 2TB 的磁盘无法完全使用 MBR 分区
最大分区容量 2 TiB 单个分区不能超过 2TB
引导代码大小 446 字节 Bootloader 功能受限,复杂引导需借助 stage2
分区表备份 无 MBR 损坏后整个磁盘分区信息丢失

避坑指南:我曾经遇到过一台服务器,挂载了一块 3TB 的硬盘,用 MBR 分区后只识别出 2TB。客户以为是硬盘坏了,折腾了半天。其实就是 MBR 的 32 位 LBA 地址限制,超过 2^32 扇区就无法寻址。后来换成 GPT 分区,问题立刻解决。

3.6 分区编号规则

在 Linux 下,分区编号的规则很直观,但新手容易搞混。我习惯用 fdisk -l 来查看,输出结果一目了然。

设备        启动     起点       末尾       扇区   大小  类型
/dev/sda1    *        2048     409600     407553   199M  Linux 文件系统
/dev/sda2           409602  1953525166  1953115565 931.5G 扩展分区
/dev/sda5           409604   1953525166  1953115563 931.5G Linux 文件系统

注意看:主分区编号是 1-4(sda1, sda2, sda3, sda4)。逻辑分区从 5 开始编号(sda5, sda6, ...)。即使你只用了 2 个主分区,第一个逻辑分区也是 sda5,而不是 sda3。这个规则是固定的,别搞错了。

个人经验:我建议在分区时,把扩展分区放在最后一个主分区位置(比如 sda4)。这样前面的 sda1、sda2、sda3 都可以作为独立的主分区使用,逻辑分区从 sda5 开始,结构更清晰。当然,这只是习惯,不是强制要求。

3.7 实际应用中的选择

那么问题来了:什么时候该用 MBR,什么时候该用 GPT?

我个人判断标准很简单:

  • 磁盘小于 2TB,且需要兼容老旧 BIOS:用 MBR 完全没问题。比如一些工控机、嵌入式设备、老服务器。
  • 磁盘大于 2TB,或者需要 UEFI 引导:必须用 GPT。MBR 的 2TB 上限是硬伤,绕不过去。
  • 需要超过 4 个分区:MBR 也能做到,但必须用扩展分区+逻辑分区的方式。GPT 则没有这个限制。

我记得有一次给一个客户做数据恢复,他的硬盘是 MBR 分区,但分区表被病毒破坏了。我手动重建了分区表项,把数据全找回来了。如果当时是 GPT,恢复起来会更复杂,因为 GPT 有备份分区表,但工具链不如 MBR 成熟。所以 MBR 虽然老,但在某些场景下反而有优势。

嗯,MBR 分区的内容就讲到这里。结构虽然简单,但背后的设计思想——用 512 字节管理整个磁盘——在当年是非常精妙的。理解它,你就能明白为什么后来的 GPT 要那样设计。