文件系统基础:理解 FAT32、NTFS 与 ext4

做数据恢复,说白了就是在跟文件系统打交道。你想想看,硬盘本身只是一堆磁片,数据能存进去、能读出来,全靠文件系统在中间当「大管家」。我刚开始做这行时,总觉得文件系统太底层、太枯燥,直到有一次帮客户恢复一块摔过的移动硬盘——里面是 FAT32 格式,结果目录结构全乱了。嗯,那次我花了整整两天手工拼目录项,从那以后我再也不敢轻视文件系统了。

文件系统到底是什么?

文件系统定义了数据怎么存、怎么找、怎么删。它干三件事:

  • 空间管理——记录哪些扇区是空的,哪些被占了
  • 目录结构——把文件名、路径映射到实际存储位置
  • 元数据管理——存文件的创建时间、大小、权限等「数据的数据」

我个人习惯把文件系统比作图书馆:书(数据)放在书架上,目录卡片(元数据)告诉你书在哪。如果目录卡片丢了,书还在,但你找不到。数据恢复的核心,就是找回这些「目录卡片」。

三大主流文件系统对比

特性 FAT32 NTFS ext4
最大文件 4GB 16EB 16TB
最大分区 2TB 256TB 1EB
日志功能 无 有($LogFile) 有(jbd2)
权限控制 无 ACL POSIX ACL
碎片处理 差 好 好
恢复难度 低(结构简单) 中(MFT 复杂) 高(inode 分散)

关键点:FAT32 结构最简单,所以恢复成功率最高。NTFS 的 MFT 是恢复的「命门」。ext4 的 inode 和块组设计让深度恢复变得非常棘手。

FAT32:简单但脆弱

FAT32 用一张「文件分配表」来记录簇的占用情况。每个文件在目录项里存首簇号,然后顺着 FAT 表往下找就能拼出完整文件。

删除时发生了什么?

  1. 目录项的第一个字节被改成 0xE5(标记删除)
  2. FAT 表中该文件占用的簇链全部清零
  3. 数据区的实际内容 没有擦除

这就是为什么 FAT32 下误删文件很容易恢复——只要目录项还没被覆盖,首簇号还在,顺着 FAT 表就能找回。我曾经帮一个摄影师恢复过一张 CF 卡,里面全是 RAW 格式照片。卡被格式化后又拍了十几张,但大部分目录项还在,我用工具扫了一遍,找回了 90% 的照片。

恢复技巧:FAT32 下恢复文件,优先找目录项里的首簇号和文件大小。如果目录项被覆盖了,可以尝试按文件类型特征(文件头签名)做「文件雕刻」。

NTFS:MFT 是核心

NTFS 把所有文件和目录的信息都放在 MFT(主文件表) 里。每个文件在 MFT 中占一条记录(通常 1KB),记录里包含文件名、时间戳、数据属性等。

删除时发生了什么?

  1. MFT 记录中文件名的第一个字节被标记为删除
  2. MFT 记录的位图标记为「空闲」
  3. 数据区的簇在 $Bitmap 中被标记为「未使用」
  4. 实际数据 仍然保留,直到被新文件覆盖

这里有个坑:NTFS 的 MFT 记录如果被重用,文件名和时间戳可能还在,但数据指针会被清零。我遇到过好几次,客户说「文件还在,但打不开」,一查 MFT 记录里的数据运行(Data Run)已经被覆盖了。这种情况只能靠文件签名去碰运气。

避坑指南:NTFS 下恢复大文件时,注意文件是否「碎片化」。如果 MFT 记录里有多条 Data Run,必须全部解析出来才能拼出完整文件。我曾经因为漏了一条 Data Run,恢复出来的视频文件后半段全是雪花。

ext4:inode 与块组

ext4 把磁盘分成多个块组(Block Group),每个块组有自己的 inode 表和数据块位图。文件通过 inode 找到数据块,目录通过 inode 找到子文件和子目录。

删除时发生了什么?

  1. 目录项中该文件的 inode 号被清零
  2. inode 表中的链接计数减 1(如果为 0,标记为删除)
  3. 数据块位图中对应的块标记为「空闲」
  4. 实际数据 仍然保留

ext4 的恢复难点在于 inode 分散在各个块组里,而且删除后 inode 结构可能被部分清零。我做过一个 Linux 服务器的恢复案例,ext4 分区被 rm -rf 删了整整一个目录树。好在文件系统刚删完,inode 表还没被重用,我用 debugfs 手工导出了 inode 信息,配合文件签名恢复了大部分数据。

元数据与目录结构

元数据就是「关于数据的数据」。没有元数据,文件就是一盘散沙。三大文件系统的元数据核心对比如下:

文件系统 元数据核心 目录结构 恢复关键
FAT32 目录项(32字节) 链表式目录 首簇号 + FAT 表
NTFS MFT 记录(1KB) B+ 树索引 MFT 记录 + Data Run
ext4 inode(256字节) 哈希树目录 inode + 块位图

目录结构说白了就是一张「地图」。FAT32 用链表,NTFS 用 B+ 树,ext4 用哈希树。链表最简单,但查找慢;B+ 树和哈希树快,但结构复杂,恢复时容易出错。

文件存储与删除机制

文件存储的核心逻辑其实都一样:

  1. 文件系统把磁盘分成固定大小的块(簇/块)
  2. 新文件写入时,分配空闲块,记录块号到元数据中
  3. 删除时,只标记元数据中的块为「空闲」,不擦数据

为什么会这样?因为擦除数据需要额外的 I/O 操作,会拖慢性能。操作系统默认「信任用户」——你删文件就是真的想删,不会反悔。但对我们做恢复的人来说,这个「信任」就是机会。

核心原则:只要数据块没有被新文件覆盖,理论上就能恢复。覆盖一次还能恢复部分,覆盖两次以上基本没戏。所以发现误删后,第一时间断电或只读挂载,别做任何写入操作。

知识体系总览

下面这张图把本章的核心逻辑串起来了。你看一遍,应该能对文件系统有个整体印象。

文件系统核心知识体系 文件系统核心知识体系 FAT32 NTFS ext4 元数据管理 目录项 / MFT 记录 / inode 文件存储与删除机制 簇/块分配 → 元数据记录 → 删除只标记不擦除 数据恢复核心 解析元数据 → 定位数据块 → 拼接文件 恢复成功率取决于:元数据完整性 + 数据块是否被覆盖

这张图从三大文件系统出发,一路走到元数据、存储机制,最后落到恢复核心。你记住一句话就行:恢复的本质是逆向解析文件系统的元数据。后面几章我们会深入每个文件系统的具体恢复手法,但底层逻辑都是这张图。

个人建议:学文件系统最好的方法就是拿一个 U 盘,用十六进制编辑器(比如 HxD 或 WinHex)直接看原始数据。FAT32 的目录项、NTFS 的 MFT 记录、ext4 的 inode,亲眼看到比背一百遍都管用。我当年就是这么入门的。