你有没有遇到过这种场面:往 U 盘里拷贝一个 5GB 甚至更大的文件,进度条刚走到一半,系统弹窗告诉你“文件过大,无法复制”。大多数人的第一反应是盘坏了,第二反应才是骂 FAT32 的 4GB 限制。在大容量 U 盘、SD 卡几乎普及的今天,exFAT 文件系统早就成了这些设备的默认可选格式,但很多人只是把 exFAT 当成一个“能装大文件的 FAT32”来用,却不知道它和 FAT32 的差距远不止文件大小一个数字。
这篇文章是文件系统系列的第五篇,重点讲 exFAT 的原理。我会把它拆成几个层面:为什么会有 exFAT 这种东西、磁盘布局长什么样、目录项怎么组织、没有日志的 exFAT 为什么怕断电,最后给出一份选型和排查清单。适合三类人看:一是想把存储设备格式从原理上搞清楚的开发者,二是做嵌入式 Linux 和数据存储方案的朋友,三是在 Windows、macOS、Linux 之间来回拷贝文件,总被兼容性问题烦到的普通用户。看懂原理之后,很多以前只能“照着别人配置抄”的事,你自己就能判断怎么设置更好。
1. 为什么需要 exFAT:夹缝中诞生的第三种选择
开始讲原理之前,先回答一个问题:FAT32 和 NTFS 已经存在了那么多年,为什么微软还要折腾一个 exFAT 出来?这背后其实是一段非常典型的“存储需求倒逼格式演进”的历史。
1.1 FAT32 的 4GB 硬天花板:从 32 位文件大小字段说起
FAT32 的文件大小记录字段是 32 位,无符号整数最大能表示 0xFFFFFFFF,换算成字节是 4294967295,也就是刚好 4GB 减 1 字节。这个限制从 FAT 系列诞生之初就写死了——90 年代初设计 FAT 时,没人会想到一个文件能超过 4GB。问题在 2005 年前后开始爆发:高清视频文件、蓝光镜像、大型游戏安装包、数据库备份,随便一个都能越过 4GB 线。
我记得第一次撞到这个天花板,是往移动硬盘里拷一个 20GB 的虚拟机镜像,当时直接懵了。后来查到 FAT32 还有一个 2TB 分区上限,心里才明白,这文件系统不是不好用,是确确实实到了设计寿命的尽头。这几年大家可能已经习惯了 U 盘默认格式化成 exFAT,但在那个年代,一个 8GB 的优盘能装两个电影却因为“单个文件超限”而罢工,是再常见不过的痛点。
1.2 NTFS 为什么不能直接下放到闪存
既然 FAT32 不够用,为什么不直接用 NTFS?这里有一个很多人不了解的设计背景:NTFS 面向的是机械硬盘和服务器场景,功能非常丰富,有 $MFT 主文件表、有一整套日志机制保证崩溃一致性、有文件权限 ACL、有压缩和加密。但恰恰是这些“高级功能”,在闪存介质上成了负担。
- 日志机制意味着每次写入都要同步额外的日志记录,产生写放大,对 U 盘和 SD 卡这类闪存介质来说,写次数是有寿命成本的。
- 大量非连续读写和复杂元数据更新,对闪存主控不友好,容易拖垮设备的随机读写性能。
- 更现实的问题是兼容性:2006 年左右的相机、摄像机、游戏主机,很多根本不提供 NTFS 驱动,而且 NTFS 的专利授权对设备厂商来说也是个不可控因素。
所以微软在 2006 年发布 Vista SP1 的同时,推出了 exFAT,定位非常明确:面向大容量闪存的通用文件格式。它不追求像 NTFS 那样的完整功能,只求在闪存上做到“够快、够大、够通用”。
1.3 exFAT 的授权历史和开源现状
exFAT 早期是商业授权产品,设备厂商要支持它需要向微软支付授权费。这导致很长一段时间里,Windows 原生支持很好,macOS 也支持,但 Linux 内核迟迟不把 exFAT 驱动并进去——不是技术做不到,而是一开始是专利和授权问题。
转折点在 2019 年 8 月,微软把 exFAT 的规范文档公开,并允许 Linux 内核实现相关驱动,当年发布的 Linux 内核 5.4 已经直接带上了 exFAT 内核驱动。从那之后,在 Linux 上使用 exFAT 就不再需要用 FUSE 之类的外部方案了。这个历史背景很重要,因为它解释了为什么现在嵌入式开发板上能无障碍挂载 exFAT 分区——如果你在 2019 年前做过嵌入式方案,应该能体会到当时为 exFAT 装 FUSE 有多麻烦。
2. 磁盘解剖:从 VBR 到簇位图,一次完整的格式化布局
接下来我们玩一次“拆机”。把一个 exFAT 格式化的 U 盘从扇区 0 开始看过去,你会看到它的设计思路和 FAT32 明显不同,也比 FAT32 严谨得多。
2.1 分区类型:0x07 的迷惑细节
exFAT 分区在 MBR 分区表里的分区类型是 0x07,和 NTFS 完全一样(NTFS 也是 0x07),所以很多分区工具在 MBR 下只凭分区类型根本分不清这个分区是 NTFS 还是 exFAT。真正要区分得看引导扇区里的 OEM 标识:NTFS 的 OemName 是“NTFS”,而 exFAT 的 OemName 是“EXFAT”。在 GPT 分区表下,exFAT 有自己的专属 GUID,分区的身份识别就直观多了。
这个细节会在实际使用中带来麻烦:如果你拿一个老工具把 exFAT 分区的类型改成别的,系统可能就不认了,改回来要看引导扇区标识,不是看分区类型。我自己就遇到过用磁盘工具调整分区属性后,U 盘在 Windows 上变成“RAW 格式”的事,最后靠恢复分区类型为 0x07 才救回来。
2.2 引导扇区与备份区:双保险的引导设计
exFAT 卷的开头是主引导区域,有 12 个扇区;卷的末尾还有一个备份引导区域,也是 12 个扇区。每个引导区域里包含:1 个引导扇区、8 个扩展引导扇区、1 个 OEM 参数扇区、1 个保留扇区和 1 个校验和扇区。
引导扇区里除了跳转指令和“EXFAT”标识,还有一个很关键的结构叫 BPB(BIOS Parameter Block),里面记录着卷的基本参数:
| 字段 | 含义 |
|---|---|
| BytesPerSector | 每扇区字节数,一般是 512 或 4096 |
| SectorsPerCluster | 每簇扇区数,决定簇大小 |
| NumberOfFATSectors | FAT 表占用的扇区数 |
| FatOffset | FAT 表的起始偏移(以扇区为单位) |
| RootDirectoryFirstCluster | 根目录的起始簇号 |
| VolumeLength | 卷的总扇区数 |
特别需要注意的是,exFAT 引导扇区并不直接记录“簇位图在哪个扇区”,起定位作用的其实是后面要讲的 Allocation Bitmap 目录项,引导区和根目录之间有一个“找位图”的间接过程。这个设计初看绕了一圈,但换来的是元数据文件可以布局在任何位置,灵活性比 FAT32 高很多。
2.3 簇位图:真正决定“哪些簇空闲”的功臣
exFAT 最核心的数据结构之一,就是簇位图(Cluster Allocation Bitmap)。简单说,它就是一个以“位”为单位的数组,每个位对应卷里的一个簇:1 表示该簇已被占用,0 表示空闲。
文件系统要分配新空间时,就在位图里扫描找到第一个空闲位,对应到簇地址,把位图置 1,然后调整目录项里的文件信息。释放空间时把它改回 0 就行。整个过程非常轻量,不像 FAT32 那样要维护一整条链式记录。位图在磁盘上也是以文件形式存在,位于卷中靠近 FAT 表的地方,大小由卷的总簇数决定。这个“位图”的思维在后续很多文件系统里都有影子,exFAT 是最早在 FAT 家族里大规模使用它的。
2.4 FAT 表还在,但角色减负了
这是新手最容易误解的一点:exFAT 里依然有 FAT 表,但它已经不再是 FAT32 时代的那个 FAT 表了。
FAT32 里,每个文件在 FAT 表里有一条“簇链表”,文件占用了哪些簇、下一个簇是谁,全部靠表项串联。所以写一个文件,可能要反复更新 FAT 表的多个表项。exFAT 引入了一个非常聪明的标志位 NoFatChain(无 FAT 链):如果一个文件的簇是连续分配的,这个标志被置位,文件系统读写时完全不需要查 FAT 表,直接按目录项里的起始簇和文件长度顺序访问就行。只有当文件被迫碎片化、无法连续分配时,驱动才会退回到 FAT 表里记录簇链。
这个改变带来的收益非常直接:对于连续文件,写文件时几乎不需要更新 FAT 表。你往闪存上写一个大的视频文件,只要空间连续,元数据开销非常小,这对闪存设备的弱随机写、强顺序写特征来说,几乎是量身定做的优化。也解释了为什么 exFAT 对大视频和镜像文件的顺序读写性能很好——FAT 表不再是瓶颈。
2.5 Up-case Table:为大小写比较准备的一张查表
FAT 文件系统对文件名是大小写不敏感的,exFAT 也要支持“MyFile.txt”和“myfile.txt”被视为同一个文件。但要判断两个文件名是否相等,就需要知道每个字符对应的大写形式。
exFAT 用一个独立存储在卷上的 Up-case Table(上限表)来保证这一点。这个表本质上是个 Unicode 映射文件,从字符代码映射到其大写形式。文件系统在比较名称时用它统一转大写,然后比较。它有个“奇怪但合理”的优势:大小写规则以卷上的表为准,不依赖操作系统自带的库,这样同一个 U 盘在 Windows、macOS、Linux 上比较文件名时行为完全一致。早期某些精简系统里这个表缺失,结果出现“明明文件存在却找不到”的奇怪问题,就是因为它。
3. 目录项系统:32 字节槽位背后的文件组织逻辑
看完了卷层结构,我们把镜头再拉近,看 exFAT 的目录系统。这一层理解透了,后面很多排查思路就通顺了。
3.1 一个文件不是一个条目,而是一个“条目集合”
FAT32 的一个目录项是 32 字节,包含文件名、大小、起始簇、属性、时间等所有信息。exFAT 也是 32 字节一个槽位,但一个文件的信息被拆成了多个目录项组合在一起,这个组合被称为目录项集合(Directory Entry Set)。
一个典型的文件集合长这样:
| 目录项类型 | 作用 |
|---|---|
| 0x85 File 目录项 | 文件属性、时间戳、辅助项计数 |
| 0xC0 Stream 扩展项 | 起始簇、文件大小、名称长度、有效数据长度 |
| 0xC1 File Name 目录项 | 文件名,每个最多存 15 个 UTF-16 字符 |
换句话说,一个文件占用至少 3 个目录项槽位(短文件名情况下),如果文件名很长,会有多个 0xC1 目录项,整个集合会占更多槽。目录里还有 0x81(位图)、0x82(上限表)、0x83(卷标)等特殊目录项,它们的元数据文件也以目录项形式挂在根目录下,这就是为什么 exFAT 的关键元数据可以灵活布局。
3.2 File 目录项里藏了什么
0x85 类型的目录项是整个集合的“头”,一般放在集合的第一个槽位。它里面记录的是:
- 长度 1 字节的类型值为 0x85
- 1 字节的 SecondaryCount,表示后面还跟多少个辅助目录项
- 2 字节的属性字段,包含只读、隐藏、系统、目录等标志
- 创建时间戳、访问时间戳、修改时间戳,创建时间精度比 FAT32 的 2 秒高得多
- 有些厂商实现里还有用户自定义字段
如果你用十六进制编辑器打开一个 exFAT 格式的 U 盘,看到一个以 0x85 开头的 32 字节槽位后面跟着 0xC0、0xC1,基本可以确定这是一个文件的目录项集合。这套组合逻辑,和 FAT32“一行搞定”的设计已经完全不在一个层面上了。
3.3 Stream Extension:文件在磁盘上的“地图”
0xC0 目录项是关键,它记录文件在磁盘上的实际分布:
- 2 字节的名称长度
- 8 字节的有效数据长度 ValidDataLength,对稀疏文件有意义
- 4 字节的 FirstCluster,起始簇号
- 8 字节的 DataLength,文件数据的字节长度
- GeneralSecondaryFlags 中的 NoFatChain 标志,表示文件是否连续分配
文件系统读写文件时,靠的就是 FirstCluster 和 DataLength 定位数据。如果 NoFatChain 被置位,整个文件都是连续存储,驱动不需要查 FAT 表,顺序读性能极好;如果文件被碎片化,这个标志不会置位,驱动就得借助 FAT 表里的链来跳转。
这个设计给我们的启发是:想让 exFAT 跑得最快,最好的办法就是尽量别让文件碎片化。对大文件一次性写入、预留连续空间、使用较大的簇,都是有效手段。
3.4 文件名目录项、名称哈希与目录遍历
0xC1 目录项负责保存文件名,每个可以放 15 个 UTF-16 字符,长文件名就串联多个 0xC1。文件名的编码是 UTF-16LE,所以理论最大文件名长度是 255 个 UTF-16 字符。
目录遍历的时候,如果每次都逐字符比对一个可能长达 255 字符的 UTF-16 文件名,又慢又占资源。所以 exFAT 在 File 目录项里存了一个 NameHash 字段:先计算文件名的哈希值,在哈希层面快速排除不匹配的条目,只有哈希值相同的才做完整比对。这个哈希不是加密用途,而是索引加速。理解这点对后面优化目录查找很有帮助——当目录里文件特别多时,哈希匹配是 exFAT 目录扫描快的重要原因。
3.5 删除与恢复:0xE0 标记位的作用
exFAT 删除文件时,并不是把目录项集合清空,而是把集合第一个槽位的类型字节改成 0xE0,表示“已删除”。数据簇的内容不动,位图会标记为可用,后续写文件可能覆盖这些簇,也可能长期不覆盖。
这个机制对数据恢复很重要:如果你删除了一个 exFAT 分区上的文件,数据没有被后续写入覆盖,用数据恢复工具扫描 0x85 开头的残余目录项,大概率能找回文件内容。相比 NTFS 的复杂日志和索引,exFAT 的“标记删除”反而让数据恢复变得更加直接。很多老牌的 U 盘恢复软件之所以对 exFAT 效果好,根本原因就在这个 0xE0 标记里。
4. 无日志设计的代价:exFAT 的健壮性与写操作细节
前面讲了 exFAT 怎么高效地组织数据,但高效是有代价的。这一节集中讲它最容易被忽视的问题:断电安全。
4.1 没有事务日志不是 bug,是定位
exFAT 没有日志(Journal),也没有文件系统事务的概念。NTFS 有 $LogFile,ext4 有日志,Btrfs 甚至有 CoW 机制,exFAT 什么都没有。
这是有意为之的:做日志意味着持续额外的写入,对闪存寿命不友好,而且会增加实现的复杂度。exFAT 的定位本来就是“在闪存上存储文件的轻量骨架”,不是“需要高可靠事务处理的桌面数据库系统”。但后果就是,任何中断都可能让文件系统处于不一致状态。丢掉一个文件不是最惨的,更常见的是整个目录无法访问,或者卷层面出现“未分配但已标记占用”的空间泄漏。
4.2 写一个文件,涉及几次关键的元数据更新
以在运行 Linux 的开发板上通过 exFAT 写入一个文件为例,大概要经历:
- 在位图里扫描空闲簇,置 1。
- 把文件数据写入这些簇。
- 写入(或更新)0x85 和 0xC0 目录项,把文件名、大小、起始簇写进去。
- 目录项更新落盘后,文件才算真正“可见”。
问题来了:这 4 步之间只要有一次断电,就可能出问题。比如位图已经更新了但数据没写完,文件系统认为这些簇被占用,实际上文件不完整;或者目录项写了一半,文件名的 UTF-16 字符断裂,目录项校验失败;又或者数据写完了、目录项也写了,但位图还没更新——重新挂载后,这些簇被标记为空闲,下次写文件直接把它们覆盖,原来的文件就“消失”了。不同驱动实现的步骤顺序可能有差异,但风险窗口是确定的:多个步骤在任何时刻被打断,都可能不一致。
这也是为什么 Linux 的 mount 命令处理 exFAT 时,一般会有 flush 或 sync 相关的选项,以及为什么“安全弹出 USB 设备”不是 Windows 的矫情——对 exFAT 来说,没有优雅卸载,掉电随时可能在元数据更新之间的窗口期发生。日常使用中,sync 命令正是这个原理(把脏页面强制刷回设备),理解了这个原理,你就知道什么时候该用、该在什么时机用。
4.3 我实测过的损坏模式
我自己做存储实验的时候,专门试过在写入大文件的过程中直接断电,连着几十次,总结下坏的情况大致这么几类:
- 文件出现在目录里,但打开报“参数错误”:一般是 0xC0 目录项的 DataLength 和实际数据不匹配,或者目录项集合不完整。
- 文件访问不了,但存储空间少了:位图已经置 1,但目录项没建立成功,空间被“偷”了。
- 整个目录打不开:目录自身的数据结构被破坏,需要扫描重建。
- 出现几个字节的坏数据但不影响全局:这种反而是最常见的,多数情况下文件还能用,比如视频文件末尾少了几秒。
有意思的是,常见的修复工具 chkdsk(Windows)和 fsck.exfat(Linux)处理这类问题的策略基本一致:扫描所有目录项,重建位图,把目录项标记不完整的文件恢复为正常或删除。原因是 exFAT 的最大单点故障风险就是位图和目录项的不一致,只要这两者能对上,数据基本都还在。
4.4 嵌入式 Linux 场景:为什么根文件系统很少用 exFAT
说一个实际很常见的问题:嵌入式 Linux 开发时,为什么不用 exFAT 来做根文件系统?结合“根文件系统挂载”这个话题,简单展开一下。
exFAT 没有权限、没有符号链接、没有硬链接,甚至连文件所有者、用户组这些 POSIX 概念都没有。Linux 根文件系统需要的这些特性它给不了。所以你看嵌入式板卡的启动方案,根文件系统要么是只读挂载的 squashfs,要么是 ext4,或者开发阶段直接用网络文件系统,从宿主机用 NFS v3 挂载根文件系统,方便边改边跑。NFS v3 作为网络文件系统,和 exFAT 根本不是一个定位,一个管远程目录共享,一个管本地大容量存储。
那 exFAT 在嵌入式里住哪儿?答案是“外置数据分区”。比如行车记录仪、无人机、运动相机上的 TF 卡,设备在录制视频时通过内核 exFAT 驱动写入,用户拔下卡插电脑直接能读。和 littlefs 这类针对 SPI NOR 闪存的小文件系统相比,exFAT 面对的是几十 GB 级别的 SD 卡/SSD,两者一个管“小容量磨损均衡”,一个管“大容量顺序吞吐”,分工非常清楚。如果你在 ESP32 或 STM32 的 PlatformIO 工程里用过 littlefs 分区的库,应该能理解这类小文件系统针对 MCU 小容量闪存做了多少取舍。
5. 实测对比:FAT32、exFAT、NTFS、littlefs 的不同场景选型
原理讲了那么多,落到实际还是一个问题:我到底该格式化哪个文件系统?下面的表是我根据实际使用体验和官方文档整理的,可以直接抄作业。
5.1 核心参数对比表
| 对比项 | FAT32 | exFAT | NTFS | littlefs |
|---|---|---|---|---|
| 最大文件大小 | 4GB-1字节 | 16EB(理论) | 16EB | 约 8 倍 flash 大小(可配置) |
| 最大卷大小 | 2TB | 128PB(理论) | 256TB(受簇大小影响) | 受 flash 大小限制 |
| 日志/事务 | 无 | 无 | 有 | 掉电保护强,无日志 |
| 文件权限 | 无 | 无 | 有 ACL | 无 |
| 符号链接 | 无 | 无 | 有 | 无 |
| 典型场景 | 老相机、老设备 | U 盘、SD 卡、相机 | Windows 系统盘、大数据盘 | 嵌入式 SPI Nor/NAND |
| 跨平台兼容 | 极好 | 极好(2019 后 Linux 内核原生) | Windows 最好,macOS 受限 | 只用于嵌入式 |
这张表想表达的就一句话:没有最好的文件系统,只有最合适的场景。exFAT 的本质是“大容量闪存上的通用格式”,它不是来取代 NTFS 的,也不是来取代 ext4 的,而是给 FAT32 画上句号、同时比 NTFS 更适合闪存设备的一个过渡性答案。
5.2 相机、无人机、行车记录仪:为什么清一色 exFAT
你可以去看任何一款支持 4K 视频的相机说明书,存储卡格式化推荐选项基本都有 exFAT。原因很简单:
- 单个视频文件动辄超过 4GB,FAT32 直接阵亡。
- 设备主控小巧,不想实现 NTFS 那套复杂日志和权限。
- exFAT 对顺序大文件读写优化,录像时间长、数据量大时性能稳定。
- 用户拔卡插电脑,无论 Windows、macOS 还是现在的 Linux 桌面,都能直接读。
这里补充一个我遇到的典型坑:有些老相机对 exFAT 的簇大小有要求,如果你用电脑格式化时选了厂商不预期的簇大小,相机可能识别不出卡片,提示“需要格式化”。所以跨设备使用的卡,最好是让设备自带的格式化功能来格式化,或者用默认簇大小,别自己乱调。
5.3 ventoy 制作启动盘:分区文件系统类型选哪个
现在很多人做 PE 启动盘或 ISO 启动盘会用到 ventoy,它的原理是把 U 盘分成一个专门分区,把 ISO 文件直接扔进去就能引导。用 ventoy 制作 U 盘时经常有人问“分区文件系统类型选哪个”。
我的经验:如果 U 盘主要拿来装 ISO、Windows 安装镜像、Linux 发行版镜像,并且可能在不同电脑上使用,优先选 exFAT。原因还是兼容性:同样装着 ISO 文件,FAT32 最多放 4GB 镜像,而现代 Windows 安装镜像早就超过 4GB;NTFS 在老一些的主板 UEFI 里支持不太好,很多主板固件只认 FAT 家族。ventoy 官方文档也建议 exFAT 作为首选,就是因为它在“能被固件识别”和“4GB+ 镜像容量”之间平衡得最好。这个选型经验同样适用于普通启动盘:如果你只是偶尔做一次装机工具,在兼容性优先的前提下,exFAT 基本不会有错。
5.4 littlefs 与 exFAT 的分工
搜 exFAT 资料的时候,经常有人把它和 littlefs 放在一起比。其实它们面向的场景完全不同。
littlefs 是 ARM 主导的开源嵌入式文件系统,主要跑在 SPI NOR Flash、小容量 NAND 上,特点是掉电保护、磨损均衡,用很少的 RAM/ROM 就能跑。而 exFAT 天生面向几十 GB 到几 TB 的闪存设备,两者不是竞争关系,更像“小管家”和“大仓库管理员”。
在不少嵌入式产品里,成熟的方案是:bootloader + 内核放 SPI NOR,根文件系统用只读 squashfs 或 ext4,运行数据和配置放 littlefs 分区,而外置 SD 卡/U 盘的大文件存储用 exFAT。这套架构我在实际项目里用过,各管一段,非常稳定。做方案选型时你先问自己:存储介质是几百 KB 到几十 MB 的裸 Flash,还是几十 GB 以上的可移动闪存?前者选 littlefs,后者选 exFAT,基本不会跑偏。
6. 常见问题排查与开源驱动现状
最后进入实战环节。把一个 exFAT 分区放进 Linux、Windows、macOS 上配合使用,最容易遇到的问题基本都在下面这几类里。
6.1 Linux 内核 5.4 之后:原生支持不只省了一个 FUSE
2019 年之前,Linux 挂载 exFAT 要用 fuse-exfat 这种用户态方案,性能一般,而且依赖用户态进程存活。内核 5.4 合并 exFAT 驱动后(配套工具整理为 exfatprogs),挂载就变成了很常规的操作:
mount -t exfat /dev/sdb1 /mnt/usb如果你在 Linux 上挂载 exFAT 报错“unknown filesystem type ‘exfat’”,十有八九是内核编译时没打开 CONFIG_EXFAT_FS。在 Ubuntu/Debian 系,安装 exfat-fuse 或 exfatprogs 包后可以解决;在编译内核的板子上,记得检查 File systems → DOS/FAT/EXFAT → exFAT filesystem support 是否选上。
挂载时我想提一个容易被忽略的点:exFAT 分区卸载前,尽量用 sync 或直接 umount,不要直接拔卡。虽然内核的块层和 VFS 会在 umount 时把脏页刷回去,但在异常中断过程中,正在写的文件很可能不完整。VFS 层处理的是缓存一致性的最后一道保障,它救不了文件系统内部的元数据不一致窗口。
6.2 格式化工具和簇大小选择
格式化 exFAT 在 Windows 上右键格式化就有,Linux 上用 exfatprogs 的 mkfs.exfat:
mkfs.exfat -n MyUSB /dev/sdb1如果想指定簇大小:
mkfs.exfat -c 64K -n MyUSB /dev/sdb1簇大小的选择建议是:默认值通常是最均衡的。如果你使用场景以大型顺序读写为主(视频、镜像、备份),可以把簇加大到 64KB 甚至 128KB,减少簇的数量和跳转,提高顺序带宽;如果会有大量小文件(几百字节到几 KB),簇太大会浪费空间,保持 4KB 或默认就好。顺便提醒一下,某些设备固件(比如老相机)对簇大小敏感,跨设备共享的卡不要随便加大簇,否则可能出现“卡片需要重新格式化”的问题。
6.3 为什么 exFAT 上没有“特殊权限与属性管理”
有人搜“文件系统特殊权限与属性管理”搜到了 exFAT,可能会觉得奇怪:exFAT 里怎么没有权限设置?答案很简单:exFAT 作为面向通用存储设备的格式,根本没有文件所有者、用户组、访问控制列表这些概念。你在 Windows 的 exFAT 盘上右键设置权限,会发现相关选项不可用;在 Linux 上挂载 exFAT 后尝试 chmod、chown,要么报错要么无效。这不是驱动没写好,而是文件系统本身就不存这些信息。如果工作中需要权限管理和文件链接,选 ext4 或 NTFS 更合适。同理,setuid、sticky bit、扩展属性 xattr、软链接这些“特殊权限与属性管理”功能,exFAT 全都没有,设计目标决定了它不需要这些,只需要保证“从 A 设备拷到 B 设备,文件还是那个文件,足够简单通用”。
6.4 分区损坏之后的检查与修复
exFAT 也提供基本的修复手段。Windows 上 chkdsk 可以直接处理 exFAT 分区;Linux 上 exfatprogs 提供了 fsck.exfat:
fsck.exfat /dev/sdb1它会检查位图和目录项的一致性,重建位图、清除坏目录项。但要注意:fsck.exfat 对“空间泄漏”和“标记不一致”修复效果不错,但对已经被覆盖的数据无能为力。万一遇到文件被误删但又没写入新数据的情况,想恢复文件,一定要第一时间把分区做成镜像(dd 或取证工具),在镜像上操作,而不是直接在原盘上反复读写。我做恢复的时候吃过亏:一开始没做镜像,直接在原盘上跑扫描工具,结果工具把某些“看似空闲”的簇当可用空间写入了,覆盖了关键目录项,原本有机会恢复的文件彻底没戏。这是个典型的反面教材,记下来能少交很多学费。
把 exFAT 吃透之后,我最大的感受是它把“轻量”和“大文件”这两个看似矛盾的目标平衡得非常好。但在实际项目里用得顺手的前提,真就三个:平时别乱断电,拔卡先同步,定期 fsck。最后分享一个实用小技巧:如果你的 exFAT 盘要长时间作为视频监控或行车记录仪存储,格式化时把簇大小设为 64KB,能明显减少写入放大和不连续分配的概率,长期运行会更稳。