Linux

如何輕鬆修復 Linux 磁碟上的單個不可讀塊?

  • September 16, 2020

我的 Linux 系統開始在 syslog 中拋出 SMART 錯誤。我對其進行了追踪,並認為問題出在磁碟上的單個塊上。如何輕鬆地讓磁碟重新分配那個塊?我想知道在這個過程中什麼文件被破壞了。(我知道,如果磁碟上的一個塊發生故障,其他塊可能會跟隨;我有一個很好的持續備份,只是想嘗試保持該磁碟正常工作。)

在網路上搜尋會導致Bad block HOWTO,它描述了在解除安裝磁碟上的手動過程。這似乎很複雜且容易出錯。是否有工具可以在 Linux 中自動執行此過程?我唯一的其他選擇是製造商的診斷工具,但我認為這會破壞壞塊,而不會報告損壞的內容。最壞的情況,它可能是文件系統元數據。

有問題的磁碟是主系統分區。使用 ext3fs 和 LVM。這是來自 syslog 的錯誤日誌和來自 smartctl 的相關位。

smartd[5226]: Device: /dev/hda, 1 Currently unreadable (pending) sectors

Error 1 occurred at disk power-on lifetime: 17449 hours (727 days + 1 hours)
... Error: UNC at LBA = 0x00d39eee = 13868782

pastebin上有一個完整的 smartctl 轉儲。

你可以試試hdparm --write-sector <LBA> /dev/ice

我不知道這樣做的任何其他方式 - 您需要手動將 LBA 轉換為文件系統塊(正如您已經找到的那樣)

我曾經為WD寫磁碟韌體,我曾經寫過重新分配壞塊的韌體。

首先,大多數壞塊是在讀取時檢測到的,而不是在寫入時檢測到的。寫入是盲目進行的,這意味著數據在未經檢查的情況下寫入。因此,如果介質損壞,則在寫入時,在主機讀取該扇區之前您不會知道它。有一小部分扇區(扇區頭)在寫入時被讀取以定位正確的扇區,因此如果讀取扇區頭時出現錯誤,驅動器將重新分配扇區並使用接收到的數據寫入從寫命令。但是絕大多數壞塊都是在讀取時檢測到的,僅僅因為一個扇區的寫入成功並不意味著介質是好的或該扇區已被重新分配。

現在關於壞塊重新分配(也稱為重新分配)。是的,通常情況下,如果錯誤足夠嚴重(即 ECC 故障足夠嚴重),驅動器將嘗試重新分配扇區,但在 ECC 更正後,驅動器仍然可以恢復數據。通常這是自動完成的。唯一的例外是主機之前可以告訴驅動器不要進行自動重新分配,但很少這樣做。

那麼如果驅動器進行讀取並且無法恢復數據會發生什麼?沒有。錯誤會報告給主機,但不會重新分配。問題是驅動器可以重新分配扇區,但它根本不知道要在新重新分配的扇區中寫入什麼數據。例如,如果它只是寫了一堆零,然後再次讀取該扇區,它將返回所有零,而沒有任何跡象表明數據無效。這與數據損壞本質上是一樣的。由於各種原因,驅動器不能指望主機跟踪錯誤(例如,如果驅動器被移動到新主機怎麼辦?),所以最好的做法是當數據可以時什麼都不做不能恢復。

但是,現代驅動器會在無法重新分配壞扇區時保存壞扇區的位置。可以在 SMART 數據中找到等待重新分配的壞扇區的數量。發生的情況是,如果對等待重新分配的壞扇區之一進行了寫入,則重新分配已完成,因為驅動器現在在重新分配後具有要寫入的有效數據。因此,當人們說寫入壞扇區會重新分配它時,這實際上只是故事的一半。必須先讀取驅動器,以便驅動器可以發現所有無法自動重新分配的壞扇區。這樣你可以寫整個驅動器,SMART數據會說沒有壞扇區等待重新分配,但你不一定清除所有壞扇區的驅動器。因此,如果您真的想清除所有壞扇區的驅動器,

還有其他處理無法重新分配的壞塊的方法。如果驅動器是冗餘 RAID 配置的一部分(即除 RAID 0 之外的任何配置),RAID 軟體應自動從其他驅動器恢復壞扇區的數據並將其寫入重新分配的扇區。SCSI 磁碟有一個明確的重新分配塊命令,即使沒有有效數據寫入塊,主機也可以使用該命令強制重新分配,但它的使用非常低級。

引用自:https://serverfault.com/questions/104417