Filesystems

避免在 ext4 中損壞塊

  • February 24, 2021

我在跑步

$ uname -a
Linux myhostname 4.14.15-041415-generic #201801231530 SMP Tue Jan 23 20:33:21 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Nitrux
Description:    Nitrux 1.1.4
Release:        1.1.4
Codename:       nxos

ext4它有一個帶有系統分區和交換分區的硬碟。硬碟既不能完成Smartshort測試,也不能完成Smart測試long

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       90%     32232         11202419
# 2  Extended offline    Completed: read failure       90%     32229         11202419

也許應該更換磁碟。

同時,是否可以簡單地指示文件系統避開對應的塊LBA?這樣就不會從那裡產生進一步的讀/寫錯誤。事實上,這似乎是一個孤立的錯誤,硬碟(當然,該區域除外)仍然能夠工作。


SMART參數很奇怪,因為有待重新分配的未決扇區,但也有0重新分配的扇區。請注意,這個硬碟大約有 10 年的歷史。

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
 1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       19
 3 Spin_Up_Time            0x0027   140   139   021    Pre-fail  Always       -       3966
 4 Start_Stop_Count        0x0032   098   098   000    Old_age   Always       -       2058
 5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
 7 Seek_Error_Rate         0x002e   100   253   000    Old_age   Always       -       0
 9 Power_On_Hours          0x0032   056   056   000    Old_age   Always       -       32232
10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
12 Power_Cycle_Count       0x0032   098   098   000    Old_age   Always       -       2001
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       206
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       1851
194 Temperature_Celsius     0x0022   103   086   000    Old_age   Always       -       40
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       78
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       70
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       89

連結頁面中沒有選擇的答案。我必須保持系統正常執行,並且我想避免dd(並且在這種情況下沒有關於如何使用它的明確範例)。我可以fsck.ext2 -c在已掛載的文件系統上執行嗎?

e2fsck手冊頁(e2fsck也連結到 names和fsck.ext2):fsck.ext3``fsck.ext4

請注意,通常在掛載的文件系統上執行 e2fsck 是不安全的。唯一的例外是如果指定了-n選項,並且-c指定、-l-L選項。但是,即使這樣做是安全的,如果文件系統已掛載,則列印的結果也是無效的。如果詢問您是否應該檢查已掛載的文件系統,唯一正確的答案是“否”。只有真正知道自己在做什麼的專家才應該考慮以任何其他方式回答這個問題。e2fsck``e2fsck

所以答案是“不,你不能fsck以任何可能對文件系統進行任何更改的模式在已安裝的 ext2/3/4 文件系統上執行”。

在引導時,可能會在根文件系統以只讀模式掛載或系統仍在 initramfs 上執行時對其進行檢查。fsck但是在這種情況下,如果指示必須進行任何更改,則應立即重新啟動系統。


如果磁碟塊完全失敗,即使重複重試也不會導致磁碟確信數據已正確讀取,則磁槃無法自動重新分配該塊,直到其內容被作業系統覆蓋 - 因為重新分配沒有擁有正確的數據相當於默默地破壞數據(通過用零替換數據塊)。這比簡單地產生讀取錯誤的文件更糟糕,因為損壞的數據可能會被用於進一步處理並默默地導致其他結果被損壞,直到最終被注意到。

產生讀取錯誤的文件通常很容易從備份中恢復,除非它是關鍵系統文件並且系統崩潰或如果該文件失去則無法執行恢復工具。

SMART 指示有待重新分配的扇區但沒有實際重新分配的事實可能僅意味著失敗的扇區被系統文件佔用,這些文件通常只被讀取而實際上從未被寫入。如果你能弄清楚這些文件屬於哪個包,你可以指示包管理系統重新安裝那個包;Nitrux 似乎使用.deb軟體包,因此apt-get reinstall <package name>執行命令也是如此。這將導致文件被重寫,從而允許磁碟完成重新分配。

不幸的是,一些磁碟製造商已經創建了 SMART 實現不完整的磁碟,所以只有當它告訴壞消息時,你才能真正信任 SMART;如果它說一切正常,但作業系統報告讀/寫錯誤,那麼不管 SMART 說什麼,都是壞事——而且由於 HDD 是磨損物品,在大多數情況下是磁碟出現故障。


20 多年來,我一直在伺服器管理領域擔任各種角色以謀生。在那段時間裡,我們的團隊看到一個 10 多年前仍在使用的磁碟的反應是——現在仍然是:

“我的天啊!如果那個磁碟由於某種原因而停止運轉,幾乎無法保證它會再次重新啟動。我們甚至可以以合理的價格和響應時間獲得這樣的舊硬體的備件嗎?在至少,我們需要製定一個非常現實的計劃,(而不是如果)那個東西失敗時該怎麼辦,最好現在就盡快更換或虛擬化那個舊東西。”

當然,我們處理的伺服器幾乎總是每天 24 小時、每年的每一天、在其整個生命週期內執行——而您的系統可能並非如此。

但是一個 10 年曆史的磁碟,如果在其設計的細分市場的“典型”方式附近使用,肯定會很好地進入浴缸曲線的上升邊緣:它的設計壽命已經超過並且它正在磨損。

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