Linux
如何找出哪個文件受到壞扇區的影響?
考慮到您已被告知有這樣的壞扇區:
[48792.329933] Add. Sense: Unrecovered read error - auto reallocate failed [48792.329936] sd 0:0:0:0: [sda] CDB: [48792.329938] Read(10): ... [48792.329949] end_request: I/O error, dev sda, sector 1545882485 [48792.329968] md/raid1:md126: sda: unrecoverable I/O read error for block 1544848128 [48792.330018] md: md126: recovery interrupted.
如何找出可能包含該扇區的文件?如何將扇區映射到文件?或者如何找出它是否只是映射到空閒文件系統空間?
映射過程應該能夠處理通常的儲存堆棧。
例如,在上面的範例中,堆棧如下所示:
/dev/sda+sdb -> Linux MD RAID 1 -> LVM PV -> LVM VG -> LVM LV -> XFS
但是,當然,它甚至可能看起來像這樣:
/dev/sda+sdb -> Linux MD RAID 1 -> DM_CRYPT -> LVM PV -> LVM VG -> LVM LV -> XFS
傳統的方法是將所有文件複製到其他地方,然後查看哪個觸發了讀取錯誤。當然,如果錯誤被 RAID 層的冗餘隱藏,這根本不能回答問題。
除此之外,我只知道手動方法。這實在是太麻煩了,如果有一個工具可以為你做這個魔術,我還沒有聽說過,我不確定更通用的工具(如
blktrace
)是否會有所幫助看待。對於文件系統,您可以使用
filefrag
或hdparm --fibmap
確定所有文件的塊範圍。一些文件系統提供了在另一個方向(例如debugfs icheck
)進行查找的工具,但我不知道有一個系統呼叫可以做同樣的事情,所以似乎沒有用於塊-> 文件查找的通用介面。對於 LVM,可以使用
lvs -o +devices
查看每個 LV 的儲存位置;您還需要知道pvs -o +pe_start,vg_extent_size
物理範圍偏移量/大小。它實際上可能在vgcfgbackup
. 這應該允許您將文件系統地址轉換為每個 PV 中的塊地址。對於 LUKS,您可以在
cryptsetup luksDump
.對於 mdadm,您可以在
mdadm --examine
. 如果 RAID 級別不是 1,您還需要做一些數學運算,更具體地說,您需要了解 RAID 佈局,以便了解md
設備上的哪個地址可以轉換為哪個 RAID 成員設備的哪個塊。最後,您需要考慮分區偏移量,除非您直接使用磁碟而不進行任何分區。