硬盘分区和文件系统和引导模式总结
目录
假设读者已有一定的计算机软硬件基础,本文总结了这些模式的含义和异同点
省流版本
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)
扩展分区表项占用一个原来的主分区表项的位置,指向的这个分区不存储用户数据,存储的是其他分区表,因此可以支持更多分区
如下
扩展分区所存的分区表的格式和主分区的表项一致,它所指向的分区叫做逻辑分区 (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 分区表项决定的,表项结构如下
可见,最后两项决定了分区的最大大小
由于相对扇区数最大为 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 也拿来作为另一个备份
结构如下
其中
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 四个部分组成
下面详解各个部分
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
然而簇号的前 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 的数据块
- 如果是目录,则数据块包含子项列表 (子目录项,子文件块)
- 如果是文件,则包含文件信息
目录项结构如下
此外,FAT32 用 4Bytes 记录文件大小,因此一个文件最大 4GB
当访问一个路径的文件时,步骤如下:
- 访问 DBR 得知扇区信息
- 访问 FAT 表,找到根目录簇号位置 (通常是固定的 2 号簇)
- 加载根目录的数据块到内存,在根目录的数据块 (通常是 DATA 段第一个扇区) 中检索,找到子目录项的簇号
- 继续根据子目录簇号,在 FAT 中找到子目录范围
- 继续定位子目录数据块并加载…
- 直到最后一级目录数据块,找到对应的文件块
- 把文件数据块加载到内存,完成访问
FAT 文件系统考虑当时电脑性能有限,所以很简单,因此几乎所有操作系统都支持。这特性使它成为理想的软盘和存储卡文件系统,也适合不同 OS。
但 FAT 有一个严重的缺点:当文件删除后写入新资料,FAT 不会将文件整理成完整片段再写入,长期使用后会使文件资料变得逐渐分散,而减慢了读写速度。碎片整理是一种解决方法,但必须经常磁盘碎片整理来保持 FAT 文件系统的效率
exFAT
从 FAT12 到 FAT16 再到 FAT32, 所支持的 2TB 也很快不够用了,于是有了 exFAT
结构如下
可见,多了一个位图用于记录文件.
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 结构如下
- VBR(Volume Boot Record):存储跟引导相关的数据,大小为 16 个扇区;
- 文件区域:在 NTFS 的概念里,一切皆文件,包括元数据文件、常规文件、目录.
- BBS(Backup Boot Sector):备份扇区。磁盘分区的第一个扇区是分区引导记录,是能否引导系统的关键,所以 NTFS 用分区的最后一个扇区备份第一个扇区,用于备份修复。
NTFS 文件系统一共由 16 个 “元文件” 构成
其中
- $BOOT 类似于 FAT 的 DBR
- $MFT 文件表,类似于 FAT
下面细嗦 MFT
MFT 的文件记录列表在物理上是连续的,并且从开始编号。
MFT 的前 16 个文件记录总是元文件的,并且顺序是固定不变的
MFT 中的文件记录由两部分构成,一部分是文件记录头,另一部分是属性列表,最后结尾是四个 “FF”。
属性列表存在一个簇里面,如果一个簇存不完,就用指向新的簇继续存
举例如下
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