「Ext4」- 找到受壞塊影響的文件 @20210419

問題描述

若是在物理磁盤中出現了壞塊,那麼使用該壞塊的文件將沒法正常讀取(好比在複製時會顯示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
debugfs 1.45.4 (23-Sep-2019)
debugfs: open /dev/sdxy


ncheck inodenumber

打開分區

debugfs的交互模式中,使用open命令打開分區:

debugfs: open /dev/sdxy

獲取特定塊的信息

而後,使用debugfstestb命令獲取壞塊的信息:

debugfs: testb <blocknumber>

!!!將<blocknumber>替換爲前面獲得的壞塊值。

若是debugfs提示塊未被使用,則表示該塊出於空閒狀態。也就是說,目前沒有文件被該塊損壞。這是一個好消息。

獲取inode值

若是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

相關文章
相關標籤/搜索