zoukankan      html  css  js  c++  java
  • 多平台大型文件系统比较

    概述

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

  • 相关阅读:
    【LeetCode】13. 罗马数字转整数
    【LeetCode】9. 回文数
    【LeetCode】7. 整数反转python3
    【LeetCode】7. 整数反转
    【LeetCode】1. 两数之和
    拖拽选择区域日历组件
    gitlab之gitlab-ci自动部署
    GitLab 安装和配置
    移动端键盘弹起导致底部按钮上浮解决方案
    JS判断滚动条是否停止滚动
  • 原文地址:https://www.cnblogs.com/gmpy/p/13255644.html
Copyright © 2011-2022 走看看