通常一个计算机设备的磁盘在使用前需要结合使用场景对其进行分区和格式化后,才能使用,本文主要介绍操作系统对磁盘进行分区常用的两种分区表MBR(Master Boot Record,主引导记录)和GPT(GUID Partition Table,全局唯一标识符分区表)及磁盘分区规则。首先弄明白磁盘分区和格式化这两个概念:
1.磁盘分区:把整块物理磁盘划分为多个逻辑区域,通常使用MBR或者GPT分区表进行分区。
2.磁盘格式化:在分区上写入文件系统(比如BTRFS/XFS/EXT4等),操作系统才能正常的对磁盘进行读写文件。

一、MBR分区表
MBR最早由微软在20世纪80年代初为IBM PC DOS 2.0操作系统设计,成为传统BIOS 架构下磁盘的通用标准,后续普遍被Windows、Linux以及各类x86操作系统兼容使用,这一项技术已经沿用40多年。
核心点1:使用MBR分区的磁盘,MBR通常都是位于磁盘的第1个扇区(1个扇区512字节)。
核心点2:从第2个扇区开始往后是数据分区,MBR分区最多可以分4个分区,可以是4个主分区(无扩展分区、无逻辑分区),也可以是≤3个主分区+1个扩展分区(扩展分区内再划分多个逻辑分区)。
核心点3:MBR扇区内的结构,其中前446字节是主引导记录程序(操作系统安装时会安装),64字节是分区表(共4个分区表,每个分区表固定占16字节),最后2字节是MBR签名(主要标识本磁盘是否是启动/活动磁盘,如果值为0X55AA就是启动磁盘)。
核心点4:MBR是32位LBA寻址,硬盘寻址现在统一用LBA,什么是LBA可以参考上篇文章《Linux存储--硬盘数据读取方式》。每个分区表项中记录分区总扇区数的字段固定只用32 位无符号整数存储,32位无符号整数取值范围是2的32次方(也就是分区的最大扇区总数是4294967296个)。
磁盘分区最大容量= 最大扇区数 × 单扇区大小:
按每个扇区大小512字节,分区的最大容量就是:
最大扇区总数4294967296 x 512字节=2199023255552字节=2048GB=2TB(这就是为什么使用MBR分区,最大只能支持2TB磁盘的原因)
核心点5:MBR中只能有1个活动分区,否则BIOS无法确定从哪启动;无冗余备份,MBR损坏后磁盘几乎不可用。

分区表字段含义:
1.Boot signature(引导标志,1 字节),值为0x80表示该分区是活动分区(可引导分区);值为0x00表示非活动分区,无法直接引导。
2.Start head / Start sector / Start cylinder(起始CHS地址,共3字节),这是早期CHS(Cylinder/Head/Sector)寻址方式的残留字段,用来记录分区起始位置。现代系统磁盘都用LBA寻址,CHS字段基本被废弃,只在兼容老系统时用。
3.System signature(分区类型,1 字节),用来标记分区的文件系统等信息,比如
0x00:未使用的分区项
0x01:FAT12
0x04/0x06:FAT16
0x07:NTFS
0x83:Linux 原生分区(ext4 等)
0x82:Linux swap 分区
0xEE:GPT磁盘的保护MBR 分区(标记为GPT 磁盘)
4. End head / End sector / End cylinder(结束CHS地址,共3字节)和起始CHS 字段类似,记录分区结束位置的CHS地址。同样只在老系统中使用,现代系统完全依赖LBA 字段。
5.No. of sectors before the partition,4字节,表示本分区前扇区数,从磁盘LBA0到该分区起始位置一共跳过了多少个扇区数。
6.No. of sectors in the partition,4字节,表示本分区内扇区总数。
二、GPT分区表
21世纪初,随着大容量磁盘的普及,MBR分区表方式遇到了瓶颈;Intel公司联合微软等公司共同推出GPT(GUID分区表和UEFI新标准,逐步替代MBR。

核心点1:GPT是64位LBA寻址,GPT是为大容量硬盘重新设计的分区标准,所有LBA 相关字段统一使用64位整数。
核心点2:每个GPT分区表项结构里的LBA起/止编号采用8字节(64位)长度表示,也就是总扇区数编号为:2的64次方=18446744073709551616。
单个GPT分区容量约为:
总扇区数18446744073709551616 x 512字节≈8192 EB(艾字节)
可以看出GPT分区表方式原生64位LBA寻址,彻底摆脱采用MBR方式的2TB限制。
核心点3:GPT主分区表从磁盘LBA 2开始,占32 个扇区(LBA 2–33);备份分区表:位于磁盘末尾,同样占32个扇区;分区表双表冗余,加上CRC 校验,防损坏、防篡改,大幅提升了可靠性。
核心点4:GPT主分区表区域划分有128个分区表,默认支持128个主分区,摆脱了MBR分区表方式的4个主分区的限制。
主GPT表头结构(512字节)
字段名称 | 字段含义 | 字段长度 |
signature | 签名EFI PART | 8字节 |
revision | 版本=0x00010000 | 4字节 |
headersize | 头部大小=92 | 4字节 |
headerCRC32 | 头部校验和 | 4字节 |
reserved | 保留,必须为0 | 4字节 |
myLBA | 本头所在LBA | 8字节 |
alternateLBA | 备份头所在LBA | 8字节 |
firstusableLBA | 首个可用分区LBA(通常是34) | 8字节 |
lastusableLBA | 末个可用分区LBA(N-34) | 8字节 |
diskguid | 磁盘唯一GUID | 16字节 |
partitionEntryLBA | 分区表项起始LBA(固定为2) | 8字节 |
numberofpartitionentries | 分区表项数量,默认128 | 4字节 |
sizeofpartitionentry | 每个分区表项大小(固定为128字节) | 4字节 |
partitionentryarrayCRC32 | 分区表项校验和 | 4字节 |
保留,GPT表头结构体之外的扇区填充空间,必须为0 | 420字节 |
单个GPT分区表项的结构(128字节)
字段名称 | 字段含义 | 字段长度 |
Partition Type GUID | 标识分区的文件系统等信息 | 16字节 |
Unique Partition GUID | 每个分区全局唯一的ID,由分区工具如gdisk、parted等自动生成 | 16字节 |
Starting LBA | 起始LBA编号,GPT分区表64位寻址的来源 | 8字节 |
Ending LBA | 结束LBA编号,GPT分区表64位寻址的来源 | 8字节 |
Attributes | 标记分区的特殊状态,控制操作系统对分区的访问方式,如隐藏恢复分区、设置只读等 | 8字节 |
Partition Name | 用于在管理工具中显示分区名称 | 72字节 |
三、计算机启动组合方案
1. BIOS + MBR启动方案
通常用于传统老式主板计算机,硬盘容量小于2TB的场景;正常分区即可,无需额外分区,仅需1个活动主分区。
此方案因为MBR只存在于磁盘第1个扇区,无备份和加密,MBR损坏会导致系统无法启动。
2.UEFI + GPT启动方案
新一代计算机主板固件多数都支持UEFI,而UEFI搭配GPT也是UEFI规范一部分。必须在磁盘的第一个分区创建格式为FAT32、容量大小为100MB的ESP分区(EFI系统分区,通常从LBA34开始的分区),用于存放EFI 引导文件;如果是windows系统,还需在ESP分区后额外保留容量大小约16MB的MSR分区。
如果磁盘大于2TB,必须使用此方案。此方案有备份分区表,可靠性强。
四、其他
1.磁盘是否可以不划分分区使用?
可以不分区直接用(整块盘做一个分区),整块磁盘作为单一分区,本质也是分区(只有1 个主分区),只是没手动划分多个区。
2.磁盘是否可以真正完全不分区、不格式化使用?
在一些特殊场景如数据库或者虚拟化应用场景,为了提高磁盘/存储的IO性能,由应用软件本身管理数据存储,不用文件系统,也就是可以采用磁盘裸设备方式进行数据读写。
另外还有其他使用RAID卡、存储阵列LUN的方式:底层硬件接管磁盘,主机只识别逻辑盘,不再单独分区格式化,磁盘仅做底层数据备份或者镜像。