Hard-Disk

如何從命令行進行磁碟表面掃描,並在 Linux 中修復/重新分配壞扇區?

  • May 11, 2017

我買了一個帶有一些壞扇區的磁碟,計劃修復它們,然後將其用作 RAID 6 集群的一部分。我可以在windows下做壞扇區修復,有很好的壞塊修復工具,但是在windows下,這個過程很慢,一個扇區修復需要15分鐘。

根據我的經驗,Linux 更擅長處理不及時響應的設備,這導致 Linux 下的處理速度要快得多。但是,我檢查了fsck手冊,但沒有找到任何有用的表面和壞塊掃描或壞塊重新分配的選項。

如何從命令行掃描我的硬碟表面並修復/重新分配 Linux 中的壞扇區?

這個答案是關於磁碟的。SSD 不一樣。此外,這是一個沒有數據(或沒有您想保留的數據)的磁碟;如果磁碟上有重要數據,請參閱我對“我可以使用單個命令修復硬碟上的壞塊”的回答。

至少從 90 年代後期開始製造的磁碟本身就可以管理壞塊。簡而言之,磁碟將通過用備用扇區透明地替換壞塊來處理壞塊。如果 (a) 在讀取時發現塊“弱”,但 ECC 足以恢復數據,它將這樣做;(b) 寫的時候發現扇區頭壞了;(c) 在寫入時,如果先前的讀取檢測到該扇區為壞扇區,但數據不可恢復。

磁碟韌體通常允許您通過 SMART 屬性監控此過程(至少計數)。通常至少會有一個重新分配的扇區計數和兩個掛起的計數(讀取時發現錯誤,ECC 失敗,尚未寫入)。

有兩種方法可以讓磁碟注意到壞扇區:

  1. 用於smartctl -t offline /dev/sdX告訴磁碟韌體進行離線表面掃描。然後,您只需將磁碟放在一邊(完全空閒將是最快的),直到它完成(檢查 中的“離線數據收集狀態” smartctl -c /dev/sdX)。這通常會更新 SMART 中的“離線不可糾正”計數。(注意:可以將驅動器配置為定期自動執行離線檢查。)
  2. 讓 Linux 讀取整個磁碟,例如badblocks -b 4096 -c 1024 -s /dev/sdX. 這通常會更新 SMART 中的“目前待處理扇區”計數。

上述任何一種情況都可能增加重新分配的扇區數——在情況 (b) 中,ECC 恢復了數據。

現在,要恢復扇區,您只需要寫入它們即可。通常,這很簡單pv -pterba /dev/zero > /dev/sdX(或只是簡單cat的 , or dd) ,您計劃將這些部分作為 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 並且是由於不計算開頭或結尾的文章。

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