更快地从有坏扇区的磁盘恢复

更快地从有坏扇区的磁盘恢复

最近我尝试dd将不健康的硬盘驱动器复制到文件。我使用了dd if=/dev/sdb of=somefile bs=4096 conv=noerror,sync。我的问题是dd当遇到坏块时会浪费大量时间。在我的用例中,我愿意付出一些数据损失来换取更快的结果。

有什么方法可以加快错误处理速度吗?也许是内核调整(告诉硬盘驱动器减少读取块的精力)?或者其他程序?

答案1

首先,对于要使用的软件:您可以尝试使用ddrescue而不是dd

ddrescue有一个开关,可以只进行有限次数的重试。它还可以使用日志文件,因此它会记录哪些块是坏的。如果您以后想进行更多重试,可以使用相同的要运行的日志文件ddrescue 再次具有不同的选项(例如更多重试),它将仅重试必要的块。

使用示例:

# ddrescue -n /dev/sda /dev/sdb rescue.log
# ddrescue -r1 /dev/sda /dev/sdb rescue.log

来自ddrescue信息页面:

   -n, --no-scrape     
          Skip the scraping phase. Avoids spending a lot of time
          trying to rescue the most difficult parts of the file.

   -r, --retry-passes=<n>
          Exit after given number of retry passes. Defaults to 0.
          -1 means infinity. Every bad sector is tried only once 
          in each pass. To retry bad sectors detected on a previous
          run, you must specify a non-zero number of retry passes.

以下是一些可供使用的附加资源ddrescue


编辑

如果硬盘本身耗时过长,您可以尝试启用一项名为局部淋巴细胞电视大号模仿错误Recovery)或华润水泥C命令C完成电视大号限制时间(imit)。并非所有硬盘都有此功能,但您可以使用它来限制硬盘控制器本身的时间。ddrescue当然,这种方法可以与结合使用。

smartctlLinux 有一个名为(在包中)的工具smartmontools

检查当前设置(“禁用”意味着无限时间,这是您不想要的):

# smartctl -l scterc /dev/sda

要将其设置为固定值(此示例中为 5.0 秒。将其设置为 0 则禁用 TLER):

# smartctl -l scterc,50,50 /dev/sda

TLER 来源:http://en.wikipedia.org/wiki/TLER

答案2

要想快速恢复光盘,您可以使用 sh 脚本文件并用 sh 运行该文件。它包含此行,只需重复sudo ddrescue几次sleep 3即可。睡眠用于使驱动器休息几秒钟:

#! /bin/sh -e 
sudo ddrescue -d -r0 -e +0 -T 1s -n /dev/drivepartition file.img log.logfile 
sleep 3

上面使用的选项:

  • -r0 :无需重试
  • -e +0:第一次出现错误时退出
  • -T 1s:1 秒后退出,读取失败
  • -d :直接 I/O
  • -n :无刮擦

您可以-R在完成后使用选项-Aonce,这将反转并删除所有错误大小并重新开始。这意味着它将以不同的方式读取错误。

答案3

取决于硬盘的大小以及坏块的数量。通常,我使用 DD 备份一个 1 TB 的健康硬盘需要 20 分钟。今天早上我刚刚恢复了坏块,花了我两倍的时间。我在复制(备份磁盘)大约有 30 个坏块时遇到了问题。我做的第一件事是使用常规 Filezilla 备份文件以备份所有好数据。我注意到一个大文件复制不正确(中途停止并重新启动传输)。幸运的是,我有相同文件的先前备份。要复制磁盘,我必须使用以下步骤找到磁盘上的坏块:

首先找出问题磁盘识别高清信息使用fdisk -l

第二,假设你的磁盘是/dev/sdb然后你需要运行命令 坏块-v /dev/sdb它会列出驱动器上的所有坏块。幸运的是,会有几个坏块。如果没有发现坏块,则说明驱动器块没有问题,需要找出其他解决方法。我的块大小是 512,所以我使用该默认数字来运行 DD

第三,每个块的大小为 512,因此我设置 bs=512

每次我像往常一样定期运行 DD 时,我的数据在出现错误后就会损坏。因此,我使用页面上说明的参数https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html搜索“针对故障磁盘”部分。

dd if=/dev/sdb of=/dev/sda bs=512 conv=noerror,sync iflag=fullblock 

这花了一段时间。遇到的每个坏块都发出像在故障驱动器上敲击的声音。它逐块复制,并且所有坏块都发出相同的声音。发出声音的次数是因为它发现了另一个坏块并告诉您有关显示错误消息的信息。'conv=noerror,同步'所做的就是用 NUL 填充错误的读取,而‘iflag=fullblock’适合短读,但会保持数据同步直到最后。完全没有损坏,它只是不复制有故障的块并用空的 NUL 填充它。

使用 DD 复制完成后,我只需用 Filezilla 从过去的备份中恢复该坏文件即可,一切正常。我希望这对其他尝试备份故障驱动器的人有用。

注意:我的坏块彼此非常接近。每次大约有 4 个块成组地被检测到坏块。如果您的块遍布整个磁盘,则可能会影响多个文件。幸运的是,就我而言,只有一个 4GB 的大型数据库文件受到影响。

答案4

我使用这个软件从原本无法读取的磁盘上获得了良好的效果。

http://www.cgsecurity.org/wiki/TestDisk

接下来的这个也是一款可靠的恢复工具。即使文​​件表损坏或文件被删除,它也可以恢复文件。这是一款非常棒的取证工具。它以非常无组织的方式转储内容,但你可以移动所有数据。

http://www.cgsecurity.org/wiki/PhotoRec

相关内容