Linux 中从硬盘读取坏块太慢

Linux 中从硬盘读取坏块太慢

我正在尝试将一个旧的 320G 硬盘(充满坏扇区)中的数据恢复到新硬盘。我发现救援是完成这项任务的好工具,因为它很智能算法我已经使用以下命令完成过一次:

ddrescue -f -n /dev/sda /dev/sdb log

它花了几个小时完成,错误大小为 16G(未恢复),其中可能仍包含重要数据,因此我运行了下一步:

ddrescue -f -d /dev/sda /dev/sdb log

但它运行得太慢了(平均 300B/s),因为 Linux 卡在每个坏扇区上。
这实际上是 Linux 内核(可能是 libata),而不是硬盘本身,因为我尝试恢复二甲醚工具在干净的 DOS 上运行,没有这样的问题:ATA 超时可以在那里调整,并且整体恢复过程运行得更快。
但在 Linux 中不行。
我也尝试了这些内核参数:libata.ignore_hpa=1 libata.noacpi libata.force=noncq,norstlibata.dma=0在 bootlader 中传递给 cmdline,但它没有效果(我使用的是内核中编译了 LIBATA 的系统救援 CD)。
还尝试更改设备超时:

echo 1 > /sys/block/sda/device/timeout

(默认值为 30)
但这只会在系统日志中产生更多错误,而且毫无帮助。
传递坏块仍然需要每个扇区 1-3 分钟,速度非常慢。解析 16GB 的“坏”块需要多少时间?一周?一个月?
我还是更喜欢救援用于恢复(由于其高效的算法和日志文件功能),并想知道如何调整内核驱动程序以加速 ata/磁盘错误处理。Google 和 SU 上的相关问题都没有帮助。有什么想法吗?

PS抱歉我的英语不好

@ta.speot.is

为什么不直接从常规备份中恢复呢?

这是我朋友的硬盘,不是我的。真伤心,他没有备份。现在,磁盘崩溃后,他开始考虑做备份,是的 :)


更新型多巴胺:2.5 年后我仍然不知道答案,但刚刚意识到ddrescue当 SATA 控制器处于兼容 (IDE) 模式时,运行速度会更快,另一个技巧是始终使用-d选项 (直接访问) 来稍微加快速度。另外,请查看hdparm调整 HDD 的选项 ( -m, -D, -P),这可能会有所帮助(在旧硬件上)。


UPD2:刚刚注意到了 Slizzered回答相关问题。太棒了!我试过了:

smartctl -l scterc,20,20 /dev/sda

并且恢复速度比以前快得多(但仅限于 IDE 模式)。

答案1

这是问题发布几年后的事情,但它会帮助其他人。我在其他地方看到了这个答案的主要部分,我不确定这个-c选项是否在旧版 ddrescue 中可用。-c更改一次要复制的扇区数量。

开始:

ddrescue -d -r0 -e +0 -T 1s -n /dev/sdX recover.img recover.log -c 1 -O

替换X为您尝试恢复的驱动器。数据将存储在名为的文件中,recover.img因此您需要足够的空间。

使用上述代码前面的“watch”程序,当由于“太多坏区域”错误而崩溃时自动运行代码。

答案2

来自 DDRescue 人:

(用户可以随时中断该过程,但请注意,坏的驱动器可能会长时间阻塞 ddrescue,直到内核放弃)

所以简短的回答是:使用 DDRescue 你不能这样做,因为你不能改变内核超时(你需要在正确的位置编辑正确的源并重新编译...不简单!)。

我使用 Hiren 启动中包含的一些软件获得了良好的效果:

  • DataResque DD(制作图像)
  • Roadkil 的 Unstoppable Copier(复制文件并记录错误)

两者都在 Hiren 启动中包含的 MiniXP 中运行。它从 CD/DVD 或 USB 驱动器运行。

建议:硬盘运行时会非常热,这很不好,而且会使过程更糟。用风扇降温,这可以延长硬盘寿命并加快工作速度。

答案3

将参数配置得更大一些可能会有帮助--skip-size=。它的默认值是 64 kB,而现代驱动器中的损坏条带可能要大得多。

尽管每次仍需要等待超时,但需要等待的次数会减少。

相关内容