以下の不良セクタに関する情報を受け取ったとします。
[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
ベストアンサー1
伝統的なアプローチは、すべてのファイルを別の場所にコピーし、どのファイルが読み取りエラーを引き起こすかを確認することです。もちろん、RAIDレイヤーの重複によってエラーが隠れる場合、これは質問にはまったく答えません。
それ以外は手動の方法だけ知っています。これは実際に実行するのが面倒で、これらの魔法を実行できるツールがあれば聞いたことがなく、blktrace
View(Viewなど)のより一般的なツールが役に立つかどうかはわかりません。
ファイルシステムの場合またはfilefrag
を使用して、hdparm --fibmap
すべてのファイルのブロック範囲を決定できます。一部のファイルシステムは異なる方向にナビゲートする機能を提供しますが(たとえばdebugfs icheck
)、同じ操作を実行するシステムコールを認識しないため、ブロック - >ファイルナビゲーションに共通のインターフェイスがないようです。
LVMの場合、各LVが保存されている場所を確認するには、物理範囲オフセット/サイズlvs -o +devices
も知っている必要があります。pvs -o +pe_start,vg_extent_size
実際に機能することもできますvgcfgbackup
。これにより、ファイルシステムアドレスを各PV内のブロックアドレスに変換できます。
LUKSの場合、オフセットを見ることができますcryptsetup luksDump
。
mdadmの場合、オフセットを見ることができますmdadm --examine
。 RAIDレベルが1でない場合は、計算も実行する必要があります。特にRAIDレイアウトを理解して、デバイスのどのアドレスがどのmd
RAIDメンバーデバイスのどのブロックに変換されるかを知る必要があります。
最後に、パーティションを分割せずにディスクを直接使用しない限り、パーティションオフセットを考慮する必要があります。