Hard-Disk
如何在清零磁碟時忽略寫入錯誤?
假設您要將故障硬碟歸零。您想用零覆蓋盡可能多的內容。你不想要的是:程序在第一次寫入錯誤時中止。怎麼做?
AFAICS,plain
dd
僅提供忽略讀取錯誤的選項。因此,像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 執行此操作…