在磁盘中曾经提到,磁盘出厂都会进行一次低层格式化,从而确定磁盘的磁道分区划分,在磁盘的低层格式化之后,磁盘的扇区建立起来,扇区就是磁盘进行数据存储管理的一个基本单位。

而分区则是对扇区进行组织管理的一种方式,它将扇区分成不同的组,每个组包含一定的扇区,每个称为一个分区。目前比较令人熟知的分区方式有两种:MBR分区和GPT分区。

MBR(Master Boot Record)分区

MBR分区是随着IBM PC DOS时代而来的,与他同时诞生的还有传统BIOS,它所诞生的那个时代硬盘容量都很小,所以MBR分区是根据当时的硬盘容量来进行设计的,正是因为如此,随着硬盘容量越来越大,它的劣势逐渐显现出来:只能创建4个主分区,通过4个主分区只能管理2TiB的硬盘空间。

1、MBR分区格式

上图说明:上图中的partition3 与 Extened之间采用括号表示的意思:这一块要不就是Partition3,包含黄色区域开始到下一个黄色区域之间的部分;这一块要不就是Extened Partition,包含蓝色区域开始到下一个黄色区域之间的部分。

另外,上图中的黄色是Partition Boot Record(又叫partition boot sector,或者volume boot record,VBR,或者volume partition sector)因为文件系统或者操作系统不同而有所不同,这个区域是在IBM的个人计算机的操作系统中引入的,也就是DOS时代。后来微软出的操作系统都兼容了这个VBR,不管是FAT12,FAT16,FAT32还是NTFS,这些文件系统都是兼容VBR这个区域的,并且保留了这个区域,这个区域存放着文件系统的一些信息。现在大容量硬盘都采用GPT分区格式,这些文件系统依然保留了VBR这个区域。

对于linux来说,不论是MBR还是GPT分区,ext4文件系统都有一个引导块的区域,这个区域就是类似于VBR的一个区域,称为引导块,group 0 padding。

(关于ext4文件系统概述 - 知乎)

(https://blog.csdn.net/lengye7/article/details/122904639  ext4备份地址)

主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(0柱面,0磁头,1扇区)或者LBA寻址的0号扇区。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。

标准的MBR扇区结构如下:

code area:代码区,引导代码存放的区域,BIOS加电自检完成之后,读入MBR,然后执行这个区域的代码。

Disk signature:硬盘标志用来区分硬盘,当有多块硬盘的时候,方便BIOS通过匹配这个字段来确定自己加载的是否是正确的MBR。

Table of primary patitions:分区表,16字节一个表项,BIOS或者操作系统从这里找到分区的入口。总共可以有4个分区,可以是4个主分区,或者3个主分区+1个扩展分区。

分区表项格式:

Patition Flag:1字节,0x80:bootable,活动分区,启动分区,0x00:not bootable,非活动分区,非启动分区。这个标志用来指导Boot Loader用来加载具体分区的Partition Boot Sector,当一个分区的标志位0x80的时候,Boot Loader后续就会加载该分区的Partition Boot Sector。4个分区中,最好只有一个0x80标志,即引导分区,或者叫启动分区。

Start CHS:3字节,早期用来标记分区起始扇区的位置。

Partition Type:1字节,分区类型,具体是什么分区需另外查看资料。

End CHS:3字节,早期用来标记结束扇区的位置。

Start LBA:4字节,分区开始的第一个LBA扇区号,现在所使用的扇区起始位置的标记方式。

Size:4字节,分区所占有的扇区数量。

CHS方式是早期硬盘所使用的标记方式,其所能支持的硬盘不能超过7.875GiB。

为了能够支持更大的硬盘,于是采用一种过渡方式,即开始使用LBA和Size方式来标记分区的起始和结束。

但是即使采用了LBA与Size方式,MBR方式所支持的硬盘也不能超过2TiB。

下面来解释原因:

1、由于size为4字节,则一个分区最多可以有2的32次方个扇区,假设一个扇区是512字节,则一个分区最多不能超过2TiB。

那么一个分区最多可以2TiB,4个分区岂不是可以达到支持8TiB?

2、Start LBA的限制,由于Start LBA采用4字节,其所能寻址的扇区空间为2的32次方,假设第一个分区为2TiB,那么第二个分区的Start LBA地址就必然超出4字节的表示范围,于是第二个分区的Start LBA就无法表示了,就自然而然不存在第二个分区了。同理,也就不存在第三个和第四个分区了。

因此,MBR无法支持超过2TiB的硬盘。

但是如果想使用BIOS引导操作系统又要使用2TiB以上的硬盘那该怎么办呢?

最优方案:

假设该操作系统支持GPT分区方案,那么就可以使用两块硬盘,操作系统所在的硬盘采用MBR分区,然后另外一块容量超过2TiB的硬盘采用GPT方式。

其他方案:

当然,也有整骚操作的,把MBR分区和GPT分区整合在一块容量超过2TiB的硬盘上的,这个最好不要做,万一哪个软件不支持GPT分区的,操作磁盘的时候把GPT分区给破坏了就好玩了。

MBR分区只能支持4个主分区,那如果想要更多的分区怎么办?

MBR也能够创建一个扩展分区,在扩展分区中可以创建很多的逻辑分区,与主分区相比,逻辑分区不能作为引导分区或者说启动分区或者说活动分区。

扩展分区示意图:

扩展分区的引导记录(Extended Boot Record,EBR)

每个逻辑分区前面都是EBR,用来描述当前逻辑分许的起始位置以及大小,同时标记当前分区为一个逻辑分区,也给出下一个逻辑分区的起始位置。

扩展分区引导记录格式

EBR的格式与MBR没有太大的区别,区别在于各个字段的用途上。

对于EBR来说,一般不使用前面446字节,同时只使用分区表的第一和第二表项,以及后面的标志0xAA,0x55。

其中第一表项用来记录当前逻辑分区的信息(分区起始位置,逻辑分区大小),第二表项用来记录下一个逻辑分区的信息(分区起始位置,逻辑分区大小)。

EBR的分区表的表项的格式

Boot indicator:1字节,永远都是0x00。

Partition type:有特定的字段,0x05(CHS寻址模式),0x0F(LBA寻址模式),但是不同的操作系统可能有所不同。

Start LBA:这与MBR的分区表项有所不同,这里的值是相对于逻辑分区开始的扇区号的。

其他的值没有说明与MBR一致。

逻辑分区的典型示意图:

上图中特意在每个逻辑分区之前隔开19个扇区,目的是为了更好的说明,逻辑分区的起始扇区号的值是相对于分区的EBR的开始扇区号的,例如第一个EBR中,给出的值为20,于是第一个逻辑分区的开始位置就是相对于5000的第20个扇区开始的,逻辑扇区号为5020。

2、MBR分区的硬盘的BIOS的简单引导过程

GPT分区

由于MBR分区不能支持2TiB以上的硬盘,于是GPT被开发出来了,并作为了UEFI标准的一部分,它能够支持的分区数最少是128个(虽然最少这么多,实际上windows就只支持128个,具体支持多少个,取决于具体实现。),所能支持的硬盘容量最高可以达到8388608 PiB。

因此,GPT可以被认为支持无限分区,无限容量。

GPT:GUID partition table,全局唯一标识符分区表。

GUID:global unique identifier,全局唯一标识符。

1、GPT分区格式

#分区的整体格式

GPT整体的格式

上图只是一个示意图,为了说明GPT的基本格式,这里的128个分区是一种说明。

LBA0:这里仍然是MBR,只不过在GPT中,MBR(主引导记录)中只存在一个分区,那就是标识类型为EE分区,即保护性分区,这个是为了告诉一些底层操作软件,如果这些软件无法识别GPT,就不要去操作,从而保护GPT分区不被破坏。

LBA1:这里存放GPT的主分区头(Primary GPT Header)。

LBA2-LBA33:一共32个扇区,我们称之为“主分区节点”。

LBA34-LBA-34:正常的GPT分区区域,文件系统(如FAT,NTFS,EXT4等)就是构建在这里面。

LBA-1:这里是GPT分区头的备份。

LBA-2-LBA-33:这里是备份的主分区节点。

#LBA1的GPT主分区头格式:

分区表头的格式

上图中,我们可以看到:

硬盘GUID:这个用于区分硬盘设备,唯一标识。

分区表项的数量:这个是4字节,32bit,这说明GPT分区的数量可以高达2的32次方个。

分区表项的大小: 一般就是128字节了。

CRC32校验:用于整个分区头的数据校验,如果出错,就读入备份的分区表头来恢复,如果备份的分区表头也出错了,则报错。

其他的字段就如图中所说的那样。

#分区表项的格式

分区表项的格式
​​​​​

分区类型GUID:这个是非常重要的一个字段,通过这个字段区分不同的分区类型,例如EFI分区就有一个特定的GUID。

分区GUID:这个要和分区类型GUID进行区分,这个是用来分区的唯一标识,不同分区即使类型相同,分区GUID也不相同。

分区名:这是与MBR的重要区别,MBR没有分区名,72个字节,可以具备72个ASCII字符。

属性标签:这是一个很有意思的字段,可以直接在这里指定分区的属性,例如,只读,隐藏等属性。一般EFI分区(ESP分区),都会设置其属性为隐藏属性。

更多内容可参考EFI标准文档。

2、UEFI在GPT分区下的启动过程

传统BIOS不支持GPT分区启动,如果使用GPT分区,则只能使用UEFI启动。

UEFI启动后,进入了DXE阶段,就开始加载设备驱动,然后UEFI就会有设备列表了。

对于其中的磁盘,UEFI会加载对应的驱动解析其中的分区表(GPT和MBR,没错UEFI可以认识MBR分区)。然后UEFI就会有所有分区的列表了。然后UEFI就会用内置的文件系统驱动,解析每个分区。然后UEFI就会认识分区里的文件。

进入了BDS阶段,然后根据启动项的顺序转到相应的设备,启动项是BDS阶段从NVRAM中读入了,可以通过工具设置NVRAM中的内容,比如启动项的顺序就可以改变。

在启动操作系统的阶段,根据设置的启动项顺序,转到相应设备(仅限GPT设备,如果启动传统MBR设备,则需要打开CSM支持)的引导项,引导并进入操作系统。

启动项分为两种:

  • 文件启动项:大约记录的是某个磁盘的某个分区的某个路径下的某个文件。对于文件启动项,固件会直接加载这个EFI文件,并执行。类似于DOS下你敲了个win.com就执行了Windows 3.2/95/98的启动。文件不存在则失败。
  • 设备启动项:大约记录的就是“某个U盘”、“某个硬盘”。(此处只讨论U盘、硬盘)对于设备启动项,UEFI标准规定了默认的路径\EFI\Boot\bootX64.efi。UEFI会加载磁盘上的这个文件。文件不存在则失败。

作为UEFI标准里,钦定的文件系统,FAT32.efi是每个主板都会带的。所有UEFI的主板都认识FAT32分区。

对于windows来说:

通常情况:主板UEFI初始化,然后找到了默认启动项Windows Boot Manager(windows会直接更改默认的启动项,改为EFI\microsoft路劲下的启动文件)。里面写了bootmgfw.efi的位置。固件加载bootmgfw.efibootmgfw.efi根据BCD启动项(注意:这里是指操作系统启动项,不是UEFI的设备或文件启动项,注意区别。)存储,找到装Windows的磁盘的具体分区,加载其中的WinLoad.efi。由WinLoad.efi完成剩下的启动工作。

其中的虚线,跟上面的一样,意思是,Windows启动盘和EFI启动盘,可以是一个硬盘,也可以是不同的硬盘。所以对于UEFI来说,启动盘是bootmgfw.efi所在的那个盘。

同一个硬盘上, ESP分区可以具备两个吗?

ESP分区当然可具备两个或者多个,但是UEFI启动阶段,只会从一个启动项加载,也就是说,即使有多个ESP,也只有一个ESP被UEFI所加载。

如果有多个系统需要引导,比较好的做法是在一块硬盘上分配一个大一点的ESP,然后将各个操作系统的引导文件都写入到这个ESP分区中。

然后启动时候:

1、从UEFI的启动项中,自己手动选择需要加载的系统启动项。这是方法一。

2、选择一个能够从自己切换到其他系统启动项的引导程序作为UEFI的默认启动项。例如,Grub就是这样一个引导程序。这是方法二,方法二显然更好。

已经在虚拟机中测试过了。

磁盘分区方式对比(MBR与GPT)相关推荐

  1. linux中mbr最大多少分区,Linux与磁盘分区介绍(MBR,GPT)

    上一章: 接着上一章的内容,将GPT模式 GPT模式相比于MBR模式不管是兼容性,安全性,支持面,都要好很多,GPT模式中没有了所谓的主分区.扩展分区和逻辑分区,GPT模式都是主分区,与 MBR 仅使 ...

  2. linux磁盘分区dos分区与gpt,Linux与磁盘分区介绍(MBR,GPT)

    ⼀.简介 在Linux系统中,每个设备都被当成⼀个⽂件来对待 ⼆.外设 SCSI/SATA/USB硬盘机.USB闪存盘 :/dev/sd[a-p] VirtI/O界⾯ :/dev/vd[a-p] (⽤ ...

  3. linux 磁盘 ssd 机械硬盘分区,linux(centos7)上的硬盘种类、结构、磁盘分区方式、分区结构...

    硬盘 硬盘 机械硬盘.固态硬盘 机械硬盘(HDD) Hard Disk Drive,即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成.机械硬盘 ...

  4. 磁盘分区方式——MBR与GPT之学习笔记

    大数据时代,硬盘作为数据存储工具,是生产生活中必不可少的工具.在数据日益繁多的情况下,如何让对数据进行有效管理变得愈发重要.磁盘分区,是对数据进行有效管理的重要手段之一. 磁盘分区,就是使用分区编辑器 ...

  5. C语言读取磁盘分区信息(MBR、DPT、EBR)

    文章目录 简介 使用的函数 1.CreateFile()函数打开设备 2.DeviceIoControl()函数返回磁盘设备信息 3.SetFilePointer()函数设置读取磁盘信息位置 4.Re ...

  6. 为什么磁盘分区的时候,第一个分区前面总有一段空间(63或者2048个扇区)

    背景 不论是MBR分区还是GPT分区,第一个分区的前面总有一段空闲的空间(除了MBR之外的空间),这段空间不属于任何分区. 这一段空间的意义 早期的操作系统对应的分区工具在分区的时候,其第一个分区总是 ...

  7. Linux进阶篇--磁盘分区管理

    Linux进阶篇–磁盘分区管理 11.1 磁盘基础介绍 设备文件 * I/O Ports:I/O设备地址 * 设备类型:   块设备:block,存取单位"块",来自于磁盘   字 ...

  8. Centos7 磁盘分区与挂载步骤详解

    由于目前磁盘分区主要有 MBR 以及 GPT 两种格式,这两种格式所使用的分区工具不太一样! MBR => fdisk,parted GPT => gdisk,parted 查看文件系统属 ...

  9. linux中的如何进行磁盘分区

    本文主要内容 前言 一.linux中的各硬件设备的文件名 0.预备知识 1. 磁盘分区 2. linux支持的文件系统 1.磁盘分区 1.对硬盘进行分区 1. 分区 1. 使用fdisk进行分区 2. ...

  10. CentOS7磁盘分区及文件系统

    本文首发于我的个人网站: https://hewanyue.com/ 本文作者: Hechao 本文链接: https://hewanyue.com/blog/2bae1e5c.html   一般来说 ...

最新文章

  1. 成功解决coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to inc
  2. ASP.NET中实现页面间的参数传递 QueryString\Application\Session\Cookie
  3. javaio流层次结构_流的多层次分组
  4. linux 思维导图
  5. java 继承 extends_java中的继承 (extends) 详解
  6. idea编译器没有tomcat的选项解决方案
  7. 如何跨越线程调用窗体控件?(3)
  8. SpringBoot整合Redis
  9. 全国计算机二级等级考试评卷,全国计算机等级c语言考试评卷老师是如何阅卷的...
  10. 阿里巴巴29个屌炸天的开源项目,你用过几个?
  11. 观海智能观海舆情大数据SaaS云平台
  12. 大小写字母转换 (15分)
  13. ms721调试总结及光电传感器板测试总结
  14. 双十一买啥最划算,失眠助眠好物推荐清单
  15. python读文本并写入另一个文本文件中怎么做_使用文本Python将文件中的文本写入另一个文件...
  16. 微软亚洲研究院的“三好”实习生
  17. PCB高速信号布线技巧
  18. 【原】通俗说法所谓数码相机的“动态像素”和“静态像素”背后的故事
  19. Python+Vue计算机毕业设计停车场管理系统8f46a(源码+程序+LW+部署)
  20. 嘎吱作响Creaks for mac(解谜游戏)中文版支持m1

热门文章

  1. 电子技术基础(三)__第5章 之逻辑函数的卡诺图化简方法
  2. android 启动第三方APP的方式
  3. IDM 6.40.11.2 弹窗的解决思路
  4. 论游戏电脑CPU和GPU之搭配
  5. 分享一些做课题调查的方法
  6. 计算机四级数据库分值分布,计算机四级数据库工程师考试成绩查询注意事项
  7. 计算机桌面图片打不开显示内存不足,电脑上的windows图片查看器提示内存不足如何解决...
  8. ORA-00932: 数据类型不一致: 应为 -,但却获得 -
  9. CodeForces Cude In
  10. 科普下Tier1,Tier2,Tier3,Tier4 T1, T2, T3, T4