由于业务需求,需要评估嵌入式设备的外置存储,例如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 。
|