概述
由于业务需求,需要评估嵌入式设备的外置存储,例如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。
来源:oschina
链接:https://my.oschina.net/u/4305000/blog/4338859