暗无天日

=============>DarkSun的个人博客

MBR与GPT分区表的简单说明

MBR分区表说明

MBR_Struct.png

在传统的MBR分区方案中,第0号扇区的的0~512个字节存储的是引导程序,用于服务器启动时引导BIOS的加电自检以及GRUB stage1的加载。 而446~509的这64个字节存放的是分区表信息,其中每个分区占用16字节,因此最多只能包含4个分区的信息。若想要创建超过5个分区,则需要将其中一个分区转换成逻辑分区,再对逻辑分区进行划分。 最后多出来的510~511字节按惯例为0xAA55。若磁盘此处的值不为0xAA55,则判断该磁盘的MBR被损坏。

由于每个分区只有16个字节,因此能记录的信息十分有限,只包括引导标志、分区格式ID、用CHS(磁头、柱面、扇区)方式描述的分区开始位置和结束位置、用LBA方式(逻辑块)描述的分区开始位置以及包含的扇区数,这些信息。

我们可以通过 hexdump 命令输出MBR中分区表的内容。

[vagrant@localhost ~]$   sudo hexdump -s 446 -n 66 -e '1/1 "%02x" " " 3/1 "%02x" " " 1/1 "%02x" " " 3/1 "%02x" " " 2/4 "%10d" "\n"' /dev/sda
00 202100 83 410100       2048      2048
80 410200 83 cb0982       4096   2097152
00 cb0a82 8e feffff    2101248  81784832
00 000000 00 000000          0         0
55 aa                                   

从中可以看出,这个硬盘有三个分区(第四个分区信息全是0),其中:

  • 第0个字节是引导标志,80表示引导,也就是系统从第二块分区引导
  • 第1~3个字节是CHS方式表示的起始位置,目前CHS表示法已经被淘汰了,没有意义
  • 第4个字节是分区类型ID号
  • 第5~7个字节是CHS方式表示的结束位置,目前CHS表示法已经被淘汰了,没有意义
  • 地8~11个字节是LBA方式描述的起始扇区号
  • 地12~15个字节是LBA方式描述的扇区数

这个数据跟 fdisk 显示的数据是匹配的

[vagrant@localhost ~]$ sudo fdisk -lu /dev/sda

Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000abd1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048        4095        1024   83  Linux
/dev/sda2   *        4096     2101247     1048576   83  Linux
/dev/sda3         2101248    83886079    40892416   8e  Linux LVM
[vagrant@localhost ~]$ 

此外,图中第一个分区的开始扇区块是从2048号扇区开始的,也就是说0~2047号扇区是保留扇区不用做分区的。 这其中,第0号扇区为主引导扇区,1~2047号扇区用于存储stage1.5

最后要说明的是,最后那两个字节显示的是 55 aa, 这个实际上就是 0xAA55,原因请参见小端模式

MBR的局限性

MBR存在已经有超过30年的历史了,它存在以下几个局限性:

  • 只有64个字节可以用来存放分区表,导致最多只能存放4个分区
  • 从分区结构中可以看到一个分区只能有4个字节来表达扇区起始数,也就是说一个磁盘只能有 2^32次方 个扇区,一个扇区一般是512个字节,也就是最大2T容量。
  • 所有的分区信息都放在0号扇区的这64个字节中,一旦损坏所有的分区都不能读出来了。

GPT分区表说明

GPT_Struct.png

为了解决MBR的这些局限性,1990年Intel引入了GPT分区格式。

相比MBR,GPT有很多优点:

  • 它支持多达128个分区(通过改变GPT头的设置,其实也可以创建超过128个分区)
  • 支持的磁盘容量高达8ZB
  • 为了降低分区表损坏的风险,GPT在硬盘最后保存了一份相同内容的分区表副本,这就使得即使不小心分区表非覆盖也能够被还原。

MBR分区表只占据0号扇区的64个字节,而GPT分区占据的是1号扇区~33号扇区中。 其中1好扇区存储的是GPT磁头,2号扇区~33号扇区存储的是各个分区的信息。

GPT中每个分区信息用128个字节来存储,一个普通扇区512个字节就能存储4个分区信息,32个扇区就能存储128个分区信息。

此外每个分区的开始扇区和结束扇区是用8个字节来记录的,也就是支持硬盘的扇区数高达 2^64 个,按每个扇区512个字节算就是8ZB容量。

GPT的每个分区都有一个全球唯一的GUID标签。尤其是用来存储引导装载程序的分区,会附上一个EFI系统分区(ESP)的标签,这样支持UEFI的服务器在启动时就可以根据GUID直接定位ESP分区并启动其中的grub.efi,而不再需要 GRUB stage1和stage1.5了.

下面是MBR分区和GPT分区的比较表

#+MBR分区和GPT分区比较

  MBR分区 GPT分区
分区表的位置 0号扇区 1~33号扇区
最大磁盘容量 2TB 8ZB
最大分区数 4个主分区 128
分区工具 fdisk parted

下面是parted命令的主要内部命令 #+parted命令的主要内部命令

命令 说明
check 对文件系统进行检查
cp 复制分区
help 显示帮助分区
mkfs 创建文件系统
mklabel 指定分区表类型
mkpart 创建分区
mkpartfs 创建分区和文件系统
move 移动分区
print 显示当前分区表状态
quit 退出
resize 改变分区大小
rm 删除分区
select 选择要分区的设备
set 设置各种标志,包括引导标志

4KB扇区的磁盘

为了突破传统MBR最大只支持2TB磁盘的限制,除了GPT外,增大磁盘扇区的大小也能让MBR支持超过2TB的磁盘。

比如若每个扇区大小是4KB的话,那么理论上MBR支持的最大容量就变成了 2TB*8=16TB 大小了.

此外,硬盘内部记录了每个扇区错误校验所需要的信息,增加扇区的大小也就降低了这类信息的占比,从而增大了数据的空间使用率。

然而由于操作系统的设备驱动很可能是按照之前512个字节来设计的,因此就可能需要通过硬盘中的控制器来从逻辑上模拟512个字节扇区的运作方式。 从服务器的角度来看扇区的大小依然是512个字节,但实际上数据读取和写入都是在4KB扇区上进行的。 也就是说,即使服务器要求读取和写入的是512个字节,但实际上也是会对整个4KB扇区进行操作。

要使用4KB扇区的磁盘,需要注意:

  1. 分区的开始位置和结束位置需要与4KB扇区的起始边界对齐,也就是说在分配分区扇区数时,必须是8的倍数
  2. 设置文件系统的块大小为4KB大小