Linux:像专业人士一样使用 ddrescue 命令从崩溃的磁盘保存和恢复数据
G NU ddrescue是一个将数据从一个文件或块设备(硬盘、cd/dvd-rom 等)复制到另一个文件的程序,它是一个帮助您从崩溃的分区中保存数据的工具,即它是一个数据恢复工具。它会尝试读取,如果失败,它将继续读取下一个扇区,而 dd 等工具则会失败。如果复制过程被用户中断,则可以稍后在任何位置继续。它可以向后复制。
此程序对于在发生 I/O 错误时挽救数据非常有用,因为它不一定会中止或截断输出。这就是为什么您需要使用此程序而不是dd 命令的原因。多年来,我使用 Linux 上的 GNU ddrescue 从许多磁盘(CD/硬盘/软件 raid)恢复了大量数据。我强烈推荐 Linux 系统管理员使用此工具。
在 Debian/Ubuntu Linux 上安装 ddrescue
键入以下apt-get 命令来安装ddrescue:
# apt-get install gddrescue
示例输出:
Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: gddrescue 0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded. Need to get 49.6 kB of archives. After this operation, 152 kB of additional disk space will be used. Get:1 http://mirrors.service.networklayer.com/ubuntu/ precise/universe gddrescue amd64 1.14-1 [49.6 kB] Fetched 49.6 kB in 0s (1,952 kB/s) Selecting previously unselected package gddrescue. (Reading database ... 114969 files and directories currently installed.) Unpacking gddrescue (from .../gddrescue_1.14-1_amd64.deb) ... Processing triggers for install-info ... Processing triggers for man-db ... Setting up gddrescue (1.14-1) ...
在 RHEL/Fedora/CentOS Linux 上安装 ddrescue
首先在 RHEL/CentOS/Fedora Linux 上打开 EPEL repo。输入以下yum 命令:
# yum install ddrescue
示例输出:
Loaded plugins: product-id, rhnplugin, security, subscription-manager, : versionlock This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. This system is receiving updates from RHN Classic or RHN Satellite. Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package ddrescue.x86_64 0:1.16-1.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: ddrescue x86_64 1.16-1.el6 epel 81 k Transaction Summary ================================================================================ Install 1 Package(s) Total download size: 81 k Installed size: 189 k Is this ok [y/N]: y Downloading Packages: ddrescue-1.16-1.el6.x86_64.rpm | 81 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : ddrescue-1.16-1.el6.x86_64 1/1 Verifying : ddrescue-1.16-1.el6.x86_64 1/1 Installed: ddrescue.x86_64 0:1.16-1.el6 Complete!
您可以直接从官方 GNU项目网站下载 ddrescue ,并在 Linux 或类 Unix 系统上进行编译。
关于安全使用 ddrescue 的注意事项
- 您需要使用日志文件来恢复救援。
- 永远不要在读/写挂载分区上运行 ddrescue。
- 请勿尝试修复存在 I/O 错误的驱动器上的文件系统。
- 小心目标分区/设备,存储在那里的任何数据都将被覆盖。
如何使用 ddrescue 命令?
在此示例中,将 /dev/sda 恢复到 /dev/sdb
## No need to partition /dev/sdb beforehand, but if the partition table on /dev/sda ## ## is damaged, you will need to recreate it somehow on /dev/sdb. ## ddrescue -f -n /dev/sda /dev/sdb logfile ddrescue -d -f -r3 /dev/sda /dev/sdb logfile ## get list of partitions on a /dev/sdb ## fdisk /dev/sdb ## check for errors ## fsck -v -f /dev/sdb1 fsck -v -f /dev/sdb2
了解 ddrescue 命令选项
- -f:覆盖输出设备或分区。
- -n:不要尝试分裂或者重试失败的块。
- -d:使用直接磁盘访问输入文件。
- -r3:重试三 (3) 次后退出(用作-1无限次重试)。
- -b2048:输入设备的扇区大小[默认设置为512]。
示例:在 Linux 中将 /dev/sda3 中的分区恢复到 /dev/sdb3
## You need to create the sdb2 partition with fdisk first. sdb2 should be of appropriate type and size ## ddrescue -f -n /dev/sda2 /dev/sdb2 logfile ddrescue -d -f -r3 /dev/sda2 /dev/sdb2 logfile e2fsck -v -f /dev/sdb2 mount -o ro /dev/sdb2 /mnt ## Rread rescued files from /mnt ## cd /mnt ls -l ## Copy files using rsync ## rsync -avr . vivek@server1.example.com:/data/resuced/wks01
示例:在 Linux 上救援/恢复 /dev/dvdom 中的 DVD-ROM
语法是:
ddrescue -n -b2048 /dev/dvdrom dvd-image logfile ddrescue -d -b2048 /dev/dvdrom dvd-image logfile
请注意,如果没有错误(errsize 为零),dvd-image 现在包含 DVD-ROM 的完整映像,您可以在基于 Linux 的系统上将其写入空白 DVD-ROM:
# growisofs -Z /dev/dvdrom=/path/to/dvd-image
示例:恢复失败的救援
在此示例中,在将整个驱动器 /dev/sda 救援到 /dev/sdb 时,/dev/sda 在位置 XYZFOOBAR(问题扇区 # 7575757542)冻结:
## /dev/sda freezes here ## ddrescue -f /dev/hda /dev/hdb logfile ## So restart /dev/sda or reboot the server ## reboot ## Restart copy at a safe distance from the troubled sector # 7575757542 ## ddrescue -f -i 7575757542 /dev/sda /dev/sdb logfile ## Copy backwards down to the troubled sector # 7575757542 ## ddrescue -f -R /dev/sda /dev/sdb logfile
关于 dd_rescue 命令和语法的说明
在 Debian / Ubuntu 和其他一些发行版上,您最终会安装其他名为 dd_rescue 的实用程序。dd_rescue 是一个将数据从一个文件或块设备复制到另一个文件的程序,它是一个帮助您从崩溃的分区中保存数据的工具。
示例:dd_rescue
要将 /dev/sda(已损坏)精确复制到 /dev/sdb(确保 sdb 为空),您需要输入以下命令:
# ddrescue /dev/sda /dev/sdb
当然,下一步是在 /dev/sdb 分区上运行 fsck 以恢复/保存数据。请记住不要触碰最初损坏的 /dev/sda。如果此过程失败,您可以将磁盘发送到专业的数据恢复服务。例如,如果 /home(用户数据)位于 /dev/sda2 上,则需要在 /dev/sdb2 上运行命令:
# fsck /dev/sdb2
一旦 fsck 运行,将 /dev/sdb2 挂载到某处并查看是否可以访问数据:
# mount /dev/sdb2 /mnt/data
最后,使用 tar 或您自己选择的任何其他命令进行备份。ddrescue 命令支持大量选项,请阅读手册页以获取更多信息:
# man dd_rescue
或者参阅 gnu/ddrescue 命令手册页:
# man ddrescue