Ddrescue 磁盘抢救工具教程

GNU ddrescue 是一款专业的磁盘数据抢救工具,专门用于从存在坏道或物理故障的磁盘中提取数据。与普通的 dd 命令不同,ddrescue 采用智能算法,先复制正常区域的数据,然后多次尝试读取故障区域,最大程度地从损坏的磁盘中挽回数据。对于运维人员来说,掌握 ddrescue 是应对磁盘故障的关键技能。

一、ddrescue 与 dd 的区别

虽然名字相似,但 ddrescue 和 dd 有本质区别:

  • dd:遇到坏道时会卡住或报错退出,无法跳过故障区域继续工作。
  • ddrescue:智能跳过坏道,先复制可读区域,再回头尝试故障区域。
  • 日志文件:ddrescue 使用 mapfile(日志文件)记录进度,支持中断后续传。
  • 多次尝试:ddrescue 可以多次运行,每次尝试恢复更多数据。

注意:GNU ddrescue(命令名为 ddrescue)与 dd_rescue(命令名为 dd_rescue)是两个不同的工具,本文介绍的是 GNU ddrescue。

二、安装 ddrescue

2.1 在 Ubuntu/Debian 上安装

apt update
apt install gddrescue -y

# 验证安装
ddrescue --version

2.2 在 CentOS/RHEL 上安装

yum install epel-release -y
yum install ddrescue -y

2.3 从源码编译

wget https://ftp.gnu.org/gnu/ddrescue/ddrescue-1.28.tar.lz
tar --lzip -xf ddrescue-1.28.tar.lz
cd ddrescue-1.28
./configure
make
make install

三、基本使用方法

3.1 基本语法

ddrescue [选项] 源设备 目标文件 日志文件

3.2 第一阶段:快速复制

先进行快速复制,跳过所有读取困难的区域:

# 从故障磁盘复制到镜像文件
ddrescue -f -n /dev/sda /backup/disk_rescue.img /backup/rescue.log

# 参数说明:
# -f       强制写入(目标是设备时需要)
# -n       不进行坏道重试(第一阶段只做快速复制)
# /dev/sda       源磁盘
# disk_rescue.img  目标镜像文件
# rescue.log     日志文件(必须指定)

3.3 第二阶段:尝试恢复坏道

快速复制完成后,再运行 ddrescue 尝试读取之前跳过的区域:

# 重试坏道区域(使用相同的日志文件)
ddrescue -f -d -r3 /dev/sda /backup/disk_rescue.img /backup/rescue.log

# 参数说明:
# -d    使用直接 I/O(绕过系统缓存)
# -r3   最多重试 3 次

3.4 磁盘到磁盘克隆

# 从故障磁盘克隆到新磁盘
ddrescue -f -n /dev/sda /dev/sdb /backup/rescue.log

# 第二阶段
ddrescue -f -d -r3 /dev/sda /dev/sdb /backup/rescue.log

四、高级选项

4.1 限制读取范围

# 只恢复前 10GB 数据
ddrescue -f -n -s 10GiB /dev/sda /backup/disk_rescue.img /backup/rescue.log

# 从指定偏移量开始恢复
ddrescue -f -n -i 1GiB /dev/sda /backup/disk_rescue.img /backup/rescue.log

# 恢复特定分区范围
ddrescue -f -n -i 2048s -s 500GiB /dev/sda /backup/disk_rescue.img /backup/rescue.log

4.2 控制读取速度

# 限制读取速率(减少对故障磁盘的压力)
ddrescue -f -n -K 100MiB /dev/sda /backup/disk_rescue.img /backup/rescue.log

# 设置超时时间(跳过长时间无响应的区域)
ddrescue -f -n -T 30s /dev/sda /backup/disk_rescue.img /backup/rescue.log

4.3 查看日志文件状态

# 查看恢复进度和状态
ddrescuelog -t /backup/rescue.log

# 显示已恢复和未恢复的区域统计
ddrescuelog -d /backup/rescue.log

# 检查是否有未恢复的区域
ddrescuelog -s /backup/rescue.log

五、处理恢复的镜像文件

5.1 挂载镜像文件

# 挂载整盘镜像(需要计算分区偏移量)
fdisk -l /backup/disk_rescue.img

# 假设分区起始扇区为 2048,扇区大小 512 字节
mount -o loop,offset=$((2048*512)) /backup/disk_rescue.img /mnt/recovery

# 如果是单分区镜像
mount -o loop /backup/partition_rescue.img /mnt/recovery

5.2 使用 kpartx 自动识别分区

# 安装 kpartx
apt install kpartx -y

# 自动映射镜像中的分区
kpartx -av /backup/disk_rescue.img

# 挂载映射的分区
mount /dev/mapper/loop0p1 /mnt/recovery

# 完成后清理
umount /mnt/recovery
kpartx -dv /backup/disk_rescue.img

5.3 修复文件系统

# 检查和修复 ext4 文件系统
e2fsck -f /backup/partition_rescue.img

# 检查和修复 NTFS 文件系统
ntfsfix /backup/partition_rescue.img

六、实用案例

6.1 抢救即将报废的服务器硬盘

# 第一步:检查磁盘 SMART 状态
smartctl -a /dev/sda

# 第二步:快速复制(优先级最高)
ddrescue -f -n -c 256 /dev/sda /backup/rescue.img /backup/rescue.log

# 第三步:带重试的深度恢复
ddrescue -f -d -r3 -c 64 /dev/sda /backup/rescue.img /backup/rescue.log

# 第四步:检查恢复结果
ddrescuelog -t /backup/rescue.log

6.2 通过网络远程抢救数据

# 在目标服务器上监听
nc -l -p 9000 > /backup/remote_rescue.img &
nc -l -p 9001 > /backup/remote_rescue.log &

# 在源服务器上发送数据
ddrescue -f -n /dev/sda >(nc target_server 9000) >(nc target_server 9001)

6.3 使用 ddrescue 恢复 USB 设备

# 恢复 U 盘数据
ddrescue -f -n /dev/sdb /backup/usb_rescue.img /backup/usb_rescue.log

# 重试
ddrescue -f -d -r5 /dev/sdb /backup/usb_rescue.img /backup/usb_rescue.log

# 使用 PhotoRec 从镜像中提取文件
photorec /backup/usb_rescue.img

七、注意事项

  • 日志文件至关重要:始终指定日志文件(mapfile),它记录了哪些区域已复制、哪些需要重试。没有日志文件就无法续传。
  • 目标空间充足:确保目标磁盘或存储空间至少与源磁盘一样大。
  • 避免写入源磁盘:在抢救过程中绝对不要向源磁盘写入任何数据。
  • 温度监控:长时间读取故障磁盘可能导致过热,注意监控温度。
  • 先镜像后分析:始终先用 ddrescue 创建完整镜像,然后在镜像上进行数据恢复操作,避免对故障磁盘的多次读取。

总结

GNU ddrescue 是面对磁盘物理故障时最有效的数据抢救工具之一。它的智能算法和日志续传功能使其远优于普通的 dd 命令。在日常运维中,建议将 ddrescue 纳入应急工具箱。同时,配合 Smartmontools 进行磁盘健康监控,可以在磁盘故障前提前预警。选购搬瓦工 VPS 请参考 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的优惠,通过 bwh81.net 进入官网购买。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。