ddrescue 是什么
GNU ddrescue 是面向坏盘的数据救援复制工具:按块读源设备,把读失败的区域记录到映射日志后继续往下走,因此不会像 dd 那样碰到第一个坏块就整体中断。进度写在 mapfile 里,中断后可原地续做,也支持多轮重试把坏区慢慢啃下来。软件包名各发行版不同:Debian/Ubuntu 是 gddrescue,RHEL 系是 ddrescue,命令名统一为 ddrescue,需要 root 直读块设备。
基本信息
| 适用平台 | Linux 及多数类 Unix(直读块设备) |
|---|---|
| 权限要求 | root |
| 语法 | ddrescue [选项] 源 目标 [mapfile] |
| 安装 | Debian/Ubuntu: gddrescue;RHEL/CentOS: ddrescue |
| 关键选项 | -n 首轮跳坏区快抄;-d 直读设备;-r N 坏区重试轮数;-f 强制写目标 |
典型使用场景
- 机械盘或 SSD 出现读错误:先把整盘镜像到新盘,再对镜像做 fsck 与数据提取,避免反复读原盘加重损伤
- 分区表、超级块损坏,需要保留原始字节供后续分析或取证
- 换盘迁移:目标盘容量足够时做整盘克隆,坏区位置单独记录
- 盘序告警、阵列降级前的应急备份,先抢出可读数据再谈修复
- 演练救援流程:用普通镜像文件当源练习,不碰真盘
标准救援流程
标准救援流程
lsblk -o NAME,SIZE,MODEL # 核对源(坏盘)与目标(空盘);写错目标等于再毁一块盘
ddrescue -f -n /dev/sdb /dev/sdc /root/rescue.map # 第一轮:跳过坏区快速抄全盘,先保住好数据
ddrescue -d -r3 /dev/sdb /dev/sdc /root/rescue.map # 第二轮:-d 直读设备,坏区重试 3 轮
ddrescuelog -t /root/rescue.map # 查看救援率与坏区总分布
ddrescuelog -D /root/rescue.map # 列出未读出区域,必要时针对该区间再跑一轮
sync # 目标盘数据落盘后再拔线或挂载输出逐列读法
| 字段 | 含义 | 怎么判断 |
|---|---|---|
| rescued | 已成功读出的字节数与占比 | 占比越高越好;第二轮结束仍不到 100% 说明仍有坏区 |
| errsize | 尚未读出的区域总大小 | 第二轮后应明显下降,归零才算干净 |
| read errors | 读错误计数(按错误块折算,块大小见 --block-size,默认 512 字节) | 计数下降说明重试有效;持续增长提示坏区在扩散 |
| bad areas | 无法读出的区块个数 | 用于定位坏区落点,判断是否值得再跑一轮 |
| average rate / remaining time | 平均速率与预计剩余时间 | 速率骤降通常是撞上坏区,可暂停降温后再来一轮 |
目标盘容量不得小于源盘,-f 会强制写入已有文件系统的目标;源盘若仍在承载业务,先停写或改只读挂载,新写入会持续压低坏区读出率。mapfile 千万别删,它是断点续救的唯一依据。
首轮用 -n 跳坏区先把大部分数据拿到手,第二轮再用 -d -r3 精修;坏区极多时宁可多跑几轮短时间,也别长时间死磕同一块坏区,发热与机械反复定位都会加重损伤。