Linux

如何找出哪個文件受到壞扇區的影響?

  • November 18, 2020

考慮到您已被告知有這樣的壞扇區:

[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)是否會有所幫助看待。

對於文件系統,您可以使用filefraghdparm --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 成員設備的哪個塊。

最後,您需要考慮分區偏移量,除非您直接使用磁碟而不進行任何分區。

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