分区表格式
参考《鸟哥的Linux私房菜基础学习篇》
MBR
Master Boot Record,主要开机记录区,主要存放在磁盘的第一个扇区,这个扇区大小通常是512Bytes,主要存放两种数据:
-
主要开机记录区(MBR):可以安装启动引导程序,大小为446Bytes
启动引导程序功能:
-
加载操作系统内核
-
存在多系统时,在开机的时候提供一个菜单,让用户选择启动哪个系统
-
调用其他的启动引导程序
注:双系统一般安装在磁盘的不同的分区中,每个分区会分出一个扇区,称作引导扇区(Boot Sector),在这也可以安装启动引导程序
-
-
分区表(Partition Table):记录分区信息,大小为64Bytes,即最多能有四组分区,分区类型包含主分区和扩展分区;系统写入数据到磁盘时会查看分区信息,这样才能针对指定分区进行数据处理
每个分区记录分别使用32bits(4Bytes)来记载开始/结束的扇区号码;即单一分区的最大容量限制为:232 * 512Bytes = 231 *
1KBytes = 2TB,硬盘厂商按照1000进位则大为2199023255552Bytes,即2.199TB,约为2.2TB,即最多2.2TB
注:剩余两个字节为55AA结束标志符
主引导记录:
偏移地址 | 字节数 | 内容 |
---|---|---|
00 | 446 | 启动代码 |
446 | 16 | 分区项1 |
462 | 16 | 分区项2 |
478 | 16 | 分区项3 |
494 | 16 | 分区项4 |
510 | 2 | 结束标志55AA |
分区记录信息:
偏移地址 | 字节数 | 内容 |
---|---|---|
0 | 1 | 分区状态,0:inactive,1:active |
1 | 3 | 分区起始地址(H/S/C,柱面/扇区/磁头号) |
4 | 1 | 文件系统类型,FAT32:0x0B,0x0C,扩展分区:0x0F,0x05,NTFS:0x07 |
5 | 3 | 分区结束地址(H/S/C,柱面/扇区/磁头号) |
8 | 4 | 分区起始逻辑扇区,逻辑扇区编号 |
C | 4 | 分区占有的总扇区数 |
分区的意义
- 保证数据安全:每个分区的数据时分开的,如果要重装系统,可以将重要数据拷贝到其他分区,避免数据丢失
- 系统性能:每个分区的数据都集中在磁盘某个柱面的区段中,这样在操作这个分区的数据时,磁盘只会在这个区段查找或写入数据
使用扩展分区在磁盘上创建4个以上分区
-
使用扩展分区创建4个以上分区,可以使P + P + P + E,分配完P的空间后,磁盘剩余空间全部分给E,在扩展分区中创建逻辑分区
-
设备文件名/dev/sda1-4是预留给主分区和扩展分区的,逻辑分区从/dev/sda5开始
主分区、扩展分区、逻辑分区定义
- 扩展分区只能存在一个(系统限制)
- 扩展分区使用额外的扇区来记录逻辑分区的分区信息,本身不能进行格式化
- 实际上扩展分区并不是只占一个区块,而是使用每个分区的最前面几个扇区来记载分区信息
- 逻辑分区是由扩展分区切割出来的分区
- 主分区和逻辑分区可以存取数据,可以被格式化
- 逻辑分区的数量限制在不用系统是不一样的
存在问题
- 每组分区表仅有16Bytes,可以记录的信息很少,操作系统无法抓取到2.2TB以上的磁盘
- MBR仅有一个区块,被破坏后,导致磁盘不可用且很难恢复
- MBR存放启动引导程序仅有446Bytes,无法容纳较大的程序
GPT
过去一个扇区是512Bytes,但是目前已经有4k的扇区,所有为了兼容所有磁盘,使用逻辑区块位址(Logical Block Address, LBA)来处理扇区的定义,GPT将磁盘所有区块以LBA来规划。
与MBR不同,GPT使用34个LBA区块来记录分区信息,其中第一个扇区仍用作MBR,之后才是GPT的头,并且还会使用最后33个LBA来做一个分区表的备份,避免分区表损坏的风险
LBA 0
与传统的MBR兼容,也被称为保护性MBR,一部分就是446Bytes的开机引导程序,第二部分就是分区表数,这里只放了一个特殊标志的分区,使得一些不认识GPT的磁盘管理程序,不会对这个磁盘继续操作,而不是将其当成一个未分区的磁盘;除非用户需要处理这个磁盘,否则该管理工具不能修改分区信息,达到保护磁盘的作用
LBA 1
GPT分区表头,记录了分区表本身的位置和大小,以及备份分区表的位置,还储存着它本身和分区表的CRC32校验;
固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错了,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。所以GPT硬盘的分区表不可以直接使用16进制编辑器修改
分区表头:
起始字节 | 长度 | 内容 |
---|---|---|
0 | 8字节 | 签名(“EFI PART”) |
8 | 4字节 | 修订 |
12 | 4字节 | 分区表头的大小 |
16 | 4字节 | 分区表头(第0-91字节)的CRC32校验,在计算时,把这个字段作为0处理,需要计算出分区串行的CRC32校验后再计算本字段 |
20 | 4字节 | 保留,必须是 0 |
24 | 8字节 | 当前LBA(这个分区表头的位置) |
32 | 8字节 | 备份LBA(另一个分区表头的位置) |
40 | 8字节 | 第一个可用于分区的LBA(主分区表的最后一个LBA + 1) |
48 | 8字节 | 最后一个可用于分区的LBA(备份分区表的第一个LBA − 1) |
56 | 16字节 | 硬盘GUID(在类UNIX系统中也叫UUID) |
72 | 8字节 | 分区表项的起始LBA(在主分区表中是2) |
80 | 4字节 | 分区表项的数量 |
84 | 4字节 | 一个分区表项的大小(通常是128) |
88 | 4字节 | 分区串行的CRC32校验 |
92 | * | 保留,剩余的字节必须是0(对于512字节LBA的硬盘即是420个字节) |
LBA 2-33
存放分区记录信息,每个LBA可以存放4个分区记录信息,所以默认情况下可以存放4 * 32 = 128个分区记录信息;
每个分区记录分别使用64bits(8Bytes)来记载开始/结束的扇区号码;即单一分区的最大容量限制为:264 * 512Bytes = 263 *
1KBytes = 233*TB = 8 ZB;1ZB = 230TB
分区记录信息:
起始字节 | 长度 | 内容 |
---|---|---|
0 | 16字节 | 分区类型GUID |
16 | 16字节 | 分区GUID |
32 | 8字节 | 起始LBA(小端格式) |
40 | 8字节 | 末尾LBA |
48 | 8字节 | 属性标签(如:60表示"只读") |
56 | 72字节 | 分区名(可以包括36个UTF-16(小端格式)字符) |