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 把文件导出。
为什么 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 可能表示过去存在什么。
- 删除候选是历史中存在、但当前基线不再匹配的文件。
扫描器需要找什么
有价值的 APFS 删除候选不仅需要文件名,还需要身份信息和数据位置信息。
身份信息包括:
- 文件名。
- 父目录。
- 逻辑大小。
- 文件 mode 和类型。
- inode 与目录记录证据。
数据位置信息包括:
- file extent 列表。
- 每个 extent 的 logical offset。
- 物理 block 地址。
- extent 长度。
扫描阶段
1. 识别 APFS container 和 volume
工具以只读方式打开源设备或镜像,然后识别 APFS container 里的 volume。用户选择要扫描的 volume。
2. 建立当前基线
当前文件树会先被解析。它会产生当前仍然存在的文件基线。这个基线用于避免把正常存在的文件误报成删除文件。
3. 回看历史元数据
建立基线后,扫描器会遍历多个历史来源:
- APFS checkpoint descriptor history。
- APFS snapshots。
- OMAP root history。
- 近期 OMAP transaction history。
- 普通元数据不完整时,可选 orphan metadata 扫描。
4. 与当前基线比较
历史文件记录需要通过几层过滤,才会成为删除候选:
- 至少有一个可读 extent。
- 满足最小文件大小等过滤条件。
- 默认过滤系统路径噪声。
- 不能匹配当前基线。
- 不能是已经输出过的重复候选。
还原阶段
还原会使用候选所属的历史 transaction id 和 object id,重新回到对应历史视图。然后再次定位文件记录,读取 extent 列表,并按 extent 导出文件内容。
extent 如何重建文件
extent 表示文件某段逻辑字节范围位于哪些物理 APFS block。小文件可能只有一个 extent;大文件或碎片化文件可能有多个 extent。
如果某段是 sparse range,导出器会写零字节,让恢复文件保持正确的逻辑布局。
为什么 APFS 恢复会失败
APFS 恢复依赖两个条件:
- 历史元数据还存在。
- 历史元数据指向的数据块还没有被覆盖。
如果旧元数据已经消失,扫描器可能不知道文件名、路径或 extent 布局。如果数据块已经被覆盖,仅靠 APFS 元数据也无法重建原始内容。
实操建议
- 发现误删后尽快停止写入源盘。
- 长时间扫描前优先做磁盘镜像。
- 恢复输出写到另一块物理磁盘。
- 先做历史元数据扫描。
- 找不到目标时再做更深的 metadata 或 signature scan。
- 批量恢复前先预览重要媒体文件。
技术来源
- Apple: Apple File System Guide。
- Apple Developer Documentation: About Apple File System。
FAQ
APFS 一定能恢复已删除文件吗?
不能。恢复取决于旧元数据和旧数据块是否仍然存在。
APFS 恢复等于 raw file carving 吗?
不等于。基于元数据的 APFS 恢复会尽量使用历史文件记录和 extent。raw carving 主要搜索文件签名,可能丢失文件名和碎片布局。
为什么恢复文件必须写到另一块磁盘?
写回源盘可能覆盖仍然需要恢复的数据块。