磁盘分区
1、传统的主板就是传统 BIOS,可在使用 MBR 分区表的硬盘(俗称 MBR磁盘,就是传统常用的模式)上安装32或64位操作系统。同时也支持使用 GUID 分区表的硬盘(俗称GPT磁盘),但该硬盘上不能安装操作系统。
2、新型主板使用 UEFI BIOS,只能在使用 GUID 分区表的硬盘(俗称GPT磁盘)上安装64位操作系统。同时也支持 MBR 磁盘,但该硬盘上不能安装操作系统。
因此,无论主板是传统 BIOS,还是 UEFI BIOS,都可以同时使用 GPT 磁盘与 MBR 磁盘,但要安装操作系统,就有明确的区别:传统 BIOS 的主板只能使用 MBR 磁盘安装操作系统;UEFI BIOS 的主板只能在 GPT 磁盘上安装64位操作系统。
二、MBR分区
主引导记录(Master BootRecord,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(0柱面,0磁头,1扇区)。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。如下:
对应到我电脑第一个扇区:
启动代码
主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。
硬盘分区表
硬盘分区表占据主引导扇区的64个字节(偏移01BEH–偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。具体每个字节的定义可以参见硬盘分区结构信息。
从主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘,最多只能识别4个主要分区(Primary partition)。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主要分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。
扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到。
Windows系统默认情况下,一般都是只划分一个主分区给系统,剩余的部分全部划入扩展分区。这里有下面几点需要注意:
在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。
在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。
在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内。如果硬盘太大则必须改用GPT。
三、GPT分区
全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(EFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。对于那些扇区为512字节的磁盘,MBR分区表不支持容量大于2.2TB(2.2×1012字节)[1]的分区,然而,一些硬盘制造商(诸如希捷和西部数据)注意到这个局限性,并且将他们的容量较大的磁盘升级到4KB的扇区,这意味着MBR的有效容量上限提升到16 TiB。这个看似“正确的”解决方案,在临时地降低人们对改进磁盘分配表的需求的同时,也给市场带来关于在有较大的块(block)的设备上从BIOS启动时,如何最佳的划分磁盘分区的困惑。GPT分配64bits给逻辑块地址,因而使得最大分区大小在264-1个扇区成为可能。对于每个扇区大小为512字节的磁盘,那意味着可以有9.4ZB(9.4×1021字节)或8 ZiB个512字节(9,444,732,965,739,290,426,880字节或18,446,744,073,709,551,615(264-1)个扇区×512(29)字节每扇区)[1][2]。
gpt分区表图:
GPT分区表的结构。此例中,每个逻辑块(LBA)为512字节,每个分区的记录为128字节。负数的LBA地址表示从最后的块开始倒数,−1表示最后一个块。
efi msr分区是什么?
ESP分区:EFI systempartition,该分区用于采用了EFI BIOS的电脑系统,用来启动操作系统。分区内存放引导管理程序、驱动程序、
系统维护工具等。如果电脑采用了EFI系统,或当前磁盘用于在EFI平台上启动操作系统,则应建议ESP分区。
MSR分区:即微软保留分区,是GPT磁盘上用于保留空间以备用的分区,例如在将磁盘转换为动态磁盘时需要使用这些分区空间。
GPT分区标志
GPT硬盘结构:
GPT硬盘在“保护MBR”450字节偏移处设置“EE”标志标明本硬盘为GPT
gpt分区在硬盘中的格式
分区表头的格式 | ||
起始字节 | 长度 | 内容 |
0 | 8字节 | 签名("EFI PART", 45 46 49 20 50 41 52 54) |
8 | 4字节 | 修订(在1.0版中,值是00 00 01 00) |
12 | 4字节 | 分区表头的大小(单位是字节,通常是92字节,即5C 00 00 00) |
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字节 | |
72 | 8字节 | 分区表项的起始LBA(在主分区表中是2) |
80 | 4字节 | 分区表项的数量 |
84 | 4字节 | 一个分区表项的大小(通常是128) |
88 | 4字节 | 分区序列的CRC32校验 |
92 | * | 保留,剩余的字节必须是0(对于512字节LBA的硬盘即是420个字节) |
主分区表和备份分区表的头分别位于硬盘的第二个扇区(LBA 1)以及硬盘的最后一个扇区。备份分区表头中的信息是关于备份分区表的。
分区表项(LBA 2–33)
GPT分区表使用简单而直接的方式表示分区。一个分区表项的前16字节是分区类型GUID。例如,EFI系统分区的GUID类型是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B}。接下来的16字节是该分区唯一的GUID(这个GUID指的是该分区本身,而之前的GUID指的是该分区的类型)。再接下来是分区起始和末尾的64位LBA编号,以及分区的名字和属性。
GPT分区表项的格式 | ||
起始字节 | 长度 | 内容 |
0 | 16字节 | 分区类型GUID |
16 | 16字节 | 分区GUID |
32 | 8字节 | 起始LBA(小端序) |
40 | 8字节 | 末尾LBA |
48 | 8字节 | 属性标签(如:60表示“只读”) |
56 | 72字节 | 分区名(可以包括36个UTF-16(小端序)字符) |
分区类型GUID
相关操作系统 | 分区类型 | |
(None) | 未使用 | 00000000-0000-0000-0000-000000000000 |
MBR分区表 | 024DEE41-33E7-11D3-9D69-0008C781F39F | |
C12A7328-F81F-11D2-BA4B-00A0C93EC93B | ||
21686148-6449-6E6F-744E-656564454649 | ||
微软保留分区 | E3C9E316-0B5C-4DB8-817D-F92DF00215AE | |
基本数据分区[2] | EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 | |
逻辑软盘管理工具元数据分区 | 5808C8AA-7E8F-42E0-85D2-E1E90434CFB3 | |
逻辑软盘管理工具数据分区 | AF9B60A0-1431-4F62-BC68-3311714A69AD | |
Windows恢复环境 | DE94BBA4-06D1-4D40-A16A-BFD50179D6AC | |
IBM通用并行文件系统(GPFS)分区 | 37AFFC90-EF7D-4e96-91C3-2D7AE055B174 | |
数据分区 | 75894C1E-3AEB-11D3-B7C1-7B03A0000000 | |
服务分区 | E2A1E728-32E3-11D6-A682-7B03A0000000 | |
数据分区[2] | EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 | |
RAID分区 | A19D880F-05FC-4D3B-A006-743F0F84911E | |
0657FD6D-A4AB-43C4-84E5-0933C84B4F4F | ||
逻辑卷管理员(LVM)分区 | E6D6D379-F507-44C2-A23C-238F2A3DF928 | |
保留 | 8DA63339-0007-60C0-C436-083AC8230908 | |
启动分区 | 83BD6B9D-7F41-11DC-BE0B-001560B84F0F | |
数据分区 | 516E7CB4-6ECF-11D6-8FF8-00022D09712B | |
交换分区 | 516E7CB5-6ECF-11D6-8FF8-00022D09712B | |
UFS分区 | 516E7CB6-6ECF-11D6-8FF8-00022D09712B | |
516E7CB8-6ECF-11D6-8FF8-00022D09712B | ||
ZFS分区 | 516E7CBA-6ECF-11D6-8FF8-00022D09712B | |
HFS(HFS+)分区 | 48465300-0000-11AA-AA11-00306543ECAC | |
55465300-0000-11AA-AA11-00306543ECAC | ||
6A898CC3-1DD2-11B2-99A6-080020736631 | ||
苹果RAID分区 | 52414944-0000-11AA-AA11-00306543ECAC | |
苹果RAID分区,下线 | 52414944-5F4F-11AA-AA11-00306543ECAC | |
苹果启动分区 | 426F6F74-0000-11AA-AA11-00306543ECAC | |
Apple Label | 4C616265-6C00-11AA-AA11-00306543ECAC | |
Apple TV恢复分区 | 5265636F-7665-11AA-AA11-00306543ECAC | |
启动分区 | 6A82CB45-1DD2-11B2-99A6-080020736631 | |
根分区 | 6A85CF4D-1DD2-11B2-99A6-080020736631 | |
交换分区 | 6A87C46F-1DD2-11B2-99A6-080020736631 | |
备份分区 | 6A8B642B-1DD2-11B2-99A6-080020736631 | |
/usr分区[3] | 6A898CC3-1DD2-11B2-99A6-080020736631 | |
/var分区 | 6A8EF2E9-1DD2-11B2-99A6-080020736631 | |
/home分区 | 6A90BA39-1DD2-11B2-99A6-080020736631 | |
备用扇区 | 6A9283A5-1DD2-11B2-99A6-080020736631 | |
保留分区 | 6A945A3B-1DD2-11B2-99A6-080020736631 | |
6A9630D1-1DD2-11B2-99A6-080020736631 | ||
6A980767-1DD2-11B2-99A6-080020736631 | ||
6A96237F-1DD2-11B2-99A6-080020736631 | ||
6A8D2AC7-1DD2-11B2-99A6-080020736631 | ||
交换分区 | 49F48D32-B10E-11DC-B99B-0019D1879648 | |
FFS分区 | 49F48D5A-B10E-11DC-B99B-0019D1879648 | |
LFS分区 | 49F48D82-B10E-11DC-B99B-0019D1879648 | |
RAID分区 | 49F48DAA-B10E-11DC-B99B-0019D1879648 | |
concatenated分区 | 2DB519C4-B10F-11DC-B99B-0019D1879648 | |
加密分区 | 2DB519EC-B10F-11DC-B99B-0019D1879648 |
^本表中的GUID使用小端序表示。例如,EFI系统分区的GUID在这里写成C12A7328-F81F-11D2-BA4B-00A0C93EC93B但实际上它对应的16字节的序列是28 732A C1 1F F8 D2 11 BA 4B 00 A0 C9 3E C9 3B——只有前3部分的字节序被交换了。
ab Linux和Windows的数据分区使用相同的GUID。
ab Solaris系统中/usr分区的GUID在Mac OS X上被用作普通的ZFS分区。
^具体定义见src/sys/sys/disklabel_gpt.h。NetBSD的GUID在单独定义之前曾经使用过FreeBSD的GUID。
四、MBR与GPT区别
1、mbr gpt 分区数量?
mbr:只支持4个主分区或三个主分区和一个扩展分区,扩展分区下可以有多个逻辑分区。扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到。
gpt:GPT,全局唯一标识分区表(GUIDPartition Table),与MBR最大4个分区表项的限制相比,GPT对分区数量没有限制,但
Windows最大仅支持128个GPT分区,GPT可管理硬盘大小达到了18EB。只有基于UEFI平台的主板才支持GPT分区引导启动。
2、mbr最大分区不超过2T,gpt分区可以超过2T。
五、注意事项
1、 磁盘控制相关函数,参考DeviceIoControl系列函数,参考下面这篇文章。
http://www.xuebuyuan.com/2221670.html
2、读写磁盘数据时,需要时扇区大小的整数倍,否则容易失败。默认扇区大小为512.
3、writefile写磁盘失败解决方法:
主要是在打开磁盘后,需要Lock磁盘,再读写数据,然后UnLock磁盘。
参考这篇文章
https://blog.****.net/dijkstar/article/details/50947652
4、自己写分区表,最后看分区对不对,使用DiskGenius磁盘分区查看。