ddrescue 的适用场合
当介质存在坏道、读取频繁报错时,普通 dd 会在错误处反复重试甚至卡死,既拖长现场时间又加速介质劣化。ddrescue 的设计目标是「先把能读的读出来」:它按块记录读取状态到映射文件,可随时中断并精确续跑,还支持跳过已验证区域、反向读取与多轮重试。对可疑硬盘、老化的 U 盘与存储卡,它是首选的采集工具。
基本信息
| 适用平台 | Linux/Unix(GNU ddrescue,包名 gddrescue) |
|---|---|
| 核心参数 | -d 直接访问设备、-r N 重试次数、第三个位置参数为映射文件 |
| 常用开关 | -n 跳过刮擦阶段快速抓取、-b 指定扇区大小、-R 反向、-f 强制 |
| 产物 | 镜像文件与映射文件(记录每块的读取状态) |
| 查看进度 | ddrescuelog -t 映射文件,输出各状态区块统计 |
| 关键约束 | 映射文件必须与镜像一起保留,否则无法续跑与复核 |
典型使用场景
- 硬盘出现坏道,需要尽快把可读数据固定下来
- 现场时间有限,先快速抓取主要区域,之后再补读疑难区
- 采集过程可能被中断(供电、时间窗口),需要可续跑方案
- 需要一份出错区域的「地图」,用于说明证据缺口范围
- 对老化介质避免重复读取,防止进一步劣化
- 为客户交付时说明哪些扇区未能读取
分阶段采集与续跑
分阶段采集与续跑
# 第一阶段:跳过刮擦,尽快把可读区域抓下来
ddrescue -n /dev/sdb /evidence/sdb.dd /evidence/sdb.map
# 第二阶段:对未读区域多轮重试(-r3 表示三轮)
ddrescue -d -r3 /dev/sdb /evidence/sdb.dd /evidence/sdb.map
# 中断或断电后,重复同一条命令即可从上次位置续跑
ddrescue -d -r3 /dev/sdb /evidence/sdb.dd /evidence/sdb.map
# 查看映射统计:已读、未读、坏块等状态
ddrescuelog -t /evidence/sdb.map
# 输出汇总信息,便于写入采集记录
ddrescuelog -v /evidence/sdb.map | head -20
# 完成后计算镜像哈希并记录
sha256sum /evidence/sdb.dd | tee /evidence/sdb.sha256映射状态与判读
| 项 | 含义 | 判读要点 |
|---|---|---|
| finished / rescued | 已成功读取的比例 | 未达 100% 时报告要注明缺口范围 |
| bad areas | 判定为坏的区域块数 | 数量与位置决定是否还能恢复关键文件 |
| non-tried | 尚未尝试的区域 | 分阶段采集时该值应随轮次下降 |
| non-trimmed/non-scraped | 未修剪或未刮擦的区域 | 进入重试阶段后会逐步收敛 |
| errsize | 出错区域总大小 | 用于评估数据损失范围,写入采集记录 |
介质持续报错时,先在原盘上尽快完成镜像,后续所有分析都针对镜像进行。在现场反复读取只会加速劣化,还可能让原本可读的区域也变得不可读。
首轮不要直接上高重试次数:先用 -n 快速抓取,再对剩余区域分轮重试,整体耗时更短且对介质更友好。重试次数按需逐步提高,避免长时间卡在个别坏块上。