最近我尝试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
:
info ddrescue
- http://www.forensicswiki.org/wiki/Ddrescue
编辑
如果硬盘本身耗时过长,您可以尝试启用一项名为局部淋巴细胞(电视我大号模仿埃错误Recovery)或华润水泥(C命令C完成电视我大号限制时间(imit)。并非所有硬盘都有此功能,但您可以使用它来限制硬盘控制器本身的时间。ddrescue
当然,这种方法可以与结合使用。
smartctl
Linux 有一个名为(在包中)的工具smartmontools
。
检查当前设置(“禁用”意味着无限时间,这是您不想要的):
# smartctl -l scterc /dev/sda
要将其设置为固定值(此示例中为 5.0 秒。将其设置为 0 则禁用 TLER):
# smartctl -l scterc,50,50 /dev/sda
答案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
在完成后使用选项-A
once,这将反转并删除所有错误大小并重新开始。这意味着它将以不同的方式读取错误。
答案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
接下来的这个也是一款可靠的恢复工具。即使文件表损坏或文件被删除,它也可以恢复文件。这是一款非常棒的取证工具。它以非常无组织的方式转储内容,但你可以移动所有数据。