MBR和GPT分区格式整理

简单地说,硬盘分区是就使用分区编辑器(partition editor)将一个硬盘上划分几个独立的逻辑部分,盘片一旦划分成数个分区,不同类的目录与文件可以存储进不同的分区。越多分区,也就有更多不同的地方,可以将文件的性质区分得更细,按照更为细分的性质,存储在不同的地方以管理文件。

机械硬盘原理

机械硬盘由坚硬金属材料制成的涂以磁性介质的盘片,盘片两面称为盘面或扇面,都可以记录信息,由磁头对盘面进行操作(如果你有坏的硬盘,可以动手拆开看。嗯?为什么用坏的?用好的可能费钱……)一般用磁头号区分。结构特性决定了机械硬盘如果受到剧烈冲击(摔在地上或是勤奋的你想拆开学习),磁头与盘面可能产生的哪怕是轻微撞击都有可能报废。

继续讲原理:假设磁头不动,硬盘旋转,那么磁头就会在磁盘表面画出一个圆形轨迹并将之磁化,数据就保存在这些磁化区中,称之为磁道,将每个磁道分段,一个弧段就是一个扇区。一个硬盘可以包含多个扇面,扇面同轴重叠放置,每个盘面磁道数相同,具有相同周长的磁道所形成的圆柱称之为柱面,柱面数与磁道数相等。如下图

图片1

了解了这些,我们就可以对最初的硬盘地址管理方式作一个原理层面的了解:

最初的寻址方式称为CHS,在LBA(Logical Block Address)概念诞生之前,由他负责管理磁盘地址。所谓CHS即柱面(cylinder),磁头(header),扇区(sector),通过这三个变量描述磁盘地址,需要明白的是,这里表示的已不是物理地址而是逻辑地址了。这种方法也称作是LARGE寻址方式。该方法下:

硬盘容量=磁头数×柱面数×扇区数×扇区大小(一般为512byte)。

后来,人们通过为每个扇区分配逻辑地址,以扇区为单位进行寻址,也就有了LBA寻址方式。但是为了保持与CHS模式的兼容,通过逻辑变换算法,可以转换为磁头/柱面/扇区三种参数来表示,和 LARGE寻址模式一样,这里的地址也是逻辑地址了。(固态硬盘的存储原理虽然与机械硬盘不同,采用的是flash存储,但仍然使用LBA进行管理,此处不再详述。)

科普到这里,我们可以试图去理解MBR分区了。现在我们来看看MBR分区的技术原理。

MBR原理

MBR:Master Boot Record,主分区引导记录。最早在1983年在IBM PC DOS 2.0中提出。前面说过,每个扇区/区块都被分配了一个逻辑块地址,即LBA,而引导扇区则是每个分区的第一扇区,而主引导扇区则是整个硬盘的第一扇区(主分区的第一个扇区)。MBR就保存在主引导扇区中。另外,这个扇区里还包含了硬盘分区表DPT(Disk Partition Table),和结束标志字(Magic number)。扇区总计512字节,MBR占446字节(0000H - 01BDH),DPT占据64个字节(01BEH - 01FDH),最后的magic number占2字节(01FEH – 01FFH)。

图片二

现在,我们来看一个MBR记录的实例:

00000000 fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |................|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..|
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001b0 00 00 00 00 00 00 00 00 b3 b0 6d b3 00 00 00 20 |..........m.... |
000001c0 21 00 83 66 25 01 00 08 00 00 00 50 00 00 00 66 |!..f%......P...f|
000001d0 26 01 83 d2 0f 03 00 58 00 00 00 98 00 00 00 d2 |&......X........|
000001e0 10 03 83 f0 27 09 00 f0 00 00 00 80 01 00 00 f0 |....'...........|
000001f0 28 09 05 50 bf 01 00 70 02 00 b0 d4 ef 1b 55 aa |(..P...p......U.|
00000200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000800

对应的fdisk -l信息

Disk /dev/sdb: 223.6 GiB, 240057409536 bytes, 468862128 sectors
Disk model: KINGSTON SA400S3
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb36db0b3   
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 22527 20480 10M 83 Linux
/dev/sdb2 22528 61439 38912 19M 83 Linux
/dev/sdb3 61440 159743 98304 48M 83 Linux
/dev/sdb4 159744 468862127 468702384 223.5G 5 Extended

MBR分区表占64字节,最多可以分4个主分区,每个分区表信息占16个字节,以第一个分区表为例进行解释。

地址

含义

0x1be 引导提示符
0x1bf 开始磁头
0x1c0 0x1c1 开始扇区6bit   开始柱面10bit
0x1c2 分区类型
0x1c3 结束磁头
0x1c5 0x1c4 结束扇区6bit   结束柱面
0x1c6——0x1c9 分区开始扇区
0x1ca——0x1cd 此分区占用扇区总数

使用中最关心的是分区开始的扇区,以红字标出。
0x1be:00 20 21 00 83 66 25 01 00 08 00 00 00 50 00 00从0x1be开始是分区信息,单独摘抄出来

开始扇区数:0x800    扇区总数:0x5000      分配空间:10MB

0x1ce:00 66 26 01 83 d2 0f 03 00 58 00 00 00 98 00 00

开始扇区数:0x5800    扇区总数:0x9800      分配空间:19MB

0x1de:00 d2 10 03 83 f0 27 09 00 f0 00 00 00 80 01 00

开始扇区数:0xf000    扇区总数:0x18000      分配空间:48MB

0x1ee:00 f0 28 09 05 50 bf 01 00 70 02 00 b0 d4 ef 1b

开始扇区数:0x27000    扇区总数:0x1befd4b0      分配空间:223.5G

由于MBR分区扇区总数最大4字节,16位,所以做多支持2T的硬盘。

 

GPT原理

GUID分区表(简称GPT,使用GUID分区表的磁盘称为GPT磁盘)是源自EFI标准的一种较新的磁盘分区表结构的标准。与目前普遍使用的主引导记录(MBR)分区方案相比,GPT提供了更加灵活的磁盘分区机制。它具有如下优点:

1、支持2TB以上的大硬盘。

2、每个磁盘的分区个数几乎没有限制(Windows系统最多只允许划分128个分区)。

3、分区大小几乎没有限制。又是一个“几乎”。因为它用64位的整数表示扇区号,即  = 18,446,744,073,709,551,616。

4、分区表自带备份。在磁盘的首尾部分分别保存了一份相同的分区表,其中一份被破坏后,可以通过另一份恢复;

5、循环冗余检验值针对关键数据结构而计算,提高了数据崩溃的检测几率;

6、GPT使用一个16字节的全局唯一标识符(GUID)值来标识分区类型,这使分区类型更不容易冲突;

GPT分区表的结构:

图片3

fdisk -l信息:

Disk /dev/sdb: 223.6 GiB, 240057409536 bytes, 468862128 sectors
Disk model: KINGSTON SA400S3
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F6A7DF32-3C2E-44FB-99AB-F7395A9F5DB2

Device Start End Sectors Size Type
/dev/sdb1 2048 100351 98304 48M Linux filesystem
/dev/sdb2 100352 294911 194560 95M Linux filesystem
/dev/sdb3 294912 1075199 780288 381M Linux filesystem
/dev/sdb4 1075200 468862094 467786895 223.1G Linux filesystem

分区头部信息:

00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001c0 02 00 ee ff ff ff 01 00 00 00 af 44 f2 1b 00 00 |...........D....|
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|

00000200 45 46 49 20 50 41 52 54 00 00 01 00 5c 00 00 00 |EFI PART....\...|
00000210 90 e4 e4 f8 00 00 00 00 01 00 00 00 00 00 00 00 |................|
00000220 af 44 f2 1b 00 00 00 00 22 00 00 00 00 00 00 00 |.D......".......|
00000230 8e 44 f2 1b 00 00 00 00 32 df a7 f6 2e 3c fb 44 |.D......2....<.D|
00000240 99 ab f7 39 5a 9f 5d b2 02 00 00 00 00 00 00 00 |...9Z.].........|
00000250 80 00 00 00 80 00 00 00 f3 b4 48 26 00 00 00 00 |..........H&....|
00000260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000400 af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 |.=....rG.y=i.G}.|
00000410 ef fd 0d 28 96 cb 45 cb 86 db 83 c6 43 cb 08 a4 |...(..E.....C...|
00000420 00 08 00 00 00 00 00 00 ff 87 01 00 00 00 00 00 |................|
00000430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000480 af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 |.=....rG.y=i.G}.|
00000490 8d 16 11 f0 26 06 47 2c b6 87 77 69 1b 4b 49 a7 |....&.G,..wi.KI.|
000004a0 00 88 01 00 00 00 00 00 ff 7f 04 00 00 00 00 00 |................|
000004b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000500 af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 |.=....rG.y=i.G}.|
00000510 9d f6 3e 73 f2 c4 43 92 81 9e 8b a9 21 b1 c4 17 |..>s..C.....!...|
00000520 00 80 04 00 00 00 00 00 ff 67 10 00 00 00 00 00 |.........g......|
00000530 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000580 af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 |.=....rG.y=i.G}.|
00000590 73 3f 20 7c 6a f1 41 64 a4 b4 52 b9 2f f6 b0 93 |s? |j.Ad..R./...|
000005a0 00 68 10 00 00 00 00 00 8e 44 f2 1b 00 00 00 00 |.h.......D......|
000005b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0000c800

每个LBA占一个扇区,512bytes

LBA0:在GPT分区表的最开头,处于兼容性考虑仍然存储了一份传统的MBR(LBA 0),这个MBR叫做保护性MBR(Protective MBR)。

LBA1:分区表头

起始字节

占用长度(bytes)

内容

0x0 8 签名("EFI PART")
0x8 4 修订
0xc 4 分区表头的大小
0x10 4 分区表头(92个字节)的CRC32校验,在计算时,先把这个字段写作0处理,然后计算出所有分区表项的CRC32校验后再计算这个CRC32
0x14 4 保留,必须是 0
0x18 8 当前LBA(这个分区表头的位置)
0x20 8 备份LBA(另一个分区表头的位置)
0x28 8 第一个可用于分区的扇区
0x30 8 最后一个可用于分区的扇区
0x38 16 硬盘GUID Disk identifier
0x48 8 分区表起始扇区LBA
0x50 4

分区表项的数量(windows是128,没有这么多也先占着空间)

0x54 4

一个分区表项的大小(通常是128)

0x58 4 分区表项的CRC32校验(计算的是所有分区表项的检验和即128*128字节)
0x5c 420 保留

LBA2——LBA34

00000400 af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 |.=....rG.y=i.G}.|
00000410 ef fd 0d 28 96 cb 45 cb 86 db 83 c6 43 cb 08 a4 |...(..E.....C...|
00000420 00 08 00 00 00 00 00 00 ff 87 01 00 00 00 00 00 |................|
00000430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|

简单解释:分区起始0x800 分区结束0x187ff 分区大小=48MB,以此类推

在GPT分区的磁盘上,最后的34个扇区也会保存LBA信息。

猜你喜欢

转载自blog.csdn.net/qq543716996/article/details/112986573