文章目录
- 简要分析FAT文件系统
- 1.FAT的起源与发展历史
- 2.FAT的基本结构与目录管理机制
- (1).基本结构
- (2).文件分配表
- (3).根目录区
- (4).数据区
- 3.优点与缺点
- 4.改进与替代方案
- (1).exFAT
- (2).ext2/3/4
- (3).NTFS
- 小结
- 参考文献
简要分析FAT文件系统
1.FAT的起源与发展历史
为了更好地管理磁盘,比尔盖茨发明了FAT文件系统,并且在后续的86-DOS中采用。
最初使用的FAT现在也称为FAT12,它的每一个FAT条目只有12位来表示,因此FAT12最多只能管理4096个簇(也被成为块),假设每个簇的大小为4KB,则这个文件系统支持的最大存储容量则为16MB。
从这里也可以看出,FAT12能管理的存储容量的确非常小,因此在1984年微软将FAT条目扩展到了16位,因此此时的FAT16可以管理65536个簇,并且簇的大小可以达到32KB,这样支持的最大存储容量就有了明显增长。
当然,为了满足后续更大容量的需求,FAT条目又被扩展到了32位,形成了目前还有被少量使用的FAT32文件系统,FAT32只用了32位中的28位来标识簇,因此它可以管理最多268435438个簇,并且允许磁盘的容量达到8TB。
当然,因为FAT的一些固有缺陷,后续微软还推出了exFAT格式,这就是后话了。
2.FAT的基本结构与目录管理机制
(1).基本结构
FAT文件系统由引导扇区、保留区域、文件分配表、根目录区和数据区组成,它的一个基本架构是这样的:
为什么要把引导扇区留在最开始的位置呢,其实很好理解,首先简单来说,计算机的启动流程是这样的:
- 加电自检:按下电源按钮后,电源开始送电,BIOS或UEFI开始进行硬件初始化和自检,这一步会尽可能保证所有的关键硬件正常工作
- BIOS/UEFI初始化:接下来会将BIOS或UEFI的固件程序从主板上的ROM中取出,加载到内存中开始运行,并且进行一些相应的启动设置检查等操作
- 加载Bootloader:BIOS在这一步会依照已经设定好的启动顺序,尝试从启动设备的第一个扇区位置读取Bootloader并加载到内存中开始执行,从此,Bootloader程序会接管计算机的控制权
- 操作系统加载:如果我们使用的是类似Linux的操作系统,那可能还会有GRUB这样的第二阶段Bootloader,这里不再赘述,在这一步,Bootloader会找到磁盘上的操作系统内核,加载到内存中开始执行,之后就是操作系统内核的正常初始化,由此,整个操作系统就顺利启动了
所以说了这么多,为什么要把引导扇区放在最前面呢?其实已经很明确了,因为文件系统是一个逻辑上的架构,像是我们对内存抽象出的虚拟存储系统一样,文件系统也是为了更好地管理磁盘而抽象出的架构,这就带来一个问题:文件系统的相应代码应该是在操作系统启动的时候才能被加载的,假设我们将Bootloader的代码放在一个需要通过文件系统定位的位置,那BIOS在这一步就可能找不到Bootloader的位置了,所以,引导扇区是需要被放在最靠前的位置的,这样可以保证即便没有文件系统,操作系统也可以被正常加载,于是乎就有了0柱面,0磁头,1扇区,512字节的最后两个字节一定是0x55AA的传说。
(2).文件分配表
之后比较重要的就是FAT(文件分配表)了,FAT是一种基于链式存储的文件系统,因此它会以链表的形式记录簇的一些信息。
当然,磁盘中的FAT不会那么轻松的让簇记录在磁盘里乱跳(因为文件系统自己没有一个更底层的文件系统负责兜底,所以能更加有序的存储总是更好的),因此FAT记录区采用了数组模拟链表的方式实现,在这里就简单用FAT16举例,对于每一个簇,都有一个唯一的编号,因此数组的下标就是簇的编号,而数组中存储的条目就是对应条目的值,它的数值有几种选择:
- 0x0000:空闲簇,代表当前簇是可用的
- 0x0001:保留簇
- 0x0002-0xFFEF:指向下一个簇,也就是模拟链表的部分
- 0xFFF0-0xFFF6:保留值
- 0xFFF7:坏簇
- 0xFFF8-0xFFFF:文件的最后一个簇,也就是链表尾
所以FAT的基本思想其实相当简单,对于一个文件存储,需要分配对应大小的簇,而采取链式管理的FAT只需要记录从第一个簇开始的整条链的信息就可以完成管理了,这是一个很简单的思路。
(3).根目录区
FAT12和FAT16保留了一个专门的区域用来保存根目录下每一个文件及目录的基本信息,而FAT32将目录记录保存在数据区,可以进行动态扩展。
这里仍然以FAT16为例,每个目录项用32个字节保存:
- 文件名(8字节):文件名称
- 扩展名(3字节):扩展名,如TXT
- 文件属性(1字节):例如只读、隐藏、系统文件之类的属性信息
- 创建时间(2字节):文件被创建的时间
- 修改时间(2字节):文件上次被已修改的时间
- 起始簇号(2字节):与FAT16的16位簇号匹配,因为是链表,所以只需要保存链表头的簇号就可以找到整个文件
- 文件大小(4字节):整个文件的大小,以字节为单位
还有一些剩余的字节会用来保存注入最后访问日期等其他信息,最终为32字节,在这里就可以完成文件查找的所有操作了,当你打算访问下面这个文件的时候:
/DirA/DirB/a.txt
首先从根目录开始,遍历根目录的目录项,找到DirA的目录项,然后读取DirA的簇号,接着开始去数据区取出DirA对应的数据,之后再去DirA的目录项中找到DirB的簇,之后再仿照读取DirA的方式,在DirB的目录项中找到a.txt的簇号,之后再查阅FAT表就可以完成整个文件访问的操作了。
当然,还是要提一嘴,FAT32当中没有根目录区,根目录和一般目录项一起存在数据区,根目录的位置由最前面的保留区的一些字段决定。
(4).数据区
数据区就是实际文件和目录数据存储的位置了,这里会占据整个卷的大部分空间,在此就不细究了。
3.优点与缺点
先说优点,FAT的优点在于它的实现方式真的很简单(连我都可以轻松理解),它的基本框架就是:通过划分固定大小的簇+链式管理来完成所有数据的管理,目录一定从根目录开始,将下一级的目录和文件统统视为文件,每一个文件都具备一个目录项,目录项保存了文件的基本信息以及簇链表的头节点,簇链表由FAT表维护,每次可以根据查表来找到整个文件用到的所有簇,由此,就完成了整个磁盘的管理。
缺点当然也是显而易见,通过链式管理+固定大小分簇的方式的确可以避免产生外部碎片,但是随着磁盘逐渐使用,磁盘内部会产生越来越多的碎片,可利用的簇变得越来越零散,此时对于一个文件的读取就可能需要多次磁盘寻道,这可能会严重影响性能。
二来是,FAT的可扩展性比较差,即便是FAT32,一个文件最大也只能为4GB,在目前看来这样的大小已经跟不上现在的单文件大小了,中大型人工智能模型的一个权重文件可能就有10~20GB,FAT完全无法支持这样的工作负载。
三来也是最重要的一个问题:可靠性,能够让数据存下来当然是文件系统最重要的工作,但是存储下来能不能保证数据安全也是非常重要的,FAT仅有一个冗余FAT表副本的机制来提高容错率,但是假设所有FAT表都发生损坏,那就几乎无法回复数据了,目前比较成熟的NTFS文件系统就采用了日志记录的方式来保障安全,即便在断电或是系统崩溃的时候也能保障数据不发生丢失或损坏。
4.改进与替代方案
(1).exFAT
为了让FAT支持更大的单一文件,微软推出了exFAT作为FAT32的取代方案,它具备更大的文件和分区支持,单个文件最大尺寸理论上为16EB,而一个分区最大的尺寸理论上可以达到128PB,但因为这个方案仍然只是在FAT的基础上进行的修改,安全性方面exFAT还是要逊于NTFS等文件系统。
不过exFAT具有非常强的跨平台优势,exFAT被Windows、macOS和Linux三个平台支持,因此如果你有跨平台文件存储的需求,使用exFAT或许是一个不错的选择。
(2).ext2/3/4
ext2是1993年Linux采取的默认文件系统,而ext3,ext4则是在ext2的基础上进行的迭代,最初的ext2没有日志功能,单个文件最大大小为2TB,最大分区大小为32TB。
而ext3在ext2的基础上引入了日志系统,增强了对于数据安全的保障,并且完全兼容ext2,可以几乎无缝升级。
而ext4则是目前Linux主要采用的文件系统,它将文件和分区的最大大小扩展至16TB以及1EB,并且通过一些方式减少了碎片化的问题。
(3).NTFS
NTFS是微软为了NT架构的新系统准备的(我发现上个世纪的科技企业总是喜欢起一些非常简单的名字的缩写,比如NT,其实是New Technology的缩写),所以NTFS也就是NT File System的缩写了。
1993年微软将NTFS引入Windows NT 3.1,从此成为了Windows的默认文件系统,它支持了以下新特性:
- 日志功能:支持日志功能,能够更好地保障数据完整性,并且能够在数据出现损坏之后更快地恢复
- 文件权限:支持更加复杂的目录和文件权限管理
- 压缩和加密:就像我们在Windows对某个卷右键一样,总是能够看到压缩选项,NTFS原生支持对于分区的压缩
NTFS还将单个文件和分区的最大尺寸提高到了16EB(理论值),相较于FAT有了巨大的优势。
不过NTFS存在专利问题,因此基本上只有Windows能够原生支持,诸如Linux和macOS对于NTFS的支持都是基于逆向工程得到的驱动,它们的稳定性可能不如微软本身实现的驱动,不过这么做可以规避掉NTFS的专利问题,一个简单的例子,假设你有一个被格式化为NTFS文件系统的U盘以及一台Mac电脑,在没有安装一些第三方软件的情况下,Mac会一直提示这个U盘是只读的,你不能通过macOS向这个U盘内写入任何数据,当然通过一些第三方软件就可以实现这个过程了(这可能是另外的价格)。
小结
所以FAT的确是一个非常简单的文件系统,通过一些非常简单的链式管理的方式完成了整个磁盘的管理,但是它的链式存储导致了碎片化等问题,没有日志系统导致其存在数据安全问题,因此后续出现了很多替代方案,如NTFS,ext4等等,当然这个世界上还存在非常多其他的文件系统,比如微软前些年推出的ReFS,苹果的HFS和APFS,它们都存在一些非常新的特性,旨在更好地解决目前文件系统存在的问题。
参考文献
- 维基百科—文件分配表
- 知乎—FAT12文件系统介绍
- Microsoft Learn—FAT、HPFS和NTFS文件系统概述
- 知乎—FATFS文件系统详解
- 知乎—深入内核-文件系统的原理-EXT2/3/4
- CSDN-FATFS基本入门教程(3)- FAT文件系统简介