使用 dd 来处理硬盘上的坏块?

使用 dd 来处理硬盘上的坏块?

我想使用 dd 克隆故障硬盘。我担心肯定会有坏块。所以我的问题是dd坏块会留下选定块大小(bs)的间隙还是只和硬盘上的扇区一样大?

答案1

我确信它是两者中较大的一个。

假设您在 中使用 512 字节块大小dd,但您的磁盘使用 4K 扇区,其中一个扇区损坏。dd尝试对该 4K 扇区进行的所有四次 512 字节读取都将失败,从而导致 4K 间隙。

现在假设您使用的是 8K 块dd大小,但您的磁盘使用 4K 扇区。当dd尝试执行 8K 读取时,它将失败,因为读取中的一个扇区失败,导致 8K 间隙。

现在可能是提及的好时机GNU 救援(不要与同名的非 GNU 软件混淆)它基本上可以自动使用 dd 来拯救故障驱动器,并采用一些效率技巧。它从较大的块大小开始以提高速度,但会跟踪发现坏块的位置,然后返回尝试以较小的读取大小读取它们的不同部分,直到它到达一个绝对不可读的 512 字节块列表。我花了一段时间才理解文档,但一旦我弄明白了,我发现这是一个非常有用的工具,而且比我自己直接使用 dd 来完成这种任务更可取。

答案2

这是我今天所做的,并恢复了我的数据。我在复制(备份磁盘)时遇到了问题,大约有 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 的大型数据库文件受到影响。

相关内容