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 则基本没有限制。
逻辑分区的结构关系可以用下面这张图来理解:
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 要那样设计。