首页/系统/Linux 运维命令速查/ddrescue 数据救援复制
磁盘与文件系统51 条

ddrescue 数据救援复制

ddrescue 是坏盘克隆利器:跳过坏扇区、记录日志、支持多轮重试,把能读的数据先救出来,避免普通复制一遇坏块就整体中断。

Linux 运维命令速查系统更新于 2026-10-13

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 精修;坏区极多时宁可多跑几轮短时间,也别长时间死磕同一块坏区,发热与机械反复定位都会加重损伤。

易错点

  • 把目标盘写错:-f 会强制覆盖目标上的文件系统,执行前用 lsblk 核对容量与型号,或用 /dev/disk/by-id 路径排除掉换顺序的干扰
  • 对着正在承载业务的源盘在线救援:持续新写入让坏区读出率下降,条件允许先停业务或转只读挂载再开工
  • 中途删掉或丢失 mapfile:全部进度归零只能从头再抄,mapfile 应放在独立磁盘并留副本
  • 用 dd 代替 ddrescue 抢救坏盘:dd 遇 I/O 错误直接失败或不记录进度,反复白读还加速坏盘损耗

数据来源与参考

  • GNU ddrescue 官方手册(info ddrescue)
  • man 1 ddrescue

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌