磁盘分区基础:MBR 与 GPT 分区表结构、主分区与扩展分区、分区对齐与性能

说到磁盘分区,这可能是我们运维工作中最基础、也最容易踩坑的环节之一。我记得刚入行那会儿,给一台老服务器加硬盘,随手就用 fdisk 分了区,结果系统死活起不来。后来一查,磁盘超过 2TB,MBR 根本认不全。嗯,从那以后,我对分区表结构就再也不敢马虎了。

MBR 与 GPT:两种分区表的恩怨情仇

先聊聊 MBR(Master Boot Record)。这东西诞生于上世纪 80 年代,跟 IBM PC 一起出道。它的结构其实很简单:磁盘的第一个扇区(512 字节)被拿来放引导代码和分区表。其中分区表只占了 64 字节,每个分区条目固定 16 字节。你算算,64 除以 16,正好 4 个分区。这就是为什么 MBR 最多只能有 4 个主分区。

MBR 还有一个硬伤——它用 32 位来记录扇区地址。32 位能表示的最大值是 2^32,也就是约 43 亿个扇区。按每个扇区 512 字节算,总容量上限就是 2TB。我在项目中遇到过一台存储服务器,挂载了 3TB 的 SAS 盘,用 MBR 分区后系统只认到 2TB,剩下的空间直接消失。你说坑不坑?

GPT(GUID Partition Table)就是来救场的。它是 UEFI 规范的一部分,用 64 位记录扇区地址,理论上支持 8ZB 的容量——你想想看,这基本等于没有上限。GPT 把分区表放在磁盘头部和尾部各一份,互为备份。万一主表坏了,还有备份可以恢复。我个人习惯,只要是新装的系统,一律用 GPT。

关键区别一览:

特性 MBR GPT
最大容量 2TB 8ZB
主分区数 最多 4 个 最多 128 个(Windows 限制)
备份分区表 有(磁盘尾部备份)
引导方式 BIOS + MBR UEFI + GPT
CRC 校验 有(保护分区表完整性)

主分区与扩展分区:MBR 时代的妥协方案

MBR 只能有 4 个主分区,这显然不够用。于是工程师们想了个办法——扩展分区。说白了,扩展分区就是一个特殊的「容器」,里面可以再划分逻辑分区。你想想看,主分区是房间,扩展分区就是客厅,逻辑分区就是客厅里放的几个柜子。

具体怎么用?举个例子:

# 用 fdisk 查看分区表
fdisk -l /dev/sda

# 输出示例
Device     Boot   Start       End   Sectors   Size  Id  Type
/dev/sda1  *       2048   1026047   1024000   500M  83  Linux
/dev/sda2       1026048  41943039  40916992  19.5G  83  Linux
/dev/sda3      41943040  62914559  20971520    10G  83  Linux
/dev/sda4      62914560 104857599  41943040    20G   5  Extended
/dev/sda5      62916608  73402367  10485760     5G  83  Linux
/dev/sda6      73404416  83890175  10485760     5G  83  Linux

看到没?sda4 是扩展分区,sda5 和 sda6 是它里面的逻辑分区。这里有个坑:扩展分区本身不能存数据,它只是占个位置。我曾经遇到一个同事,把扩展分区直接格式化挂载了,结果数据全丢了。嗯,这个教训挺深刻的。

注意:GPT 没有扩展分区的概念。所有分区都是主分区,最多 128 个。所以如果你用 GPT,就不用纠结主分区和逻辑分区的问题了。

分区对齐:一个被忽视的性能杀手

分区对齐,说白了就是让分区的起始扇区正好落在物理块的边界上。为什么重要?因为现代硬盘(尤其是 SSD)的物理块大小是 4KB,而操作系统默认的扇区大小还是 512 字节。如果分区起始位置不对齐,一个 4KB 的写操作可能跨越两个物理块,导致读-改-写操作,性能直接腰斩。

我记得有一次给数据库服务器换 SSD,分区没对齐,结果 4K 随机写入性能只有理论值的一半。后来用 parted 重新分区,指定起始扇区为 2048(正好是 1MB 对齐),性能立马翻倍。你想想看,就一个参数的事,差距这么大。

怎么检查分区是否对齐?很简单:

# 查看分区起始扇区
fdisk -l /dev/sda

# 或者用更直观的方式
parted /dev/sda align-check optimal 1
# 返回 "1 aligned" 表示对齐

对齐的黄金法则是:起始扇区号能被 8 整除(512 字节 * 8 = 4KB)。更保险的做法是 1MB 对齐,也就是起始扇区为 2048 的倍数。我个人习惯,不管什么磁盘,一律 1MB 对齐。省心,也兼容性好。

小技巧:用 parted 创建分区时,指定 --align optimal 参数,它会自动帮你算好对齐位置。比如:parted /dev/sdb mkpart primary ext4 0% 100% --align optimal

实战建议:怎么选?

说了这么多,总结一下我的经验:

  • 磁盘小于 2TB,且是老系统(BIOS 引导):用 MBR 没问题。但注意主分区别超过 4 个,超过就用扩展分区。
  • 磁盘大于 2TB,或者新系统(UEFI 引导):无脑上 GPT。别犹豫,MBR 的 2TB 限制早晚会坑你。
  • SSD 或 NVMe 盘:必须对齐。不对齐的话,寿命和性能都会受影响。我曾经见过一块没对齐的 SSD,用了半年写入放大率飙到 5 倍,寿命直接打五折。
  • 分区工具选择:fdisk 适合 MBR,gdisk 和 parted 适合 GPT。我个人更推荐 parted,功能全,对齐支持好。

最后说一句:分区表这东西,一旦写下去再改就麻烦了。所以动手之前,一定要想清楚。嗯,今天就聊到这儿,下一节我们讲文件系统格式化,到时候再细聊。