硬盘误删别乱操作!这个 Rust 工具把“安全恢复”做到了极致

5 阅读13分钟

一、YanMiRestore 是什么?

YanMiRestore 是一个基于 Rust 编写的数据恢复工具,主要面向以下场景:

  • 电脑硬盘(HDD / SSD)
  • 移动硬盘、U 盘等外接存储
  • 手机导出的合法备份 / 镜像文件

它的定位并不是做一个“黑盒式的一键恢复神器”,而是做一个恢复过程清晰、默认安全、可审计追踪的恢复工具。

简单来说,它做的事情是:

  1. 先生成恢复方案
  2. 再对源介质进行只读扫描
  3. 最后按扫描报告决定是否执行恢复

这套流程看似“多了一步”,实际上非常专业。因为数据恢复最怕误操作,而 YanMiRestore 的设计,就是在尽量降低这种风险。

二、它已经实现了哪些能力?

从当前项目说明来看,YanMiRestore 已经具备 5 条可用恢复路径,这意味着它不是只能做“回收站找回”这种浅层恢复,而是已经覆盖了逻辑恢复、元数据恢复和签名雕刻三类常见路径。

1. 回收站 / 垃圾桶逻辑删除恢复

对于已经挂载的目录,YanMiRestore 会扫描常见的逻辑删除目录,例如:

  • $Recycle.Bin
  • RECYCLER
  • Recycler
  • RECYCLED
  • .Trash
  • .Trashes

这条路径适合那种“刚删除不久,系统还保留逻辑入口”的场景。 优点是恢复快、损坏概率低、能保留更多原始信息。

2. NTFS 删除 MFT 记录扫描

这是比较有技术含量的一块。

YanMiRestore 支持:

  • 扫描已删除的 MFT 记录
  • 解析 $DATA 属性
  • 处理常驻 / 非常驻数据
  • 解析数据运行列表(run list)

这意味着它不是简单地“找到一条删除痕迹”,而是能够进一步定位文件数据段,为后续恢复提供实际坐标。

如果你研究过 NTFS,就知道这一步非常关键:能不能从元数据走到真实数据段,决定了恢复是不是停留在“看到文件名”的层面。

3. FAT12/16/32 与 exFAT 删除目录项扫描

对于 FAT 系列文件系统,项目支持:

  • 删除目录项扫描
  • 尝试按链式簇重建
  • 或在特定场景下按连续簇假设重建文件段

这对 U 盘、旧设备、移动存储来说非常实用。 尤其是 exFAT,很多移动设备、U 盘、SD 卡都在用。

当然,项目也很诚实地说明了:在严重碎片化场景下,FAT/exFAT 仍可能只能恢复部分段,这一点非常真实。

4. ext4 删除 inode 扫描

在 Linux 场景下,YanMiRestore 支持:

  • 扫描 i_dtime != 0 的删除 inode
  • 解析 extent
  • 支持直连块映射提取

这说明它已经具备一定的 ext4 删除元数据恢复能力,而不是只靠“签名雕刻”去碰运气。

对于学习 Linux 文件系统恢复的同学来说,这一块很有参考价值。

5. 原始镜像签名雕刻恢复

当文件系统元数据损坏、目录项丢失、或者无法通过正常删除记录恢复时,YanMiRestore 还提供了签名雕刻能力。

当前支持的类型包括:

  • jpg
  • png
  • pdf
  • sqlite
  • docx
  • xlsx
  • mp4

签名雕刻的特点是: 不依赖完整目录结构,直接在原始镜像里搜索文件特征。

这是一种典型的“兜底方案”,适合在文件系统元数据失效时使用。 当然,它也有典型缺点:可能误报,也可能因为碎片化导致恢复结果不完整。

三、这个项目最亮眼的,不是功能,而是设计思路

很多人写工具,习惯先把功能堆起来。 但 YanMiRestore 给人的感觉是:它不是先堆功能,而是先立规矩。

它最值得肯定的地方,不是“支持了几个文件系统”,而是它把“安全恢复”这件事做成了默认行为。

1. 默认 dry-run,不直接写文件

recover 命令默认并不会直接导出文件,而是只生成恢复动作计划。

只有显式加上:

--execute

它才会真正写出恢复结果。

这个默认值特别专业。因为很多恢复事故,本质上不是工具不行,而是用户太着急,直接执行了高风险操作。 YanMiRestore 通过默认 dry-run,强行把“先看、再动手”变成了标准流程。

2. 强制阻止危险输出路径

项目对恢复目标路径做了严格限制:

  • 目标目录位于源路径内部:禁止
  • 目标目录是源目录父路径:禁止
  • 目标路径与源路径相同:禁止
  • Windows 下与源路径同卷:禁止

这一点真的很加分。

因为数据恢复里最危险的操作之一,就是把恢复结果写回源盘所在卷。 一旦发生覆盖,很多原本还能恢复的数据就真的没机会了。

YanMiRestore 直接从程序层拦截这种操作,而不是把风险留给用户自己“注意”。

3. 保留扫描报告和恢复清单

恢复流程中会生成:

  • scan-report.json 扫描报告
  • 恢复清单.json 恢复结果清单

这意味着整个恢复过程是可追踪的、可复盘的、可审计的。

这对于以下场景特别有意义:

  • 企业内部数据恢复
  • 合规审计
  • 批量恢复任务
  • 技术排查与复现
  • 项目演示与教学

四、命令设计非常清晰,适合实战

YanMiRestore 当前的核心命令有 4 个:

  • design
  • scan
  • recover
  • devices

这套命令设计很像一个完整的恢复流水线,而不是散乱的几个功能入口。

1. design:先生成恢复方案

这个命令会根据:

  • case-id
  • 目标类型
  • 扫描深度
  • 文件系统提示

生成一个恢复执行计划。

它会输出:

  • 阶段步骤
  • 安全规则
  • 前置假设

这一步非常像“恢复前评估”。 在实际项目中,这种设计非常有价值,因为它让恢复过程从“黑盒操作”变成“可解释流程”。

2. scan:只读扫描,生成统一报告

scan 是整个项目最核心的命令之一。

它可以:

  • 自动识别输入是挂载目录还是镜像文件
  • 自动识别目标类型
  • 支持交互确认
  • 支持 --yes 跳过确认,便于脚本化执行
  • 输出 JSON 扫描报告
  • 打印扫描摘要与文件系统统计信息

更关键的是:它是只读扫描

这意味着扫描过程中不会往源介质写入内容,尽可能保护原始现场。

3. recover:按扫描报告执行恢复

这个命令并不是直接重新扫源,而是读取扫描报告进行恢复。

不同候选项的处理方式也不同:

  • 逻辑项:从回收站路径复制
  • NTFS / ext4:按 source_segments 分段提取
  • 雕刻项:按 offset + size 从镜像提取

这说明项目在架构上已经做到了“扫描”和“恢复”解耦。 这种解耦的好处很大:

  • 扫描结果可复用
  • 恢复逻辑更清晰
  • 便于调试
  • 便于批处理
  • 更适合后续扩展 GUI 或任务系统

4. devices:自动识别设备

新增的 devices 子命令,可以列出本机可用设备,并自动标注为:

  • 电脑硬盘
  • 移动硬盘
  • 手机
  • 其他设备

这对普通用户特别友好。 因为很多用户根本不清楚自己要扫的是哪个路径,尤其是在 Windows 下,盘符、卷路径、可移动设备类型都容易搞混。

有了 devices,至少可以先识别设备,再做扫描,大幅降低误操作概率。

五、最近新增的几个功能,很明显是在往“可用工具”打磨

从项目更新内容来看,YanMiRestore 不只是能跑,而是在明显提升“用户体验 + 可配置性”。

1. 动态进度条

现在项目支持动态刷新进度条,包含:

  • 旋转符
  • 已耗时
  • 当前进度
  • 百分比
  • 阶段信息

而且扫描和恢复阶段都能显示。

这在恢复类工具里非常重要。因为恢复任务通常耗时较长,用户最怕的是:

  • 不知道程序是不是卡死了
  • 不知道进行到哪一步了
  • 不知道当前在处理什么

动态进度条解决的不是“好不好看”,而是“能不能安心等”。

2. --skip-carved

新增的 --skip-carved 参数非常实用。

它允许在恢复时: 只恢复文件系统候选项,跳过签名雕刻结果。

为什么这个功能重要?

因为雕刻恢复虽然常常能找到更多结果,但也更容易出现:

  • 文件碎片化
  • 恢复结果不完整
  • 误报
  • 文件损坏

如果你的目标是“先拿到更稳的结果”,那跳过雕刻项,优先恢复文件系统元数据指向的候选项,往往更合理。

3. YanMiRestore.toml 配置文件

这一点说明项目已经开始从“命令行工具”往“可配置的工程化工具”升级。

配置文件支持管理:

  • ui:进度条刷新频率、动画间隔、模板、旋转帧等
  • scan:逻辑扫描上限与回收站目录名
  • carver:雕刻读取范围、条目上限、格式阈值等
  • fs.ntfs / fs.fat / fs.ext4:文件系统扫描阈值
  • partition:分区解析上限
  • recovery:恢复缓冲区与卷对齐参数

这意味着你可以根据不同设备、不同容量、不同恢复策略,灵活调整扫描与恢复行为。

对于做批处理、做内部工具封装、做长期维护的人来说,这一步非常关键。

六、项目目录结构也很有参考价值

如果你正在学习 Rust 工程化项目结构,那 YanMiRestore 的目录划分值得借鉴。

它没有把所有逻辑塞进一个 main.rs,而是按职责拆成多个领域模块:

  • main.rs:程序入口
  • app:命令分发与流程编排
  • cli:参数定义
  • config:配置加载
  • error:统一错误类型
  • model:请求、计划、报告、设备等领域模型
  • scanner:扫描流程
  • recovery:恢复流程
  • report:输出与报告写入
  • device:设备识别
  • carver:签名雕刻
  • fs:文件系统扫描聚合(NTFS / FAT / ext4 / partition)

这样的拆分带来几个直接好处:

  1. 职责清晰,后续扩展不容易乱
  2. 文件系统模块可以独立维护
  3. 配置、模型、流程解耦明显
  4. 后期新增 APFS / F2FS / 更多雕刻格式时更容易扩展
  5. 更适合多人协作

对于一个恢复工具来说,这种结构说明它已经不再是“练手脚本”,而是具备了长期演进的基础。

七、一个推荐的实战使用流程

如果你真的要用这个工具,我建议按下面这个顺序来,最稳:

# 1)先生成恢复方案
cargo run -- design --case-id CASE-1001 --target-kind pc-disk --depth deep --include-carving

# 2)只读扫描,生成报告
cargo run -- scan --source E:\evidence\disk.img --output .\output --case-id CASE-1001 --target-kind pc-disk --depth deep --include-carving

# 3)先做恢复预演(不写文件)
cargo run -- recover --report .\output\CASE-1001-scan-report.json --destination G:\restore

# 4)确认无误后,再执行实际恢复
cargo run -- recover --report .\output\CASE-1001-scan-report.json --destination G:\restore --execute

这套流程的优点非常明显:

  • 先看方案,不盲扫
  • 先扫描,不直接写
  • 先预演,不急着导出
  • 确认无误,再执行恢复

这正是 YanMiRestore 的核心哲学: 恢复不是一锤子买卖,而是一个需要控制风险的过程。

八、它的“已知限制”反而是加分项

很多项目最怕的一件事,就是 README 写得像神仙下凡,实际一跑全是坑。

YanMiRestore 的一个优点是:它把限制写得很清楚。

比如当前仍存在这些边界:

  • NTFS 压缩 / 加密流尚未实现解码
  • FAT/exFAT 与 ext4 的某些删除项解析仍处于稳态占位实现
  • FAT/exFAT 在严重碎片化场景下可能只能恢复部分段
  • exFAT NoFatChain 仍依赖连续簇假设
  • ext4 尚未完整重建删除文件名
  • ext4 旧式多级间接块尚未完整解析
  • APFS / F2FS 目前仅能做签名探测
  • 签名雕刻本身存在误报风险
  • 手机场景仅面向合法导出数据,不涉及绕过加密

看起来像是“问题不少”,但实际上,这种明确边界的态度,比“什么都能恢复”的宣传靠谱得多。

因为数据恢复本来就不是一个“百分百成功”的领域。 把能力和边界说清楚,才是一个成熟工具该有的样子。

九、YanMiRestore 适合哪些人参考?

如果你是下面这几类人,我觉得这个项目都值得看:

1. Rust 学习者

你可以从中学习:

  • CLI 工具项目如何拆分模块
  • 如何设计命令流
  • 如何做统一错误处理
  • 如何做配置驱动
  • 如何构建更有工程味道的 Rust 项目

2. 系统工具开发者

这个项目很适合参考“高风险工具”的设计思路:

  • 如何做只读约束
  • 如何阻止危险路径
  • 如何做 dry-run
  • 如何保留执行报告
  • 如何把流程设计得更稳

3. 文件系统 / 数据恢复方向的技术研究者

如果你对以下内容感兴趣:

  • NTFS MFT 删除记录
  • FAT/exFAT 删除目录项
  • ext4 删除 inode
  • 原始镜像签名雕刻
  • 分区识别(MBR/GPT)

那么这个项目具备一定的学习与扩展价值。

4. 想做自己恢复工具的人

很多人想写恢复工具,但一开始就容易陷入“先实现扫描”的思路。 实际上,恢复工具更难的,往往不是扫描代码,而是安全约束和流程设计

YanMiRestore 提供了一个很好的切入点: 先把“恢复纪律”立住,再慢慢增强恢复能力。

十、我对这个项目的评价

一句话总结:

YanMiRestore 现在可能还不是“最强恢复工具”,但它已经是一套很有方向感的数据恢复工程框架。

它的价值不只是“支持了 NTFS / FAT / ext4 / 雕刻”,而是它在很早期就做对了几件特别重要的事:

  • 把“源盘只读”变成设计核心
  • 把“安全优先”落实到命令默认值和路径限制
  • 把“恢复过程”做成可追踪、可审计的流水线
  • 把项目结构做成了可持续演进的工程化模块

这类项目,最怕的是方向跑偏。 而 YanMiRestore 的方向,我认为是对的。

对于数据恢复这种高风险场景来说,先保证不伤源,再尽可能恢复,永远比“先扫出来再说”更专业。

结尾

如果你正在找一个适合学习的 Rust 实战项目,或者你想研究“如何做一个安全的数据恢复工具”,YanMiRestore 是一个非常值得关注的开源项目。

它现在当然还有不少可提升空间,但从当前设计来看,它已经具备了一个好项目最重要的东西:

清晰的边界、正确的方向、工程化的结构,以及对风险的敬畏。

这比单纯“功能多”更难得。