Back to blog

APFS 删除文件还原:checkpoint、OMAP 历史与 extent

用技术博客形式解释 APFS 删除文件还原:如何比较当前文件基线与旧 checkpoint、snapshot、OMAP 历史,并按 extent 导出文件。

APFS 删除文件还原:checkpoint、OMAP 历史与 extent

APFS 删除文件还原不只是全盘搜索文件头。更高置信度的方式是从 APFS 元数据入手:当前文件树、旧 checkpoint、snapshot、对象映射历史,以及指向真实数据块的 file extent。

这篇文章用图文方式说明 Ed Recovery 对普通 APFS 卷的恢复思路,并加入官方技术来源,方便读者和搜索引擎理解页面主题。

English version: APFS Deleted File Recovery.

简短结论

APFS 文件删除后,当前目录树通常不再显示它。但旧 APFS 元数据可能仍然描述这个文件。只要旧元数据还包含文件记录,并且旧数据块没有被覆盖,工具就有机会按 extent 把文件导出。

Rendering diagram...

为什么 APFS 历史元数据有用

APFS 是 copy-on-write 文件系统。它不会总是原地覆盖旧结构,而是通过事务版本记录新的文件系统状态。旧元数据在空间被复用之前,可能仍然留在磁盘上。

Apple 的归档文档 Apple File System Guide 介绍了 APFS 的 snapshot、clone、space sharing 和 copy-on-write 等概念。Apple Developer 也提供了 About Apple File System 作为高层说明。

对恢复来说,关键点是:

  • 当前 APFS tree 表示现在还存在什么。
  • 历史 APFS metadata 可能表示过去存在什么。
  • 删除候选是历史中存在、但当前基线不再匹配的文件。
Rendering diagram...

扫描器需要找什么

有价值的 APFS 删除候选不仅需要文件名,还需要身份信息和数据位置信息。

身份信息包括:

  • 文件名。
  • 父目录。
  • 逻辑大小。
  • 文件 mode 和类型。
  • inode 与目录记录证据。

数据位置信息包括:

  • file extent 列表。
  • 每个 extent 的 logical offset。
  • 物理 block 地址。
  • extent 长度。
Rendering diagram...

扫描阶段

1. 识别 APFS container 和 volume

工具以只读方式打开源设备或镜像,然后识别 APFS container 里的 volume。用户选择要扫描的 volume。

Rendering diagram...

2. 建立当前基线

当前文件树会先被解析。它会产生当前仍然存在的文件基线。这个基线用于避免把正常存在的文件误报成删除文件。

Rendering diagram...

3. 回看历史元数据

建立基线后,扫描器会遍历多个历史来源:

  • APFS checkpoint descriptor history。
  • APFS snapshots。
  • OMAP root history。
  • 近期 OMAP transaction history。
  • 普通元数据不完整时,可选 orphan metadata 扫描。
Rendering diagram...

4. 与当前基线比较

历史文件记录需要通过几层过滤,才会成为删除候选:

  • 至少有一个可读 extent。
  • 满足最小文件大小等过滤条件。
  • 默认过滤系统路径噪声。
  • 不能匹配当前基线。
  • 不能是已经输出过的重复候选。
Rendering diagram...

还原阶段

还原会使用候选所属的历史 transaction id 和 object id,重新回到对应历史视图。然后再次定位文件记录,读取 extent 列表,并按 extent 导出文件内容。

Rendering diagram...

extent 如何重建文件

extent 表示文件某段逻辑字节范围位于哪些物理 APFS block。小文件可能只有一个 extent;大文件或碎片化文件可能有多个 extent。

Rendering diagram...

如果某段是 sparse range,导出器会写零字节,让恢复文件保持正确的逻辑布局。

为什么 APFS 恢复会失败

APFS 恢复依赖两个条件:

  • 历史元数据还存在。
  • 历史元数据指向的数据块还没有被覆盖。
Rendering diagram...

如果旧元数据已经消失,扫描器可能不知道文件名、路径或 extent 布局。如果数据块已经被覆盖,仅靠 APFS 元数据也无法重建原始内容。

实操建议

  1. 发现误删后尽快停止写入源盘。
  2. 长时间扫描前优先做磁盘镜像。
  3. 恢复输出写到另一块物理磁盘。
  4. 先做历史元数据扫描。
  5. 找不到目标时再做更深的 metadata 或 signature scan。
  6. 批量恢复前先预览重要媒体文件。

技术来源

FAQ

APFS 一定能恢复已删除文件吗?

不能。恢复取决于旧元数据和旧数据块是否仍然存在。

APFS 恢复等于 raw file carving 吗?

不等于。基于元数据的 APFS 恢复会尽量使用历史文件记录和 extent。raw carving 主要搜索文件签名,可能丢失文件名和碎片布局。

为什么恢复文件必须写到另一块磁盘?

写回源盘可能覆盖仍然需要恢复的数据块。