前言

最近我的电脑 C 盘有点不够用了,想着给它扩容一下。碰巧遇上一些磁盘有关的术语,所以就想着研究研究,顺便回忆一下操作系统的知识

学习磁盘,最好建立一个层次模型

物理磁盘
Disk 0

├── 分区表
│   ├── GPT
│   └── MBR

├── Partition 分区
│   ├── EFI 分区
│   ├── Windows 分区
│   └── Recovery 分区

├── Volume 卷

├── 文件系统
│   ├── NTFS
│   ├── FAT32
│   ├── exFAT
│   └── ReFS

分区表

分区表是存储设备上的关键数据结构,用于定义存储空间的分割方式,使操作系统能够有效管理和使用硬盘。常见的分区表类型包括 MBR(主引导记录) 和 GPT(GUID 分区表),它们在功能、兼容性和性能上各有特点。

目前比较多的主要还是 MBR 和 GPT 分区表。但是总的来说,主要都是解决这个问题:在一块物理磁盘上,哪些扇区属于哪个分区?每个分区从哪里开始到哪里结束。

MBR 分区表

主引导记录(英语:Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。

在深入讨论主引导扇区内部结构的时候,有时也将其开头的 446 字节内容特指为“主引导记录”(MBR),其后是 4 个 16 字节的“磁盘分区表”(DPT),以及 2 字节的结束标志(55 AA)。

因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前 446 字节。

image.png|475

主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如 GNU GRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导

接下来的硬盘分区表占据 64 字节,总共可以对四个分许的信息进行描述(单个分区需要 16 字节的信息用来描述)。具体的每个字节的定义需要参考硬盘分区结构信息。

结束标志字是用来检验主引导记录是否有效的标志。

主引导扇区的读取流程大致如下:

  1. BIOS 执行内存地址为 FFFF:0000H 处的跳转指令,跳转到固化在 ROM 中的自检程序处,对系统硬件(包括内存)进行检查。
  2. 当 BIOS 检查到硬件正常并与 CMOS 中的设置相符后,按照 CMOS 中对启动设备的设置顺序检测可用的启动设备。BIOS 将相应启动设备的第一个扇区(也就是 MBR 扇区)读入内存地址为 0000:7C 00H 处。
  3. 检查 0000:01FEH - 0000:01FFH(MBR 的结束标志位)是否等于 55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示”NO ROM BASIC”然后死机。
  4. 当检测到有启动设备满足要求后,BIOS 将控制权交给相应启动设备。启动设备的 MBR 将自己复制到0000:0600H处,然后继续执行。
  5. 根据 MBR 中的引导代码启动引导程序。

CMOS与BIOS的关系

BIOS芯片是计算机上另一个重要的存储器,包含电脑开机时用于初始化硬件并加载操作系统的BIOS程序。之所以提到它,是因为CMOS芯片中保存着BIOS程序的设定值。

引导程序(英语:bootloader)是指在电脑系统中负责初始化周边设备、启动操作系统的程序。在个人电脑上,当 BIOS 完成开机硬件检测后,便会由磁盘上的主引导记录或是主板的UEFI固件读取操作系统对应的引导程序,再由引导程序加载操作系统。Linux 所使用的 GNU GRUB、以及微软为Windows开发的Windows开机管理程序,都属于引导程序的一种。

GPT 分区表

全局唯一标识分区表(英语:GUID Partition Table,缩写:GPT)是使用全局唯一标识符(GUID,也称通用唯一标识符)对物理计算机存储设备(例如硬盘驱动器或固态驱动器)的分区表进行布局的标准。

在 MBR 硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。

但在 GPT 硬盘中,分区表的位置信息储存在 GPT 头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作 MBR,之后才是 GPT 头。

image.png|243

跟现代的 MBR 一样,GPT 也使用逻辑区块地址(LBA)取代了早期的 CHS 寻址方式。传统 MBR 信息存储于 LBA 0,GPT 头存储于 LBA 1,接下来才是分区表本身。64 位 Windows 操作系统使用 16,384 字节(或 32 扇区)作为 GPT 分区表,接下来的 LBA 34 是硬盘上第一个分区的开始。

LBA 0:处于兼容性考虑保留的 MBR,用来防止不支持 GPT 的硬盘管理工具错误识别并破坏硬盘中的数据,这个 MBR 也叫做保护 MBR。

LBA 1:GPT 分区表头。

分区表头的格式:

起始字节长度内容
08字节签名(“EFI PART”, 45 46 49 20 50 41 52 54)
84字节修订(在1.0版中,值是00 00 01 00)
124字节分区表头的大小(单位是字节,通常是92字节,即5C 00 00 00)
164字节分区表头(第0-91字节)的CRC32校验,在计算时,把这个字段作为0处理,需要计算出分区序列的CRC32校验后再计算本字段
204字节保留,必须是0
248字节当前LBA(这个分区表头的位置)
328字节备份LBA(另一个分区表头的位置)
408字节第一个可用于分区的LBA(主分区表的最后一个LBA + 1)
488字节最后一个可用于分区的LBA(备份分区表的第一个LBA − 1)
5616字节硬盘GUID(在类UNIX系统中也叫UUID
728字节分区表项的起始LBA(在主分区表中是2)
804字节分区表项的数量
844字节一个分区表项的大小(通常是128)
884字节分区序列的CRC32校验
92*保留,剩余的字节必须是0(对于512字节LBA的硬盘即是420个字节)

LBA 2-33:GPT 分区表项。

GPT 分区表项的格式:

起始字节长度内容
016字节分区类型GUID
1616字节分区GUID
328字节起始LBA(小端序
408字节末尾LBA
488字节属性标签(如:60表示“只读”)
5672字节分区名(可以包括36个UTF-16(小端序)字符)

LBA 是非常单纯的一种寻址模式﹔从 0 开始编号来定位区块,第一区块 LBA=0,第二区块 LBA=1,依此类推。这种寻址模式取代了原先操作系统必须面对存储设备硬件构造的方式。最具代表性的首推 CHS(cylinders-heads-sectors,磁柱-磁头-扇区)寻址模式,区块必须以硬盘上某个磁柱、磁头、扇区的硬件位置所合成的地址来指定。CHS 模式对硬盘以外的设备来说没什么作用(例如磁带或是网络存储设备),所以通常也不会用在这些地方。

文件系统

计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。

我们主要讨论的是磁盘文件系统:

磁盘文件系统是一种设计用来利用数据存储设备来保存计算机文件的文件系统,最常用的数据存储设备是磁盘驱动器,可以直接或者间接地连接到计算机上。

例如:文件配置表(FAT12、FAT16、FAT 32、exFAT)、New Technology File System、分层文件系统 HFS、HFS Plus、延伸文件系统(ext1、ext2、ext3、ext4)、ODS、btrfs、XFS、UFS、ZFS。有些文件系统是行程文件系统(也有译作日志文件系统)或者追踪文件系统。

Partition 是物理磁盘布局概念,Volume 是逻辑存储概念。在电脑数据存贮器中,卷或逻辑驱动器是一个具有单一文件系统的一个可访问存储区域,概念类似分区,通常(但不一定,卷可能会跨硬盘,但分区无法跨硬盘)位于硬盘的一个分区上。

但复杂情况下,一个 Volume 不一定只来自一个 Partition。比如某些动态磁盘、RAID、Storage Spaces 等场景,可以出现:Disk 0 的一部分 + Disk 1 的一部分 + Disk 2 的一部分 -> 卷(Volume)-> D:\

分区表、分区与文件系统的关系

可以将分区(Partition)理解为通过分区表记录下来的一段连续的 LBA 区域。如果 GPT 分区表中有一条分区记录着:

First LBA = 2048
Last LBA  = 209717247

那么就表示从这一段 LBA 组成了一个分区。

创建一个 partition 之后,分区表会根据这个分区的功能记录在分区表项之中,再在里面建立对应的文件系统。

例如创建一个 EFI 分区的流程是:

  1. 一段连续的 LBA
  2. GPT Partition Entry 将它标记为 EFI System Partition
  3. 格式化为 FAT32
  4. 存放 EFI 启动文件

分区(Patition)决定磁盘空间的归属,而具体的功能由格式化建立起来的数据结构决定(用作启动或者用于建立 NTFS/FAT32 文件系统等等),而分区表用来记录分区的功能和位置。

用 DiskGenius 查看我的电脑磁盘状态:

image.png|825