Exfat缺点

因为回答了下面这个问题,被人邀请过来回答此问题。

首先我虽然是从事和文件系统相关工作的,但是和微软以及苹果旗下的文件系统关系并不大,很少使用。我下面的回答将主要以普遍的文件系统知识为主,进行解释一下exfat被说成“容易丢数据”的可能原因。本来我是打算在专栏下专门写文章来讨论的,可惜由于时间和精力原因一直还没写到文件系统日志的部分,我也不打算在这里细说,只简单的解释下。

进入正题,首先exfat被传“容易丢数据”这点从是不是日志文件系统角度来说,是不正确的,或者说是不太准确的。首先,日志在文件系统中的作用是为了保证数据一致性的,不是保证不丢数据的。那什么是数据的一致性?保证一致性并不等同于保证数据“不丢失”。举个例子来理解一致性吧(说定义太抽象)。

比如你在一家银行有两张储蓄卡,A卡和B卡。现在你想从A卡里转1000块钱到B卡,那银行系统的操作可能是先从A账户扣除1000元,然后B账户增加1000元。或者先在B账户增加1000元,再从A账户扣除1000元。不管是哪种方式,必须保证最终的结果是A少了1000,B多了1000,否则要么你要么银行就亏了。这一多一少的对等就保证了数据的一致。

但是我们知道,任何系统都不保证绝对不出问题,比如断电、存储故障、系统崩溃等异常原因导致上述操作在进行到一半时断掉了。比如刚从你的A账户扣除1000元,B账户还没来得及增加,系统就down掉了,这种现象就叫数据出现不一致,出现这种现象用户肯定是不乐意的。要知道一个复杂系统每单位时间都要处理数不清的请求和操作,等系统再起来后,系统不知道自己刚才down掉前有什么是进行了一半的操作,它也无从得知,直到用户过来抱怨,通过人为的检查各种票据银行可能才能知道自己弄错了,然后帮用户的B账户增加1000来完成这一次完整业务。或者给A账户增加1000算作撤销这次业务操作。

文件系统也有这样的问题,要知道任何的数据最终都落到实际的存储介质上(如硬盘),而存储介质上数据的组织方式首先就靠文件系统来负责。比如你向一个文件写数据,至少你需要完成(注意是至少):

  • 分配数据空间。
  • 写入数据。
  • 修改文件对应的各种元数据(如各种bmap,size等)。
  • 更新free space管理的信息。

...

这些理论上应该在一个原子操作内完成,但是现实是它们只能一步一步做,而这中间就面临着崩溃的危险。一旦中途崩溃,作为一个没有日志的文件系统,我们将不知道哪个操作在做到什么步骤时没做完就停止了。像上面的银行问题一样,造成了数据的不一致。

对于非日志文件系统,如exfat,怎么保证或者说检查数据的一致性呢?那就是自古传下来的fsck类工具,每个文件系统几乎都为自己提供一个这样的工具,来进行文件系统一致性检查和必要时的修复工作。在过去,每隔一段时间,系统维护重启时都要定期执行fsck,自检有没有出现不一致问题。这在初期是很好用的,但是随着存储的不断增大,信息时代用户数据的庞大让fsck显得非常吃力。因为fsck相当于全文件系统扫描,计算检查有没有不一致的地方。但是随着存储的不断增大,现在对一个大型服务器上的文件系统做一次fsck的时间可能要好几天甚至更多,这对于服务器而言是不能忍受的。出现系统崩溃后不能马上从崩溃状态上恢复回来继续上线,即使是资本家也会告诉你“时间就是金钱”!文件系统的程序员们更是不能容忍这种缺陷,于是他们效仿数据库的日志机制,给文件系统也加了日志的支持。

我这里不想涉及过多技术细节,我会在专栏里抽时间详细阐述文件系统日志。对于这个回答的阅读者,我觉得从道理上明白一下就可以。如果用文件系统的数据和元数据举例,恐怕很多人很难理解,所以我们还拿银行举例。对于上面银行的例子来说,加了日志后从A账户转账1000元到B账户就是一个完整的任务,这个任务要么彻底完成,要么一点都别做。怎么保证呢?

为了更清楚的理解,我们这么举例,现在我们先从B账户转2000到A账户,然后可能觉得转多了,又从A账户转1000回到B账户。这里面就有两个任务,分别是

  1. B-2000, A+2000
  2. A-1000, B+1000

带有日志的系统在做的时候可能这样做(纯举例,实际日志记录要比这个复杂):

+--------------+
|   B - 2000   |
+--------------+
|   A + 2000   |
+--------------+
| Check point1 |  
+--------------+
|   A - 1000   |
+--------------+
|   B + 1000   |
+--------------+
| Check point2 |
+--------------+

  • 如果操作在日志设置完Check point1之前就崩溃了,则系统启动后撤消(有的说回滚)已做的步骤,保证这个任务一点没做。
  • 如果操作在正好设置了Check point1时崩溃了,则系统处于一致状态,不做任何修改。
  • 如果操作在设置了Check point1但是没到Check point2之间崩溃了,则在系统启动后回滚到Check point1的状态。
  • 如果操作在设置了Check point2后崩溃,则系统处于一致状态。

这就是日志系统保证数据一致性的一种方式,对于文件系统来说,每次挂载文件系统时,都会检查日志,发现不一致则会做log replay,从而使文件系统保持一致的状态。

不知道大家看到"Check point"这个词有没有熟悉的感觉?是的,在玩游戏的时候我们经常能碰到这个词,俗称“检查点”! 对于从一个检查点开始,在没玩到下一个检查点就Game over的玩家来说,任务失败回滚到任务开始处简直就是噩梦般的存在(手动滑稽)。

好了,上面说了这么多。exfat容易丢数据这个论点显然是不准确的,和日志文件系统相比,不带日志的文件系统更不容易察觉自己处于不一致状态,且不容易从不一致状态中恢复回来(需要借助fsck工具手动修复)。但是说其“丢数据”是不准确的描述,确实在fsck后可能会丢掉一些数据来保证一致性,但是非日志文件系统和丢数据之间没有直接联系,否则,即使是日志文件系统,回滚掉的操作你觉得算不算“丢”了呢?比如你在编辑文件,一个写的操作正在进行,即使你用sync强制同步数据到存储上,这个数据对于文件系统来说也不一定算写进去了,文件系统可能认为这个写操作没有完全完成,你即使已经写进去数据的块,也可能被认为是无效的块,和文件的元数据不对等,而被舍弃。所以不是你硬把数据从缓冲区“刷”进U盘了就一定算写进去了,乖乖的卸载文件系统保证日志完整再拔优盘才是最保险的。

下次你的U盘插上时告诉你不能识别文件系统,你应该知道先干什么了吧?当然是用你所用文件系统对应的fsck工具先尝试检查和修复一下。实在不行再检查是文件系统问题,还是存储硬件问题,还是fsck工具的问题(fsck工具也不保证能修复所有问题,也是有bug更新的)。这点对于日志文件系统也适用,虽然日志文件系统可以自己恢复到一致性状态,但是保不齐它就有回复不了的情况,这种时候fsck工具就是你最后的救命稻草,快去用它进行手动修复把。如果它也救不了你,你就只能准备足够的问题描述和证据寻求工程师的帮助了(不要单纯的说我U盘打不开了怎么办,工程师需要可用于调试和分析问题的东西)。

exFAT很好,MAC、WIN都支持,还可以支持大硬盘和大文件 ,但它有一个问题,有时会很严重。

如果你拿它存电影、音乐等,或者暴雪的游戏,都没关系,都是大文件。
如果你拿它存一堆小文件,每个不超过128K,问题就出现了。

1T硬盘,一个分区——
NTFS每个簇4K,就是说你的文件要是10K,占三个簇,浪费2K。
exFAT每个簇256K,10K的文件占一个簇,浪费246K。

我曾经在装的一个cygwin,4.8G。
在NTFS分区,占5.2G,还好。
在exFAT分区,大概占50G吧,因为多数文件都只有几十K甚至不到1K。

在NTFS里只占不到400G的数据(各种文件,电影、游戏、文档、程序源文件等),移到exFAT都快600G了。

exFAT分区小于512G的话,每个簇128K,还稍微节约一点,所以可以分至少两个区,每个512G。

一个NTFS,存放一堆小文件,或者变化不大的文件,可以用虚拟机里的WIN系统来修改。
另一个是exFAT,放大文件或经常修改的文件。
还有一个方案就是把一堆小文件弄成磁盘映像,DMG或ISO,只要装载了就可以直接用,但里面的内容不方便修改。存成压缩文件亦可,都不会显出exFAT的问题。

在格式化U盘的时候,会有一个U盘格式的选择,一般是两个,有的是三个,FAT32/exFAT/NTFS,那么这三个格式具体有什么区别呢?相信很多人都知道如果要拷贝超过4G大小的文件就得用NTFS格式,但其实他们之间的区别可不只这个。

Exfat缺点

首先先给大家介绍下这三种格式的特点。

FAT32

FAT32文件系统用4个字节(32位)空间来表示每个扇区配置文件的情形,所以叫FAT32。分区容量最低是512M,而上限的话不同的操作系统都不一样,WinXP系统最大可以做到2TB的FAT32分区。

NTFS

NTFS文件系统是windows NT核心和高级服务器网络操作系统环境的文件系统。NTFS系统比FAT32的可靠性更高,可以支持更大的分区和更大的文件,此外还有不少FAT32没有的功能,比如压缩分区、文件索引、数据保护和恢复、加密访问等。

exFAT

exFAT文件系统是微软在windows embeded5.0以上引入的一种适合于闪存的文件系统,主要是为了解决FAT32不支持4G或更大文件的问题而推出的。

Exfat缺点

FAT32与exFAT可用4GB文件的区别:

大多数优盘在格式化时默认FAT32,最大优点就是在一个不超过8GB的分区中,FAT32的每个簇容量都固定为4KB,与前代相比可以大大地减少磁盘的浪费,提高磁盘利用率。

虽然对于最大分区容量的支持上面,FAT32的2TB最大分区容量至今仍不过时,但FAT32无法传输并存放超过4GB容量的光盘ISO镜像、高清视频、各种图形作品文件等等,这是最致命的弊端。而exFAT格式在苹果本或者是Windows电脑上都可以格式化,并且在两个系统之间可以互相无障碍使用。相比之下,exFAT格式就没有4GB文件传输限制了。

其实FAT32与exFAT存在着一个升级关系,这两种文件系统都支持OS X系统与Windows系统,如果你将U盘格式化成这两种文件系统,在不同操作系统电脑上可以畅通无阻地使用。

Exfat缺点

NTFS相比FAT会让闪存性能降低

NTFS是相当流行的,但多见于硬盘。XP、Vista、Win7默认都会将分区格式化为NTFS系统,可以说NTFS是目前最好的磁盘文件系统。

优盘在格式化为NTFS时,实际可用容量与其他文件系统形式也有所差别,虽然使用中感受并不是很大。另外,在格式化U盘时,容量在64G甚至更大规格时,系统识别自动格式化为exFAT与NTFS格式,会便于优盘在不同操作系统电脑上无障碍使用。

但是,NTFS也有他的缺点,NTFS分区采用“日志式”,因为要记录磁盘的详细读写操作,对U盘这种快闪存储介质会造成较大的负担,比如同样存取一个文件或目录,在NTFS上的读写次数就会比FAT32更多,理论上NTFS格式的U盘比较容易损坏。并且由于U盘带宽有限,NTFS频繁读写占据通道会让磁盘性能降低。

以上便是关于U盘文件系统FAT32、exFAT、NTFS之间的区别和特点介绍,FAT32与exFAT之间最大的差别在于能否支持4GB及以上容量单个文件的传输、查看与编辑;而FAT系列文件系统与NTFS之间最大的区分在于文件存取的方式,后者长期使用可能会让闪存类存储产品性能降低.