3. 分区表与分区管理

分区表是磁盘上描述“哪一段扇区属于哪个分区”的元数据。操作系统并不直接识别裸磁盘上的文件系统,而是先读取分区表,再按分区表给出的起始扇区、长度和类型去访问对应区域。因此,分区表一旦损坏或被覆盖,即使分区内的文件系统数据仍然存在,系统也可能无法挂载。理解 MBR 与 GPT 的差异、掌握 parted/fdisk/gdisk 的适用场景,并养成备份分区表的习惯,是存储工程中最基础也最关键的一环。

MBR 与 GPT:两种分区表的核心差异

MBR(Master Boot Record)位于磁盘第 0 扇区(512 字节),其中 446 字节为引导代码,64 字节为分区表,2 字节为结束标志 0x55AA。64 字节按每项 16 字节计算,最多只能描述 4 个主分区。为了突破这一限制,引入了扩展分区:把其中一个主分区标记为扩展分区,再在其中划分逻辑分区,从而支持更多分区。MBR 使用 32 位记录起始扇区和分区长度,按 512 字节扇区计算,单分区最大约 2 TiB,整盘寻址上限也受此约束。

GPT(GUID Partition Table)则把分区表放在 LBA1 的 GPT 头以及后续的分区项数组中,并在磁盘末尾保留一份备份。GPT 头中记录分区项数量、单项大小、分区项数组的 CRC32 校验和、头部 CRC32 校验和,以及磁盘 GUID。默认情况下分区项数组可容纳 128 个分区项,每项 128 字节,因此分区数量远超 MBR。GPT 使用 64 位 LBA 描述位置和长度,容量上限极高,实际限制通常来自操作系统和文件系统。此外,GPT 分区带唯一 GUID 和可读名称,便于识别;而 MBR 只有类型字节和可选的卷标。

需要特别注意的是,GPT 磁盘开头仍保留一个“保护性 MBR”,其中只有一个类型为 0xEE 的分区,覆盖整块磁盘,目的是让不认识 GPT 的旧工具不要误判磁盘为空而覆盖数据。因此看到 0xEE 分区并不代表磁盘是 MBR 磁盘。

MBR 与 GPT 磁盘布局对比 MBR 磁盘 LBA0:引导代码 446B + 分区表 64B + 0x55AA 最多 4 个主分区,32 位 LBA,单分区 ≤ 2 TiB 主分区1 主分区2 扩展分区 内含逻辑分区 无分区表备份,损坏后恢复困难 GPT 磁盘 LBA0:保护性 MBR(类型 0xEE) LBA1:GPT 头(CRC32 校验) LBA2~33:分区项数组(128 项 × 128B) 分区1 分区2 分区3 … 磁盘末尾:GPT 头与分区项数组备份 对比项 MBR GPT 最大分区数 4 主分区 / 扩展+逻辑 默认 128 项 单分区容量 ≤ 2 TiB 64 位 LBA,极大 冗余与校验 无备份、无校验 头+表备份,CRC32

工具选择:parted、fdisk 与 gdisk

三者都能操作分区表,但定位不同。fdisk 是传统工具,新版 util-linux 中的 fdisk 已支持 GPT,但交互风格仍偏 MBR 习惯;gdisk 专为 GPT 设计,命令与 fdisk 类似(n、d、p、w),适合精细处理 GPT 类型码和 GUID;parted 同时支持 MBR 和 GPT,既能交互也能用命令行一次性完成建表、建分区、设标志,适合脚本化。RHEL 中还有一个前端 partx 用于通知内核重读分区表。

查看当前磁盘分区表类型,可用:

# parted /dev/sdb print
# fdisk -l /dev/sdb
# gdisk -l /dev/sdb

若要把一块新盘做成 GPT 并创建一个 10 GiB 分区,用 parted 一条命令即可:

# parted /dev/sdb mklabel gpt
# parted /dev/sdb mkpart primary xfs 1MiB 10GiB
# partprobe /dev/sdb
# lsblk /dev/sdb

这里 1MiB 作为起始位置不是随意取的。传统磁盘的物理扇区为 512 字节,但现代磁盘(尤其是 SSD 和 4Kn 盘)的物理扇区为 4096 字节。如果分区起始扇区没有与 4096 字节边界对齐,一次逻辑写可能跨越两个物理扇区,导致读改写放大,性能下降。因此分区对齐的本质是:让分区起始 LBA 乘以逻辑扇区大小后,能被物理扇区大小整除。以 512e 磁盘(逻辑 512B、物理 4096B)为例,起始 LBA 必须是 8 的倍数;从 1 MiB(LBA 2048)开始天然满足 8 的倍数,因此成为通用推荐起点。parted 默认按 MiB 对齐,fdisk 的默认起始值通常也是 2048 扇区,gdisk 会按 2048 扇区对齐。

分区对齐的检查与判断

判断一个分区是否对齐,可以查看其起始扇区:

# fdisk -l /dev/sdb
设备         Start      End   Sectors  Size Type
/dev/sdb1     2048  20971519  20969472   10G Linux filesystem

起始扇区 2048 是 8 的倍数,说明在 512e 磁盘上已对齐。若看到起始扇区为 63、16065 这类值,则很可能未对齐,应重建分区。对于 4Kn 磁盘(逻辑与物理均为 4096B),起始 LBA 只需为 1 的倍数即可,但按 1 MiB 对齐仍然安全。parted 的 align-check optimal 1 可直接检查分区 1 是否最优对齐。

分区表备份与恢复

分区表很小,但重建代价很高。备份 GPT 分区表最直接的方式是用 sgdisk 导出:

# sgdisk --backup=/root/sdb-gpt.bak /dev/sdb
# sgdisk --verify /dev/sdb

恢复时把备份写回同一块盘(或同容量替换盘):

# sgdisk --load-backup=/root/sdb-gpt.bak /dev/sdb
# partprobe /dev/sdb

MBR 磁盘可备份第 0 扇区:

# dd if=/dev/sdb of=/root/sdb-mbr.bak bs=512 count=1
# dd if=/root/sdb-mbr.bak of=/dev/sdb bs=512 count=1
恢复分区表前务必确认目标磁盘正确。把 A 盘的分区表恢复到 B 盘,会覆盖 B 盘原有分区结构,可能导致数据不可访问。GPT 备份文件包含磁盘 GUID 和分区 GUID,恢复到不同磁盘时需评估是否应重新生成 GUID。

实操检查清单

检查项命令期望结果
分区表类型parted /dev/sdb printPartition Table: gpt
分区起始对齐fdisk -l /dev/sdbStart 为 2048 或 8 的倍数
GPT 完整性sgdisk --verify /dev/sdb无错误输出
内核已重读lsblk /dev/sdb能看到新分区
备份文件存在ls -l /root/sdb-gpt.bak文件非空

分区管理的关键不在于记住某个命令,而在于建立“先确认磁盘与分区表类型,再对齐建分区,最后备份并验证”的稳定习惯。MBR 适合小容量、兼容性要求高的场景;GPT 是现代 RHEL 系统的默认选择。parted 适合脚本化建表,gdisk 适合精细 GPT 操作,fdisk 适合快速查看与常规调整。把分区对齐和分区表备份纳入标准流程,可以避免大量后期性能问题和灾难性恢复工作。