多平台大型文件系统比较

概述

由于业务需求,需要评估嵌入式设备的外置存储,例如U盘、SD卡等,适用的大型存储系统。出于兼容考虑,常见的会使用 FAT32exFATNTFS。在寻找三者的特征过程中,也带出了其他的文件系统对比,例如ReFSHFS+等。

文件系统的往事今生

目前常见的系统平台就3类,分别是 微软的Windows,苹果的MacOS,开源社区的Linux,每个操作系统都有设计自己的文件系统,以本文讨论的几款文件系统来说,他们的归属如下:

Dev FAT32 exFAT NTFS ReFS HFS/HFS+ APFS Ext2/3/4
Window
Mac
Linux

Window系列的文件系统,最广为人知的是FAT32,在古老的Win XP上就是用的这文件系统。但由于历史局限性,其设计存在不可能避免的缺陷,例如无法支持大于32G的存储分区和大于4G的文件,微软又提出了NTFSNTFS的确非常强大,支持加密、压缩、权限控制等等,且还支持日志保证数据一致性,目前(2020年)在PC上主要用的依然是NTFS。在NTFS.com上能找到NTFS的特性和元数据的详细介绍。

NTFS的确强大了,但兼容性反而比不上FAT32,按网上的资料说,因为NTFS支持日志,大量写会影响Flash的寿命,例如U盘、TF卡等,于是微软又推出了exFAT,作为FAT32NTFS的折中。NTFS的日志对Flash的寿命的影响,我是存疑的,就好像在手机的emmc上用的ext4,也是带日志的,且这些flash本身有磨损平衡,等用到寿命上限的之前,我们早已更新换代了。在磁盘上,不管是功能多样性、性能和稳定性,exFAT都比不上NTFS,因此在Win7上测试,发现磁盘分区只能格式化为NTFS,U盘可以选择exFATNTFS

ReFS虽然也是微软推出来的,据说是NTFS的替代品,但是并没有太普及,目前功能还比不上NTFSNTFS.com上也有ReFS的介绍

HFS是苹果设备上专用的文件系统,后来迭代出了HFS+,反正是功能越来越强大了。后来苹果又推出了APFS,用于替代HFS+

Ext系列则是Linux社区上设计的文件系统,由于Linux称霸服务器端,大部分开发者其实都或多或少接触过Ext系列文件系统。在5.xLinux内核上,依然存在有ext2ext4的代码,如果你非得用ext3,也只是用ext4的代码。网上有许多ext2/3/4之间差异的文章,简单来说,ext3首先引入了日志,解决了ext2掉电不一致问题,ext4又在ext3的基础上,添加了新功能和扩大了大小上限,提供更好的性能和可靠性。

Linux上其实还有很多新系统,例如使用COW而非日志的btrfs,还支持镜像等,功能非常强大,但感觉还不够稳定。

文件系统的兼容性

我们经常需要跨平台工作,例如从 Win10 拷贝个文件到U盘,然后插入到 Mac Book中,或者 Linux 电脑中,这时候如果U盘的文件系统兼容性不够好,就会导致有的平台能识别U盘的文件,有的电脑无法识别。因此,我们需要讨论下,文件系统的兼容性!

参考资料《What File System Should I Use for My USB Drive?》,不同文件系统的兼容性总结如下:

FS Win XP Win 7/8/10 Mac (<= v10.6.4) Mac (>=v10.6.5) Linux
FAT32
exFAT × √ (after v5.7)
NTFS Read Only √ (with 3party tools) √ (with 3party tools)
HFS+ × Read Only with Boot Camp ×
APFS × × × ×
EXT4 × √ (with 3party tools) × ×

NTFS的支持上,使用第三方工具,例如ntfs-3g后可实现读写。其中在Linux有原生的NTFS驱动,支持读,但对写只是不太好。

在个人电脑端,微软的Window占了绝大比例,因此在U盘和TF上使用的文件系统,我们更需要考虑的是Window的兼容性。可以发现,FAT32毕竟是老大哥了,它的兼容性是最高的,但是局限性也的确很明显。从兼容性考虑,作为替代,可以考虑exFAT,毕竟不管是Mac还是Linux都已经原生支持了,而NTFS还需要安装第三方工具。但查阅资料发现,exFAT设计时有两份FAT,但微软不知道哪根筋搭错了,默认只使用一份FAT,也就意味着,作为可插拔的U盘和TF卡,如果随意插拔,FAT异常却没有镜像备份,还是有可能会导致文件系统的损坏的。

从RTOS这样的小嵌入式设备的角度来说,大部分设备通过移植第三方文件系统都可以快速支持FAT32exFAT,例如微软2020年开源的FileX,例如RT-Thread上使用的elmfat。在嵌入式设备的角度来看,exFAT的兼容性明显要比NTFS要好。

上文也有提到,网上有人说NTFS的日志会加剧Flash的磨损。关于这点我是存疑的,理论上的确会加剧磨损,但Flash的寿命相对TF卡和U盘的使用频率来说,是不需要担心的。就好像安卓手机上默认使用的ext4文件系统也是带日志的,从磨损的角度来说,问题也不大。

所以呢,在U盘和TF卡上使用的文件系统,我的建议是:

  • 希望更高的兼容性,使用exFAT
  • 希望保证数据安全的前提下,尽可能高的兼容性,使用NTFS

文件系统的限制

文件系统的限制,在设计的时候就确定了。例如FAT32用32位的变量记录文件大小,就限制了一个文件最大不超过2^32=4G大小。在远古时候,存储介质还只有几十上百兆,此时FAT32的限制是绰绰有余的,但在现今磁盘1TB起步的时代,FAT32的时代局限性让其不再适用于最新的设备,所以催生了新的文件系统。

《刨根问底:ext3/ext4文件系统最大空间及单个文件大小演算法则》ext3ext4上的文件大小限制和分区大小限制的计算原理讲的挺好的。

我先来看看在计算机端,大小单位的进制关系:

B KB MB GB TB PB EB ZB YB DB NB
2^0 2^10 2^20 2^30 2^40 2^50 2^60 2^70 2^80 2^90 2^100

《计算机存储单位:Byte、KB、MB、GB、TB、PB、EB、ZB、YB、DB、NB介绍》NB的描述挺有意思的,假设1TB的硬盘重670g,那么要存储1NB容量的数据,共需要1152921504606846976个1TB硬盘,共计77245740809万吨。目前最大的船 诺克耐维斯号 载重量为56万吨,1000个 诺克耐维斯号 拉到报废都拉不完。

我们再看看各个文件系统的限制是怎么样的。由于大多数人对 PB 及以上的单位并不敏感,下表改用 TB 来表示。

FS 最大分区大小 最多文件个数 最大文件大小 备注
FAT32 32G 2^22 4G 有些定制的FAT32可以支持更大的分区
NTFS 5 (16 * 1024 * 1024) TB 2^32 – 1 (16 * 1024 * 1024) TB 前提:假设1K簇大小,簇越大,值越大
exFAT (128 * 1024) TB Unlimited (16 * 1024 * 1024) TB
ReFS 1 YB = (1024)^4 TB 2^64 – 1 2^64 – 1
HFS+ (8 * 1024 * 1024) TB / (8 * 1024 * 1024) TB
ext4 (1024 * 1024) TB Unlimited 16TB 格式化时有几个inode,就支持多少个文件

大部分数据来自于NTFS.com

Tags: