如何告诉 rsync 跳过损坏的硬盘驱动器块上的文件,而不是试图读取它

rat*_*lan 17 rsync macos

我正在尝试从有硬件错误的磁盘中恢复文件。

磁盘已由磁盘实用程序修复,但它告诉我磁盘已损坏,因此我需要在发生故障之前备份所有内容。

所以我试图通过finder复制文件,但它卡住了。尝试了其他实用程序,当磁头碰到损坏的块时,他们在尝试复制文件时卡住了。

所以我尝试了 rsync,它似乎有效;但是当我遇到坏块时需要很长时间。

所以我想知道,是否有办法告诉 Rsync 甚至不打扰文件,如果它花费的时间太长?我可以指定每个文件的尝试次数,或者每个文件需要尝试多长时间?

我不确定这个驱动器能用多久,所以我想尽快把所有数据从里面取出,同时我仍然可以挂载它并在 finder 中看到它上面的数据。

这是我使用的命令;如果有任何方法可以减少对文件的尝试,请提出建议,这样我就可以让 rsync 尝试读取损坏的块,但要避免在特定扇区上停留太久。

rsync -arv -e--ignore-errors --partial-dir=/Volumes/backup/partial /Volumes/work /Volumes/backup
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Has*_*tur 14

简短的回答:rsync在这种情况下它不是正确的工具:它的使用甚至可能是有害的。
使用ddrescue替代(优于dd_rescue)。它能够做你所要求的。


如果磁盘物理损坏,存在这样的可能性,以与任何试图修复它。

这不仅是一个关于你的时间使用的问题,当rsync接近损坏的扇区时似乎永远挂起。问题是,重复操作可能会发生无法修复的故障,然后您将无法在不更换昂贵部件的情况下挽救数据(总是如果它仍然可能并且您的HDD不会变)。

在这种情况下,我发现的最安全的程序是

  1. 在另一个未损坏的磁盘上创建原始图像
  2. 创建该图像的副本
  3. 在副本上努力解决文件系统和抢救文件

为什么是副本?因为如果它在文件系统修复步骤中失败了,您可以随时重新开始,而无需再次接触原始损坏的硬盘

我建议你使用ddrescue, 来做原始磁盘映像,包括缺陷,因为即使在读取错误的情况下它也能正常工作。


怎么做 ddrescue

您可以ddrescue完全按照自己的rsync意愿使用,跳过损坏的扇区而不重试或拆分它们,复制尽可能多的数据。
这个命令在下面(而不是/dev/hda1你将放置你的设备):

ddrescue --no-split /dev/hda1 imagefile logfile
Run Code Online (Sandbox Code Playgroud)

之后你完成了第一段(较快的一段),你可以尝试细化它,尝试访问 3 次,以防出错。

ddrescue --direct --max-retries=3 /dev/hda1 imagefile logfile 
Run Code Online (Sandbox Code Playgroud)

您可以继续ddrescue使用其他选项重复命令调用来优化图像,每次尝试提取更多数据(请参阅参考资料)。完成后,您可以创建副本(如果您有所有需要的空间),然后修复文件系统

请注意,原始图像将与原始HDD一样大。
你可以在互联网、这个和 StackExchange 的其他网站上找到许多关于如何使用或其他工具拯救数据的问题和答案ddrescue

参考:

  • 在较新版本的 ddrescue 中删除了 --no-split 选项。改用 --no-scrape 。见 https://lists.gnu.org/archive/html/bug-ddrescue/2015-09/msg00001.html (2认同)

小智 7

我在寻找从故障 SD 卡(Ubuntu 20.04)保存数据的解决方案时发现了这个主题。

Hastur答案很棒,尽管这些命令在 Ubuntu 20.04 上对我不起作用。

基于Grmpfhmbl评论和ddrescue --help

  • --no-split标志已被删除,因此可以--no-scrape使用

    -n, --no-scrape 跳过抓取阶段

ddrescue --no-scrape /dev/hda1 imagefile logfile
Run Code Online (Sandbox Code Playgroud)

精炼的命令也发生了变化。

  • 使用-d--idirect用于直接磁盘访问输入文件

    -d, --idirect 对输入文件使用直接磁盘访问

  • 我们--max-retries=3可以使用-ror--retry-passes=<n>

    -r, --retry-passes= 重试通过后退出 (-1=无穷大) [0]

ddrescue --idirect --retry-passes=3 /dev/hda1 imagefile logfile 
Run Code Online (Sandbox Code Playgroud)

我认为这篇文章没有任何功劳,它只是Hastur答案的更新。