概述
由于业务需求,需要评估嵌入式设备的外置存储,例如U盘、SD卡等,适用的大型存储系统。出于兼容考虑,常见的会使用 FAT32
,exFAT
,NTFS
。在寻找三者的特征过程中,也带出了其他的文件系统对比,例如ReFS
,HFS+
等。
文件系统的往事今生
目前常见的系统平台就3类,分别是 微软的Windows
,苹果的MacOS
,开源社区的Linux
,每个操作系统都有设计自己的文件系统,以本文讨论的几款文件系统来说,他们的归属如下:
Dev | FAT32 | exFAT | NTFS | ReFS | HFS/HFS+ | APFS | Ext2/3/4 |
---|---|---|---|---|---|---|---|
Window | √ | √ | √ | √ | |||
Mac | √ | √ | |||||
Linux | √ |
Window
系列的文件系统,最广为人知的是FAT32
,在古老的Win XP
上就是用的这文件系统。但由于历史局限性,其设计存在不可能避免的缺陷,例如无法支持大于32G的存储分区和大于4G的文件,微软又提出了NTFS
。NTFS
的确非常强大,支持加密、压缩、权限控制等等,且还支持日志保证数据一致性,目前(2020年)在PC上主要用的依然是NTFS。在NTFS.com
上能找到NTFS的特性和元数据的详细介绍。
NTFS
的确强大了,但兼容性反而比不上FAT32
,按网上的资料说,因为NTFS
支持日志,大量写会影响Flash
的寿命,例如U盘、TF卡等,于是微软又推出了exFAT
,作为FAT32
与NTFS
的折中。NTFS
的日志对Flash的寿命的影响,我是存疑的,就好像在手机的emmc
上用的ext4
,也是带日志的,且这些flash
本身有磨损平衡,等用到寿命上限的之前,我们早已更新换代了。在磁盘上,不管是功能多样性、性能和稳定性,exFAT
都比不上NTFS
,因此在Win7
上测试,发现磁盘分区只能格式化为NTFS
,U盘可以选择exFAT
和NTFS
。
ReFS
虽然也是微软推出来的,据说是NTFS
的替代品,但是并没有太普及,目前功能还比不上NTFS
。NTFS.com
上也有ReFS
的介绍。
HFS
是苹果设备上专用的文件系统,后来迭代出了HFS+
,反正是功能越来越强大了。后来苹果又推出了APFS
,用于替代HFS+
。
Ext
系列则是Linux
社区上设计的文件系统,由于Linux
称霸服务器端,大部分开发者其实都或多或少接触过Ext
系列文件系统。在5.x
的Linux
内核上,依然存在有ext2
和ext4
的代码,如果你非得用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这样的小嵌入式设备的角度来说,大部分设备通过移植第三方文件系统都可以快速支持FAT32
和exFAT
,例如微软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文件系统最大空间及单个文件大小演算法则》 对ext3
和ext4
上的文件大小限制和分区大小限制的计算原理讲的挺好的。
我先来看看在计算机端,大小单位的进制关系:
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
。