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 进入官网购买。