BtrFSの論理アドレスマッピング

BtrFSの論理アドレスマッピング

ドライブの16進表現(xxd /dev/sd**)を調べて、BtrFSドライブから一部のファイルの内容を手動で回復しようとしています。

私が考える唯一の方法は、ファイルツリーのどこかでfile_extent_itemを見つけることです。次に、そのエントリに格納された範囲データの開始論理アドレスを探し、最後にそのオフセットに移動してバイトを抽出します。私が経験している問題は、このようなオフセットがディスクのオフセットと正確に一致しないことです。

メタデータブロックヘッダーに格納されている論理アドレスを抽出し、それをメタデータブロックを見つけたディスクのアドレスと比較するスクリプトを作成しました。以下はいくつかの結果です。

Phy. address: 150 0000h
Log. address: 150 0000h (match up)

Phy. address: 250 0000h
Log. address: 1D0 0000h (-80 0000h)

Phy. address: 824F C000h
Log. address: 41CF C000h (-4080 0000h)

これらの違いがどのように発生するか、およびfile_extent_itemsで指定された論理アドレスでデータ範囲を見つけることができるようにこれを追跡する方法を知りたいです。この謎に対する答えを知っている人はいますか(またはファイルの内容がある場合は、別の方法でファイルの内容を見つける方法:P)?

PS:コンテンツごとにファイルを見つけることができないので、唯一の方法はbtrfs_***_itemsでファイルを見つけることです。

関連情報