← 返回博客

什么是 $MFTMirr,NTFS 何时会用到它?

· 阅读 2 分钟

简短回答: $MFTMirr 是一个小文件,内含 MFT 前几条记录的副本 —— 至少是记录 0–3($MFT$MFTMirr$LogFile$Volume),通常是前 16 条。当主 $MFT 无法读取时,NTFS 借助它来引导恢复。如果主 MFT 和它的镜像都不可读,你就会从 chkdsk 看到 「Windows cannot recover master file table」

为什么要有一个镜像

Master File Table 的前几条记录是关键的:记录 0 描述 $MFT 自身、记录 2 是 $LogFile、记录 3 是 $Volume。如果 $MFT 开头处的字节损坏,NTFS 就无法找到卷上的其他任何文件 —— 包括它本来想用来恢复的事务日志。

镜像解决了这一循环依赖。$MFTMirr 是位于不同物理位置的独立文件,保存着那些前几条记录的副本。驱动程序挂载一个卷时,会从 $MFT 读取记录 0;如果失败,就退回到 $MFTMirr 中的记录 0,用这份副本去重新定位其余部分。

它位于何处

$MFTMirr 是 MFT 记录 1。它的 $DATA 属性是非常驻的,其簇运行传统上指向 卷的中部 —— 与 $MFT 本身有足够的距离,以避免某一处局部故障(一个坏簇,跨一片区域的撕裂写入)同时摧毁两者。

现代 NTFS 版本把它放在 LCN clusterCount / 2 处。在一个 500 GB 的卷上,这会把镜像放在大约 250 GB 的位置。

你可以从活动系统定位它:

fsutil file queryextents C:\$MFTMirr

它包含什么

$MFTMirr 存放 MFT 前几条记录的逐字节副本。早期保证的是前 条记录(0–3);当前的 Windows 版本镜像的是前 十六 条 —— 完整的 NTFS 元数据集合,详见 master file table 参考

每一份副本都是一条正常的 MFT 记录,fixup 数组等一应俱全。指向 $MFTMirr 的解析器,走它的方式与走 $MFT 完全一致。

NTFS 在挂载时如何使用它

在健康的挂载中,驱动程序根本不会动 $MFTMirr。在受损的挂载中:

  1. $MFT 记录 0。
  2. 如果读取返回 I/O 错误或 fixup 校验失败,改为读 $MFTMirr 的记录 0。
  3. 如果镜像里的记录 0 副本有效,就用它的数据 run 来定位磁盘上的 $MFT
  4. 正常继续。

镜像不必去 替换 $MFT —— 它只需要提供足够找到真表的信息即可。驱动程序通过镜像里的指针定位到 $MFT 之后,就改用活动表继续工作。

chkdsk 如何使用它

chkdsk 更激进。当它检测到 $MFT 前几条记录损坏时,会把每条记录与镜像做交叉对照。如果两份都有效但内容不同,chkdsk 会把镜像视为前几条关键记录的权威来源(其前提是活动记录是最近被更新的,并在更新中发生了损坏)。

如果 $MFT 不可读 并且 镜像也不可读,chkdsk 就会报告 Windows cannot recover master file table. CHKDSK aborted。到这一步,恢复就需要离线工具 —— 通常是在原始卷上做 FILE 记录的签名雕刻 —— 而不是 NTFS 内置的自修复。

为什么 $MFTMirr 不是完整备份

它只镜像那些元数据文件。记录 16 及以后 —— 每个用户文件和目录 —— 只存在于 $MFT 中。如果 $MFT 在记录 16 之后被损坏,镜像帮不上忙。镜像足以 挂载 这个卷;从损坏中恢复任意文件,仍然需要与没有它时同样的技术。

取证价值

$MFTMirr 在案件中很少是主要物件,但有两个用处:

  • 交叉校验。 镜像中的记录 0–15 应当与活动记录逐字节一致。如果出现分歧,就意味着某一边发生了带外修改(驱动 bug、刻意篡改、不完整的恢复)。
  • 损坏前的快照。 如果活动 $MFT 记录已被修改、但镜像尚未被刷写,镜像中保留的就是较旧的状态。这个时间窗很短 —— NTFS 会让两者保持同步 —— 但在突发故障的案件中,它可能是仅剩的一份干净副本。

常见问题

$MFTMirr 等同于整张 MFT 的备份吗?

不是。它只包含前几条记录(系统元数据文件)。用户文件不会被镜像。

我能用解析 $MFT 的同一套工具解析 $MFTMirr 吗?

可以。它在结构上完全一致 —— 相同的记录格式、相同的 fixup 数组、相同的属性。可以拖进浏览器解析器,或者喂给 MFTECmd

我能删除或移动 $MFTMirr 吗?

不能。与 $MFT 一样,只要 Windows 在运行,它就处于锁定状态。彻底禁用镜像并不是受支持的操作;chkdsk 会拒绝该卷。

如果我的磁盘没有 $MFTMirr 怎么办?

不存在这种情况。每个 NTFS 卷都有一个,是在格式化时创建的。如果 $MFTMirr 缺失或不可读,该卷就受损严重,chkdsk 会失败。

外部资源