MBR与GPT分区表的简单说明
MBR分区表说明
在传统的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分区表说明
为了解决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 | 移动分区 |
显示当前分区表状态 | |
quit | 退出 |
resize | 改变分区大小 |
rm | 删除分区 |
select | 选择要分区的设备 |
set | 设置各种标志,包括引导标志 |
4KB扇区的磁盘
为了突破传统MBR最大只支持2TB磁盘的限制,除了GPT外,增大磁盘扇区的大小也能让MBR支持超过2TB的磁盘。
比如若每个扇区大小是4KB的话,那么理论上MBR支持的最大容量就变成了 2TB*8=16TB
大小了.
此外,硬盘内部记录了每个扇区错误校验所需要的信息,增加扇区的大小也就降低了这类信息的占比,从而增大了数据的空间使用率。
然而由于操作系统的设备驱动很可能是按照之前512个字节来设计的,因此就可能需要通过硬盘中的控制器来从逻辑上模拟512个字节扇区的运作方式。 从服务器的角度来看扇区的大小依然是512个字节,但实际上数据读取和写入都是在4KB扇区上进行的。 也就是说,即使服务器要求读取和写入的是512个字节,但实际上也是会对整个4KB扇区进行操作。
要使用4KB扇区的磁盘,需要注意:
- 分区的开始位置和结束位置需要与4KB扇区的起始边界对齐,也就是说在分配分区扇区数时,必须是8的倍数
- 设置文件系统的块大小为4KB大小