2020年5月

视频点此

如果你想使用你的硬盘,格式化是必须要进行的一个步骤。格式化时,总会接触到一个选项:磁盘类型——或者叫文件系统。现如今,有一堆的文件系统可供选择,至于使用哪种,就要取决于你的操作系统和正在格式化的介质是什么了。举个例子,在我的arch上,我想格式化我的U盘,我可以选择FAT32、NTFS、EXT4等等。所以,到底要怎么选择使用的文件系统呢?

我不打算介绍原理,一来很枯燥,二来我也不懂。这里只介绍一下来源和主要的功能特性供了解即可。当然,市面上的文件系统有很多,而大多数又并不常用——或者说,当下被人们熟知的只有NTFS这个文件系统吧…因此只说一些你听着可能会听亲切的文件系统们,罕见的就不提了。

再来简单说一句,为什么需要有文件系统?文件系统的工作,就是把硬盘扇区按组结合成更大的独立单位——称为簇或者块,并建立每个文件所在的组的索引。这部分具体的可以翻看我之前说过的硬盘分区相关内容。

一、FAT家族

FAT家族是DOS和Windows系统的第一款文件系统,全称File allocation table,文件分配表——系统。它有3个主要的版本:FAT12、FAT16和FAT32. 数字增大不止意味着版本更新,可以包含的簇数量、最大文件和最大分区大小也是逐次增大的。

FAT12,按簇大小8K来计算,最大文件和最大分区容量都可以支持到32M,而4KB的簇,最大只支持到16M。

FAT16,不同的簇大小也有不同的结果。最大文件体积可能是2G,可能是4G,而分区大小最多最多可以支持到16G。但16G的情况下,簇大小被分配到了256k,内部碎片是很多的。

FAT32,相对前两个FAT版本会更为人熟知吧,毕竟现如今也在应用之中。这种FAT文件系统,最大文件4G,而理论上的最大分区可以支持到16T——相比FAT16是很惊人的提升——然而,数字变大的时候,理论和实际之间就出现了很大的偏差。对于windows系统,FAT32分区最大只能到32G,而其他的操作系统,FAT32分区最大只能到2T。可见分区容量瓶颈从文件系统短板转变成了操作系统短板了。但是,得益于FAT32几乎全平台的支持,且支持的最大分区容量足够高——当然我指的是非windows平台——这个文件系统至今也是比较流行的文件系统之一。一个很明显的例子:EFI启动的主板,启动分区一定是FAT32的——虽然16也可以。

二、NTFS

FAT32在windows上的容量短板促使微软推出了更完善,更强大的文件系统。这种文件系统也是微软家族至今在使用的文件系统:NTFS(New Technology File System)。这个文件系统于1993年推出,目的就是为了解决FAT32的限制。NTFS的提升很大,单文件大小支持到了16EB,可以说没有文件大小限制了。NTFS是一个日志文件系统,说人话就是它维护着一个磁盘操作记录,这保证了它可以在系统崩溃或意外断电之后,对文件进行复原以保证数据的完整性。相对于FAT32,NTFS还支持权限和加密功能,比如可以给一个文件只读属性,那么删除和修改等等就不能进行了。这可以更方便的保证操作系统本身不被破坏掉,因此现如今的windows会强制使用NTFS分区作为系统分区。

NTFS确实不错,但是它在非windows平台的兼容性并不理想:最简单的例子,对于macos和老版本的Linux,NTFS在默认情况下对它们来说是只读的文件系统。而对于比如mp3、mp4这种独立的媒体播放器来说,NTFS直接就不能读取了。

三、exFAT

为了解决FAT文件系统的瓶颈,微软还有另一条分支线路:exFAT(extended FAT)。这种文件系统由微软在2006年推出,主要应用在U盘一类的移动存储介质上面。这种文件系统没有NTFS那么复杂,但是相对于FAT32同样有着一个很显著的优势:单文件大小最大同样支持到了16EB。而且它相对于NTFS有着更广泛的平台兼容性:对于macos,这个文件系统可以直接读写,而近些版本的安卓同样支持了这个文件系统。对于Linux,之前需要单独安装由三星开发的exFAT的驱动模块。而去年微软开放了exFAT并将其添加到了Linux内核中,预计从Linux5.7内核开始,exFAT的驱动将换成微软的代码,且将实现开箱即用,低复杂度、几乎无限大的文件体积支持,又有着广泛的兼容性,显然,这个文件系统是移动存储介质——包括SD卡的最佳选择。

四、ext家族

现在,回到Linux。1992年,针对Linux的extened file system(EXT)文件系统开始开发,并于1993年发布了ext2文件系统。这个在当时成为了很多发行版默认的文件系统。2001年,这个文件系统同样增加了日志功能,名称变更成了ext3。2008年,ext4发布,同时,这个文件系统也成为了Linux的默认文件系统。EXT4,单文件最大支持16T,分区容量支持到1EB。但是,因为是针对Linux出现的文件系统,ext家族都不能原生支持windows和macos——当然,可以通过软件实现访问,但是并不推荐。

五、苹果家族

1985年,苹果推出了自己的文件系统:HFS(Hierarchical File System)。它支持单文件2G,分区最高2T。1998年,文件系统加入了日志功能,并且对于macos10.4以后的版本来说,单文件和分区容量支持提升到了8EB,这个文件系统被命名为HFS+。2017年,苹果宣布了一个专为SSD或者其他固态存储设备设计的新文件系统APFS(Apple File System)。当然,这些文件系统都是苹果自己的产品,所以这三种文件系统均不支持微软平台和Linux平台。

六、选择

所以要怎么选择分区的文件系统呢?对于系统分区,windows7以上必须使用NTFS,Linux系统,ext4是最简单的。也可以选择其他的类型,但是可能需要自己单独增加一些内核模块以保证支持使用的文件系统。而苹果,HFS+或者APFS就无所谓了。不过APFS可能更先进一些吧?

对于U盘,如果容量低于32G,FAT32可能是更好的选择,因为它的平台兼容性是最强的。而对于32G以上容量的U盘,或者你的U盘需要存储大于4G的单个文件,那么exFAT就是一个好选择了。就我个人的经验来说,最好不要将NTFS应用到U盘的文件系统上,因为有时候会出现莫名其妙的权限问题导致U盘不可用。

对于其他分区或者移动硬盘,NTFS自然是最适合用在windows系统上面的了。而如果你需要经常在windows和mac之间交换数据的话,exFAT是一个不错的选择——加上Linux也一样。对于Linux,虽然NTFS也可以用在Linux上面,但是会出现莫名其妙的写入错误——比如说当你使用Steam Linux安装CSGO到一个NTFS的游戏库中时,你将永远得到一个“校验失败“的提示。所以,如果你的Linux有不同的分区,请让它们使用非NTFS的、Linux支持的文件系统。