如何從命令行進行磁碟表面掃描,並在 Linux 中修復/重新分配壞扇區?
我買了一個帶有一些壞扇區的磁碟,計劃修復它們,然後將其用作 RAID 6 集群的一部分。我可以在windows下做壞扇區修復,有很好的壞塊修復工具,但是在windows下,這個過程很慢,一個扇區修復需要15分鐘。
根據我的經驗,Linux 更擅長處理不及時響應的設備,這導致 Linux 下的處理速度要快得多。但是,我檢查了
fsck
手冊,但沒有找到任何有用的表面和壞塊掃描或壞塊重新分配的選項。如何從命令行掃描我的硬碟表面並修復/重新分配 Linux 中的壞扇區?
這個答案是關於磁碟的。SSD 不一樣。此外,這是一個沒有數據(或沒有您想保留的數據)的磁碟;如果磁碟上有重要數據,請參閱我對“我可以使用單個命令修復硬碟上的壞塊”的回答。
至少從 90 年代後期開始製造的磁碟本身就可以管理壞塊。簡而言之,磁碟將通過用備用扇區透明地替換壞塊來處理壞塊。如果 (a) 在讀取時發現塊“弱”,但 ECC 足以恢復數據,它將這樣做;(b) 寫的時候發現扇區頭壞了;(c) 在寫入時,如果先前的讀取檢測到該扇區為壞扇區,但數據不可恢復。
磁碟韌體通常允許您通過 SMART 屬性監控此過程(至少計數)。通常至少會有一個重新分配的扇區計數和兩個掛起的計數(讀取時發現錯誤,ECC 失敗,尚未寫入)。
有兩種方法可以讓磁碟注意到壞扇區:
- 用於
smartctl -t offline /dev/sdX
告訴磁碟韌體進行離線表面掃描。然後,您只需將磁碟放在一邊(完全空閒將是最快的),直到它完成(檢查 中的“離線數據收集狀態”smartctl -c /dev/sdX
)。這通常會更新 SMART 中的“離線不可糾正”計數。(注意:可以將驅動器配置為定期自動執行離線檢查。)- 讓 Linux 讀取整個磁碟,例如
badblocks -b 4096 -c 1024 -s /dev/sdX
. 這通常會更新 SMART 中的“目前待處理扇區”計數。上述任何一種情況都可能增加重新分配的扇區數——在情況 (b) 中,ECC 恢復了數據。
現在,要恢復扇區,您只需要寫入它們即可。通常,這很簡單
pv -pterba /dev/zero > /dev/sdX
(或只是簡單cat
的 , ordd
) ,但您計劃將這些部分作為 RAID 陣列。無論如何,RAID init 都會寫入整個磁碟,所以這是沒有意義的。唯一的例外是磁碟的開頭和結尾——可能會失去幾十兆字節(由於對齊、標題等)。所以:disk=/dev/sdX end=$(echo "$(/sbin/blockdev --getsize64 "$disk")/4096-32768" | bc) dd if=/dev/zero bs=4096 count=32768 of="$disk" # first 128 MiB dd if=/dev/zero bs=4096 seek="$end" count=32768 of="$disk" # last 128 MiB
我想我設法避免了上面所有簡單的fencepost錯誤1,因此應該空白磁碟的第一個和最後一個128MiB。然後讓 mdadm raid init 寫剩下的。但是,如果您願意,將整個磁碟歸零是無害的(除了輕微的磨損和浪費時間)。
另一件事是,如果您的磁碟支持它:(
smartctl -l scterc,40,100
或任何數字)告訴磁碟您希望它放棄更快地糾正讀取錯誤 - 40 將是 4 秒。這兩個數字分別是讀錯誤和寫錯誤;mdraid 將通過奇偶校驗輕鬆糾正讀取錯誤(並將失敗的扇區寫回磁碟以使其重新分配)。但是,寫入錯誤會使磁碟脫離陣列。PS:請務必留意重新分配的扇區數。該屬性將失敗是個壞消息。如果它不斷增加,那也是個壞消息。
PPS:確保定期清理您的 RAID 陣列(讀取每個扇區並驗證所有奇偶校驗)。許多發行版已經發布了每月執行此操作的腳本。這將檢測並修復任何新的壞塊,否則很少讀取的壞塊可能會持續存在並最終導致重建失敗。
1 Fencepost 錯誤 - 一種因未能計算其中一個末端而導致的錯誤。如果您每 3 英尺有一個柵欄柱,則命名為*9 英尺獨立柵欄中有多少柵欄柱?*正確答案是 4;fencepost 錯誤是 3 並且是由於不計算開頭或結尾的文章。