恢复从 /dev 中读取坏块数据后消失的硬盘数据

恢复从 /dev 中读取坏块数据后消失的硬盘数据

我正尝试从通过 USB 3 驱动器外壳连接的故障 750 GB 硬盘中恢复尽可能多的数据。

badblocksLinux检测到驱动器本身有超过 1500 个坏块。

它完美地安装在我的计算机上(运行 macOS 10.12),但是当读取损坏块的数据时,驱动器会空闲几秒钟,然后消失/dev,然后重新出现 - 就好像有人拔掉了 USB 电缆然后又迅速插入一样。

第一个坏块出现在磁盘起始处约 136 GiB 处,但这不是唯一的坏块。 的输出badblocks以及 和 都失败时dd的输出证明了这一点ddrescue

dd并且ddrescue两者在从坏块读取数据时都会立即失败,因为驱动器随后会从以下位置消失/dev

dd if=/dev/rdisk3 of=image.img bs=16m

在此处输入图片描述

ddrescue -v /dev/disk4 image.img logfile

在此处输入图片描述

ddrescue初始终止后使用相同的日志文件重新运行将导致其立即终止并且不再进一步推进。

由于我能够遍历文件系统并正常访问一些文件,我写了一个脚本确定哪些文件可以访问,哪些文件不能访问,这样我就可以从磁盘复制已知良好的文件。但是,这很慢,我担心这可能会进一步损坏磁盘。

是否有类似工具ddddrescue可以从该驱动器恢复数据,只需等待驱动器重新安装而不是在读取坏块时自动退出?

我能够使用 macOS 和 Linux(Ubuntu),因此这两个平台的解决方案对我来说都适用。

答案1

读取损坏块的数据时,驱动器会空闲几秒钟,然后卸载,然后重新安装

我遇到了同样的问题,驱动器会“消失”,然后又重新出现。它实际上也没有安装,而是ddrescue在设备消失时停止了。我在 Linux 下使用它,但情况非常相似。

我建议你使用一些简单的 shell 编程并且驱动器实际上在一段时间后最终会再次出现。换句话说,请执行以下操作:

while [ 1 ]; do
    ddrescue -v /dev/disk4 image.img logfile
    sleep 3
done

其工作原理如下:

  • ddrescue已开始
  • 如果它停止运行,shell 将等待 3 秒,然后重新启动它
  • ddrescue能够继续,因为您充分利用了它的日志记录功能

尝试多次后(我认为默认值是 3,但我可能错了),ddrescue会将扇区标记为肯定坏扇区,并继续读取驱动器的其他部分。几个小时后,您将看到操作完成,您可以使用+ddrescue终止循环。CtrlC

答案2

GNUddrescue手册

例 6: 在将 中的分区挽救/dev/sda1到文件时hdimage/dev/sda1从 中消失/dev

ddrescue -f -n /dev/sda1 hdimage mapfile     <-- /dev/sda1 fails here
  (restart /dev/sda or reboot computer and then repeat the above
   command as many times as needed until it succeeds)
ddrescue -d -f -r3 /dev/sda1 hdimage mapfile

Andrea Lazzarotto 的回答涵盖了“重复上述命令”部分。示例中还有一个使用-dswitch 的附加步骤。手册稍微解释一下:

-d
--idirect

使用直接磁盘访问从 读取infile,绕过内核缓存。(使用标志打开文件O_DIRECT)。必须正确设置扇区大小才能使此功能正常工作。并非所有系统都支持此功能。

建议进一步阅读手册的正确部分. 来自其中:

首先尝试该--idirect选项。如果您的系统中不支持直接磁盘访问,请尝试原始设备。阅读系统文档以了解如何将原始设备绑定到常规块设备。某些操作系统通过特殊设备名称提供原始访问,例如/dev/rdisk

MacOS 确实提供了/dev/rdisk名称。但是,在您的问题中,您使用了rdiskwith dd,但disk使用了ddrescue,因此在我看来,您仍然可以从额外的步骤中受益。

Linux 用户会发现raw命令很有用。他们应该参考man raw示例 2:使用原始设备ddrescueGNU手册中已经提到的部分

相关内容