Hard-Disk

如何在清零磁碟時忽略寫入錯誤?

  • May 8, 2020

假設您要將故障硬碟歸零。您想用零覆蓋盡可能多的內容。你不想要的是:程序在第一次寫入錯誤時中止。怎麼做?

AFAICS,plaindd僅提供忽略讀取錯誤的選項。因此,像

dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k

是不足夠的。

ddrescue似乎更擅長忽略錯誤 - 但它的最佳命令行是什麼?

我對 GNU ddrescue 的嘗試:

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123

為此,我更喜歡badblocks破壞性寫入模式。它會寫,當它遇到錯誤時它會繼續這樣做,最後它會告訴你這些錯誤在哪裡,這些資訊可以幫助你決定下一步做什麼(它會混合嗎?)。

# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)

和阻止列表:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

之後磁碟上還剩下什麼:

# hexdump -C /dev/destroyme
00000000  be e9 2e a5 87 1d 9e 61  e5 3c 98 7e b6 96 c6 ed  |.......a.<.~....|
00000010  2c fe db 06 bf 10 d0 c3  52 52 b8 a1 55 62 6c 13  |,.......RR..Ubl.|
00000020  4b 9a b8 d3 b7 57 34 9c  93 cc 1a 49 62 e0 36 8e  |K....W4....Ib.6.|

請注意,這不是真正的隨機數據——模式是重複的,所以如果你跳過1MiB,你會再次看到相同的輸出。

它還將嘗試通過讀回數據來進行驗證,因此,如果您有一個聲稱寫入成功但在回讀時返回錯誤數據的磁碟,它也會發現這些錯誤。(確保在 badblocks 執行時沒有其他程序寫入磁碟以避免誤報。)

當然,對於嚴重損壞的磁碟,這可能需要很長時間:沒有程式碼可以讓它完全跳過有缺陷的區域。實現這一目標的唯一方法badblocks是使用更大的塊大小。

我不確定ddrescue這是否會更好;它應該在另一個方向上這樣做(盡可能快地恢復盡可能多的數據)。您可以通過指定第一個/最後一個塊手動為 dd/ddrescue/badblocks 執行此操作…

引用自:https://unix.stackexchange.com/questions/229354