若是在物理磁盤中出現了壞塊,那麼使用該壞塊的文件將沒法正常讀取(好比在複製時會顯示I/O錯誤)。那麼咱們該如何定位受壞塊影響的文件呢?node
本文將經過一系列方法在文件系統中找到受壞塊影響的文件。linux
進行壞塊檢測是文件系統無關的,而文件定位是文件系統相關的。因此,不一樣文件系統要使用不一樣處理工具。例如,在ext2/ext3/ext4中使用debugfs命令,而其餘的文件系統要使用其餘工具。ide
針對磁盤操做具備必定的危險性,注意數據備份!!!工具
本文內容是對「archlinux/Identify damaged files」的學習與整理,並未進行實際操做與驗證。咱們的目的是瞭解」查找受壞塊影響的文件的「方法。學習
本文是針對Ext4文件系統。debug
使用tune2fs命令肯定文件系統塊大小:調試
#!/bin/sh tune2fs -l /dev/sdxy | grep -i Block
你可能已經使用badblock命令找到壞塊值,可是該值不必定是文件系統壞塊值。這是因爲badblock命令所使用的塊大小,與文件系統的塊大小不一樣(或者說不必定相同)。因此有如下兩個選擇。日誌
#!/bin/sh badblock -b "<file system block size>" -v /dev/sdxy
該命令掃描特定分區,而且使用文件系統塊大小,因此輸出的壞塊位置便是文件系統中的壞塊值。it
若是已經使用badblock掃描磁盤,可是掃描時的塊大小並非文件系統的塊大小,則須要進行轉換:class
(original block number) / (filesystem_block_size / badblocks_block_size) original block number * badblocks_block_size / filesystem_block_size
上面的兩個公式是等價的,都基於「相同位置 = 塊位置 x 塊大小 = 文件系統塊大小 * 文件系統塊位置」這一點。
執行debugfs命令,進入debugfs的交互模式:
# debugfs debugfs 1.45.4 (23-Sep-2019) debugfs: open /dev/sdxy ncheck inodenumber
在debugfs的交互模式中,使用open命令打開分區:
debugfs: open /dev/sdxy
而後,使用debugfs的testb命令獲取壞塊的信息:
debugfs: testb <blocknumber>
!!!將<blocknumber>替換爲前面獲得的壞塊值。
若是debugfs提示塊未被使用,則表示該塊出於空閒狀態。也就是說,目前沒有文件被該塊損壞。這是一個好消息。
若是debugfs提示塊已被使用,則須要使用以下命令獲取對應的inode值:
debugfs: icheck <blocknumber>
該命令將會返回兩個值:「塊值」與「inode值」。
debugfs: ncheck <inodenumber>
將<inodenumber>替換爲上面icheck輸出的第二個值。
若是inode很是小而且ncheck沒法返回文件名,那麼多是日誌(journal)自己損壞。經過運行下面命令刪除日誌:
#!/bin/sh tune2fs -O ^has_journal /dev/sdxy
再次運行testb命令:
debugfs: testb <blocknumber>
若是確實被日誌使用,因爲前面清除動做,則上述命令執行後應該提示塊未被使用。
構建新的日誌:
#!/bin/sh tune2fs -j /dev/sdxy
archlinux/Identify damaged filesFind which files are affected by bad blocks on ext4 filesystem