我正尝试从通过 USB 3 驱动器外壳连接的故障 750 GB 硬盘中恢复尽可能多的数据。
badblocks
Linux检测到驱动器本身有超过 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
初始终止后使用相同的日志文件重新运行将导致其立即终止并且不再进一步推进。
由于我能够遍历文件系统并正常访问一些文件,我写了一个脚本确定哪些文件可以访问,哪些文件不能访问,这样我就可以从磁盘复制已知良好的文件。但是,这很慢,我担心这可能会进一步损坏磁盘。
是否有类似工具dd
或ddrescue
可以从该驱动器恢复数据,只需等待驱动器重新安装而不是在读取坏块时自动退出?
我能够使用 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
例 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 的回答涵盖了“重复上述命令”部分。示例中还有一个使用-d
switch 的附加步骤。手册稍微解释一下:
-d
--idirect
使用直接磁盘访问从 读取
infile
,绕过内核缓存。(使用标志打开文件O_DIRECT
)。必须正确设置扇区大小才能使此功能正常工作。并非所有系统都支持此功能。
建议进一步阅读手册的正确部分. 来自其中:
首先尝试该
--idirect
选项。如果您的系统中不支持直接磁盘访问,请尝试原始设备。阅读系统文档以了解如何将原始设备绑定到常规块设备。某些操作系统通过特殊设备名称提供原始访问,例如/dev/rdisk
。
MacOS 确实提供了/dev/rdisk
名称。但是,在您的问题中,您使用了rdisk
with dd
,但disk
使用了ddrescue
,因此在我看来,您仍然可以从额外的步骤中受益。
Linux 用户会发现raw
命令很有用。他们应该参考man raw
和示例 2:使用原始设备在ddrescue
GNU手册中已经提到的部分。