目录


假设读者已有一定的计算机软硬件基础, 本文总结了这些模式的含义和异同点

省流版本

MBR和GPT分区模式

MBR分区表:

  • 全称主引导记录(Master Boot Record)
  • 只支持容量在2TB (或者说2.2TB) 以下的硬盘,并且不能超过4个主分区
  • 也可以用三个主分区和一个扩展分区,扩展分区下可以有多个逻辑分区。

GPT分区表:

  • 全称是全局唯一标识分区表(GUID Partition Table)
  • GPT可管理硬盘分区大小达到了8ZB (或者说9.4ZB)。
  • GPT对分区数量没有限制,但Windows仅支持128个GPT分区,
  • 只有基于UEFI平台的主板才支持GPT分区引导启动

BIOS和UEFI引导启动模式

其实从含义来讲, BIOS是basic IO system , BIOS和UEFI都是属于BIOS一类

平时我们所讲的bios就是legacy传统模式(legacy还包括引导程序等组件)的一种, UEFI就指的是新的模式

主要区别:

选项 BIOS UEFI
开发语言 主要是汇编 可以用c语言
启动速度 相对慢 相对快
寻址空间 20位 32位
安全性 实模式启动 可用保护模式

引导模式和硬盘分区模式的搭配兼容如下

模式 可否启动 备注
BIOS+MBR 可以启动 这是老版本
BIOS+GPT 不可启动 -
UEFI+MBR 通过CSM可以启动 windows不支持
UEFI+GPT 可以启动 目前主流

结论: 新平台尽量用GPT+UEFI+NTFS的模式

FAT和NTFS文件系统

FAT32

  • Fat32文件格式是一种通用格式, 任何USB存储设备都会预装该文件系统
  • 可以在任何操作系统平台上使用
  • 最主要的缺陷是只支持最大单文件大小容量为4GB

exFAT

  • exFAT文件是微软自家创建的用来取代FAT32文件格式的新型文件格式
  • 它最大可以支持1EB的文件大小,非常适合用来存储大容量文件, 兼容Mac和Windows
  • 最大的缺点是没有文件日志功能, 不能记录磁盘上文件的修改记录

NTFS

  • NTFS (New Technology File System) 是微软为硬盘或固态硬盘(SSD)创建的默认新型文件系统
  • 它集成了所有文件系统的优点:日志功能、无文件大小限制、支持文件压缩和长文件名、服务器文件管理权限和支持加密等。
  • 最大的缺点是Mac系统只能读取NTFS文件但没有权限写入,需要借助第三方工具才能实现。因此跨平台的功能非常差
  • NTFS 可以支持8PB大的卷(早期版本最大支持256TB)

此外, 由于NTFS主要是针对传统机械硬盘而设计的,但是对于U盘或内存卡这种Flash 闪存材料却不适用。主要是NTFS分区是采用“日志式”的文件系统,这种格式会对U盘这种闪存储介质会造成较大的负担,会直接造成U盘容易损坏

详细版本

MBR和GPT分区模式总结

MBR

早期的系统使用的主引导记录MBR(Master Boot Record)的方式来处理开机管理程序 (BootLoader) 与分区表PT(partition table).
而 BootLoader 与分区表则通通放在磁盘的第一个扇区(0号扇区),扇区通常是 512Bytes 的大小.

所以说,0号扇区 512Bytes 会有这两个数据:

  • MBR:可以安装BootLoader的地方,446 Bytes
  • PT:记录硬盘分区的状态,64 Bytes
  • 其实还剩下2Bytes, 存的55AA这个magic number, 表示MBR结束

MBR数据区存储的是BootLoader, 用于加载OS, 不细说

PT存的是4个分区表项 (16B为一项)

因此理论上最多支持4个主分区(primary partition), 在linux就会是如下的情况

P1:/dev/sda1
P2:/dev/sda2
P3:/dev/sda3
P4:/dev/sda4

当然, 为了支持更多的分区, MBR改进出了扩展分区(extended partition)
扩展分区表项占用一个原来的主分区表项的位置, 指向的这个分区不存储用户数据, 存储的是其他分区表, 因此可以支持更多分区
如下

图片来自知乎-周星星
img

扩展分区所存的分区表的格式和主分区的表项一致, 它所指向的分区叫做逻辑分区(logic partition)
主分区在linux上编号是1-4, 逻辑分区在linux上编号是从5开始
如果linux上有7个可用的数据分区.其中有2个主分区和1个扩展分区(扩展分区指向5个新的逻辑分区), 那么编号如下

P1:/dev/sda1
P2:/dev/sda2
L1:/dev/sda5
L2:/dev/sda6
L3:/dev/sda7
L4:/dev/sda8
L5:/dev/sda9

MBR最大支持2TB的磁盘, 这是由MBR分区表项决定的, 表项结构如下

img

可见, 最后两项决定了分区的最大大小
由于相对扇区数最大为 4 Bytes, 4*8=32bits
也就是支持最大 2^32*512Byte=2TB大小的硬盘
因为有的硬盘是以1000而不是1024为进制, 所以有的也称2.2TB

GPT

因为过去一个扇区大小就是 512Bytes , 为了相容于所有的磁盘,因此在扇区的定义上面, 大多会使用逻辑区块位址(Logical Block Address, LBA)来处理。G
PT 将磁盘所有区块以此 LBA (512Bytes) 来规划,第一个 LBA 称为 LBA0 (从 0 开始编号)。

与 MBR 仅使用第一个 512Bytes 区块来记录不同, GPT 使用了 34 个 LBA 区块来记录分区信息!同时与过去 MBR 仅有一个区块不同, GPT 除了前面 34 个 LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份
结构如下

图片来源鸟哥的linux私房菜
img

其中
LBA0 (MBR 相容区块)

这个相容区块的结构和MBR类似, 不同在于原本的分区表内,这个相容模式仅放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式之意。
无法识别GPT 分区表的磁盘管理程序, 就不会识别这颗磁盘,进一步保护了此磁盘

LBA1 (GPT 表头纪录)

这个部份记录了分区表本身的位置与大小,同时记录了备份用的 GPT 分区 (就是前面谈到的在最后 34 个 LBA 区块) 放置的位置, 同时放置了分区表的检验机制码 (CRC32),OS可以根据这个检验码来判断 GPT 是否正确, 以此决定是否启用备用区

LBA2-33 (实际纪录分区信息处)

从 LBA2 区块开始,每个 LBA 都有 4 个分区表项,所以在默认的情况下,总共可以有 4*32 = 128 个分区
每个 LBA 有 512 Bytes,每项记录用到 128 Bytes 的空间
在这个空间内, 除了识别码和其他信息之外,GPT 在每个记录中分别提供了 64bits 来记载开始/结束的扇区号码

因此,GPT 分区表的最大容量限制就是
2^64*512 Bytes = 2^33 TB = 8 ZB
注意 1 ZB = 2^30 TB

注意, 有的地方说是18EB, 这是由于计算方法不同
按字节寻址,则是 2**64 = 18446744073709551616 Bytes, 也就是18 EB
而按扇区寻址, 就要乘以512, 则是 512*2**64 = 9444732965739290427392 Bytes
按1024进制是 8 ZB , 按1000进制则 9.4 ZB

此外, GPT 分区已经没有所谓的主、扩展、逻辑分区的概念,既然每个记录都可以独立存在, 当然每个都可以视为是主分区, 每一个分区都可以格式化

BIOS和UEFI启动模式总结

由于 GPT的 LBA0 仅提供第一阶段的BootLoader,因此如果你使用类似 grub 的BootLoader的话,那么就得要额外分区出一个“ BIOS boot ”的分区

BootLoader作用:

  • 提供菜单:使用者可以选择不同的开机项目
  • 载入核心文件:直接指向可开机的程序区段来开始操作系统
  • 转交其他loader:将开机管理功能转交给其他loader负责

BIOS

BIOS的启动流程: 系统上电后,CPU运行于实模式工作环境中,数据位宽为16位,最大物理地址寻址范围是1MB(20位). 开机后,CPU首先跳转到物理地址0xFFFFFFF0处执行程序。一般情况下,这里是一条跳转指令,跳转到真正的BIOS入口地址。

大部分BIOS代码使用汇编语言开发, 开发之后写死在主板上

汇编开发的优点是代码精简. 缺点是使得代码与设备的耦合度太高,代码受硬件变化的影响大。

BIOS作为基本输入/输出服务需要通过中断来完成,开销大,并且BIOS没有提供异步工作模式,大量的时间消耗在等待上。

BIOS代码采用静态链接,增加硬件功能时,必须将16位代码放置在0x0C0000~0x0DFFFF区间,初始化时将其设置为约定的中断处理程序。而且BIOS没有提供动态加载设备驱动的方案。

安全性:BIOS运行过程中对可执行代码没有安全方面的考虑。

不支持从硬盘2TB以上的地址空间引导:受限于BIOS硬盘的寻址方式,BIOS硬盘采用32位地址,因而引导扇区的最大逻辑块地址是232(换算成字节地址,即232×512B=2TB)。

UEFI

UEFI是BIOS的一种升级替代方案。

UEFI启动是一种新的主板引导项,被看作是有近20多年历史的BIOS的继任者,其优势在于可以提高电脑开机后加载OS的速度。相比传统的Bios启动方式,说白了就是“略过了”启动时自检的过程, 所以变快。所谓传统启动方式,现在被称作Legacy。

UEFI本身已经相当于一个微型操作系统, 优点有:

  • UEFI已具备文件系统的支持,它能够直接读取FAT分区中的文件。
  • 易扩展和开发. 可用c语言等开发出直接在UEFI下运行的应用程序,这类程序文件通常以efi结尾。
  • 安全好, 支持保护模式
  • 寻址空间大

既然UEFI可以直接识别FAT分区中的文件,又有可直接在其中运行的应用程序。那么完全可以将Windows安装程序做成efi类型应用程序,然后把它放到任意fat分区中直接运行即可,如此一来安装Windows操作系统这件过去看上去稍微有点复杂的事情突然就变非常简单了,就像在Windows下打开QQ一样简单。

BIOS启动操作系统之前,必须从硬盘上指定扇区读取系统启动代码(包含在MBR中),然后从活动分区中引导启动操作系统。对扇区的操作远比不上对分区中文件的操作更直观更简单.

所以在BIOS下引导安装Windows操作系统,我们不得不使用一些工具对设备进行配置以达到启动要求。而在UEFI下,不再需要主引导记录,不再需要活动分区,不需要任何工具,只要复制安装文件到一个FAT32(主)分区/U盘中,然后从这个分区/U盘启动安装即可

UEFI规定UEFI系统分区EFI system partition (ESP)采用FAT32格式,同时支持FAT12/FAT16作为移动介质的文件系统。UEFI的FAT分区和普通的FAT分区有个比较小的区别,即OSType不同。

如果你用UEFI安装了Windows , 用windows自带的磁盘管理工具打开磁盘,你会发现有两个很小的隐藏分区。一个叫ESP(EFI系统分区)

引导模式和硬盘分区模式兼容情况如下

模式 可否启动 备注
BIOS+MBR 可以启动 这是老版本
BIOS+GPT 不可启动 -
UEFI+MBR 通过CSM可以启动 windows不支持
UEFI+GPT 可以启动 目前主流

FAT和NTFS文件系统总结

FAT32

FAT即文件分配表(File Allocation Tables)
FAT是分簇管理的, 一簇=若干扇区.

FAT32文件系统由DBR及其保留扇区,FAT1,FAT2和DATA四个部分组成

图片来源于ntfs.com
img

下面详解各个部分

DBR及其保留扇区
DBR的(DOS boot record)也称为操作系统引导记录,位于分区的第一个可用扇区(如果就一个分区的话, 就在MBR后面).
包含跳转指令,OEM代号,BPB,引导程序和结束标志(55AA)。
其中BPB包含了文件系统的元数据信息,如文件系统类型、簇大小、分区大小、根目录的起始扇区号等等

FAT1
FAT的含义是文件分配表,FAT32一般有两份FAT,FAT1是第一份,也是主FAT。
FAT文件系统之所以有16,32不同的版本之分,根本在于FAT表用来记录任意一簇链接的比特数不同。以FAT16为例,每一簇在FAT表中占据2字节(二进制16位)。

因此,FAT16最大可以表示的簇号为0xFFFF,以32K(一簇64个扇区)为簇的大小的话,FAT16可以管理的最大分区为:32KB×65535=2048MB=2G
簇大小为4K时, FAT32的最大分区空间则是1T

定位FAT绝对位置的方法如下:
1、首先从MBR的分区表中得知分区的起始扇区,偏移到此扇区。
2、从DBR的BPB中得知DBR的保留扇区数,FAT表的个数,FAT表的大小。
3、因此FAT1=分区起始扇区+DBR保留扇区,FAT2=分区起始扇区+DBR保留扇区+FAT1。

以FAT32举例, FAT1表项(前四位保留)的含义如下

0x00000000:表示簇未被分配,也就是空闲状态。
0x00000001:保留
0x00000002 - 0x0FFFFFEF:表示簇已被分配,对应的值为下一个簇的编号。
0x0FFFFFF0 - 0x0FFFFFF6: 继续保留
0x0FFFFFF7:表示簇已被分配,但是是坏簇。
0x0FFFFFF8 - 0x0FFFFFFF:表示簇已被分配,文件结束标志。

此外, 第0-2个簇是特殊值

0号:0x0FFFFFF8;FAT表起始固定标识
1号:0xFFFFFFFF;不用,默认值
2号:0x0FFFFFFF;根目录所在簇

数据区的簇从2开始
因此, 如果一个文件占用了簇3、4、5,那么FAT1中对应的表项就应该是:

偏移量	长度	描述
0x0C	4	0x00000004
0x10	4	0x00000005
0x14	4	0xFFFFFFF8
图源ntfs.com:FAT16文件举例img

然而簇号的前4位是保留的, 最多使用后28位
因此FAT32大小还取决于簇的大小
最大分区大小 = 簇数 × 簇大小. 如下

簇大小	最大磁盘大小
512B    128G
1KB	    256G
2KB	    512G
4KB	    1TB
8KB	    2TB

扇区号 = (簇号 - 2) × 每簇扇区数 + 第一个数据扇区号
例如5号簇的扇区号 = (5 - 2) × 8 + 2 = 34

此外新建目录时,只为其分配一个簇的空间,对应的FAT表项中写入结束标记。当目录增大超出一个簇的大小时,将会在空闲空间中继续为其分配一个簇,并在FAT表中为其建立FAT表链以描述它所占用的簇情况.

因此, 在linux执行ls -ahl, 默认情况下空目录是4KB(一个簇)大小
FAT2
FAT2是FAT32的第二份文件分配表,FAT1的备份。不多说

DATA
DATA也就是数据区,是FAT32文件系统的主要区域,其中包含目录区域。

FAT的核心思想是: 万物皆文件, 目录也是文件

根据FAT表中的簇号, 可以定位到DATA的数据块

  • 如果是目录, 则数据块包含子项列表(子目录项, 子文件块)
  • 如果是文件, 则包含文件信息

目录项结构如下

图源cnblogs:charygao
img

此外, FAT32用 4Bytes 记录文件大小, 因此一个文件最大4GB

当访问一个路径的文件时, 步骤如下:

  • 访问DBR得知扇区信息
  • 访问FAT表, 找到根目录簇号位置(通常是固定的2号簇)
  • 加载根目录的数据块到内存, 在根目录的数据块(通常是DATA段第一个扇区)中检索, 找到子目录项的簇号
  • 继续根据子目录簇号, 在FAT中找到子目录范围
  • 继续定位子目录数据块并加载…
  • 直到最后一级目录数据块, 找到对应的文件块
  • 把文件数据块加载到内存, 完成访问

FAT文件系统考虑当时电脑性能有限,所以很简单,因此几乎所有操作系统都支持。这特性使它成为理想的软盘和存储卡文件系统,也适合不同OS。

但FAT有一个严重的缺点:当文件删除后写入新资料,FAT不会将文件整理成完整片段再写入,长期使用后会使文件资料变得逐渐分散,而减慢了读写速度。碎片整理是一种解决方法,但必须经常磁盘碎片整理来保持FAT文件系统的效率

exFAT

从FAT12到FAT16再到FAT32, 所支持的2TB也很快不够用了, 于是有了exFAT

结构如下

img

可见, 多了一个位图用于记录文件.

exFAT使用64位比特记录文件,因此可达16EB大小

exFAT和FAT32对比主要有

  • 文件大小限制:FAT32文件系统最大支持单个文件大小为4GB,而exFAT文件系统最大支持单个文件大小为16EB(exabytes),这使得exFAT更适合处理大型文件。
  • 簇大小:FAT32文件系统的簇大小通常为4KB,而exFAT文件系统的簇大小可以高达32MB,这意味着exFAT可以更有效地利用大容量存储设备。
  • 兼容性:FAT32文件系统是一种较旧的文件系统,因此在某些操作系统和设备上可能不被支持。exFAT文件系统则更加通用,可以在Windows,Mac OS X和Linux等操作系统上使用,并且被广泛用于移动设备和嵌入式系统中。
  • 文件系统结构:exFAT文件系统具有更好的文件系统结构,可以更好地处理文件碎片和磁盘错误,从而提高了文件系统的可靠性和性能。

具体如下

Feature FAT32 exFAT
Maximum Volume Size 8 TB 128 PB
Maximum File Size 4 GB 16 EB
Maximum Cluster Size 32 KB 32 MB
Maximum Cluster Count 228 232
Maximum File Name Length 255 255
Date/Time resolution 2 s 10 ms
MBR Partition Type Identifier 0x0B, 0x0C 0x07

更多的细节不深究了, 太多…

NTFS

NTFS文件系统同FAT32文件系统一样,也是用“簇”为存储单位,一个文件总是占用一个或多个簇。

NTFS文件系统使用逻辑簇号(LCN)和虚拟簇号(VCN)对分区进行管理。

  • 逻辑簇号:对分区内的第一个簇到最后一个簇进行编号,NTFS使用逻辑簇号对簇进行定位。
  • 虚拟簇号:将文件所占用的簇从开头到尾进行编号的,虚拟簇号不要求在物理上是连续的。

NTFS结构如下

图源知乎
img
  1. VBR(Volume Boot Record):存储跟引导相关的数据,大小为16个扇区;
  2. 文件区域:在NTFS的概念里,一切皆文件,包括元数据文件、常规文件、目录.
  3. BBS(Backup Boot Sector):备份扇区. 磁盘分区的第一个扇区是分区引导记录,是能否引导系统的关键,所以NTFS用分区的最后一个扇区备份第一个扇区,用于备份修复。

NTFS文件系统一共由16个“元文件”构成

图源同上
img

其中

  • $BOOT 类似于FAT的DBR
  • $MFT 文件表, 类似于FAT

下面细嗦MFT
MFT的文件记录列表在物理上是连续的,并且从开始编号。
MFT的前16个文件记录总是元文件的,并且顺序是固定不变的

MFT中的文件记录由两部分构成,一部分是文件记录头,另一部分是属性列表,最后结尾是四个“FF”。
属性列表存在一个簇里面, 如果一个簇存不完, 就用指向新的簇继续存
举例如下

图源同上
img

NTFS也用32位比特来存储簇号
NTFS支持的大型卷的大型和群集大小(也就是簇)关系如下(来自微软官网)

群集大小 最大的卷和文件
4 KB(默认大小) 16 TB
8 KB 32 TB
16 KB 64 TB
32 KB 128 TB
64 KB(早期最大值) 256 TB
128 KB 512 TB
256 KB 1 PB
512 KB 2 PB
1024 KB 4 PB
2048 KB(最大大小) 8 PB

暂时探究到这里, 文件系统实在是又多又杂…


参考文章

http://www.ntfs.com/
https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/20.html
https://zhuanlan.zhihu.com/p/26098509
https://www.cnblogs.com/Chary/p/12981056.html
https://learn.microsoft.com/zh-cn/windows-server/storage/file-server/ntfs-overview