抽出された inode が指すデータブロックは、ファイル内のデータと一致できません。

抽出された inode が指すデータブロックは、ファイル内のデータと一致できません。

この質問は、次の質問の派生です。ディスクからraw ext3 inodeデータを抽出する方法は?

内容が単純なテキスト文字列「AAA」の/tmp/fooファイルがあります。このデータを含むディスクブロック#を見つけて、そのブロックからデータを抽出して実際に「AAA」が含まれていることを確認したいと思います。だから私は次のことをしました。

  1. stat fooアイノード番号が318903だと思います。
  2. debugfs -R 'imap <318903>' /dev/vda3この inode がブロック 1277956、オフセット 0x0600 にあることを通知します。
  3. dumpe2fs /dev/vda3これは、ブロックサイズが4096(バイト)で、inodeサイズが256(バイト)であることを示します。
  4. ディスクの起動に基づいて256バイトブロックのinodeオフセットを計算します(ddを使用して256バイトブロックを抽出する方が簡単です):(1277956 x 4096)+(1536)/ 256 = 20447302
  5. ディスクからinode(生データ)を抽出する:dd if=/dev/sda3 of=/tmp/inode.0 bs=256 count=1 Skip=20447302
  6. ext2 inodeテーブルの構造を見てください(ext3 inodeは同じ構造を持っています)。http://www.nongnu.org/ext2-doc/ext2.html#INODE-TABLE
  7. 正しいinodeブロックを抽出していることを確認するために、いくつかのテストを実行します chgrp 1 /tmp/foo; dd if=/dev/sda3 of=/tmp/inode.1 bs=256 count=1 skip=20447302; cmp -l /tmp/inode.1 /tmp/inode.0。 cmpの出力は次のとおりです。
13 217 362
14 225 222
25   1   0

inode 構造を参照すると、バイト 25 が i_gid に対応することがわかるので、これは実際にディスクから正しい inode ブロックをインポートしたことを確認させます (以前はグループが 0 でしたが現在は 1 です)。所有権の変更、データの追加によるファイルサイズの変更、ディスクからのinodeの再抽出などの同様のテストも実行できます。これらのテストでは、正しい inode ブロックがあるかどうかを確認し続けます。

  1. ドキュメントによると、inodeテーブルのバイト41〜44には、データブロック(ファイルの実際の内容のブロック番号 - ファイルデータ)へのポインタが含まれています。 inodeを0ファイルとバイト単位で比較すると、バイト41-44の値を見ることができます。cmp -l /tmp/inode.1 /tmp/zero.256
 25   1   0
 27   1   0
 29  10   0
 41  56   0
 42 220   0
 43  23   0
101 275   0
102  53   0
103 240   0
104 374   0

"cmp"は8進数値を提供します。したがって、バイト44が上位バイトであると仮定すると、8進ポインタの値は23です。 220 | 220 56です。これを 2 進数 = 10011110 または 100111001000000101110 に変換します。 10進数に変換すると= 1282094

  1. 今、"1282094"は私たちのデータに適したブロック番号ですか? dumpefs​​の出力を見直すと、inode(ブロック1277956)とデータ(ブロック1282094)の両方がブロックグループ39に含まれる範囲に属することがわかり、合理的な数値を持つように見えます。

グループ 39: (ブロック 1277952-1310719) 1277954-1278464 の Inode テーブル (+2)

  1. したがって、ddを使用してディスクからデータブロックを抽出し、その内容を確認でき、ファイルの内容(「AAA」)と一致する必要があります。しかしそれは真実ではない。データブロックには他のコンテンツが含まれており、どこにも「AAA」はありません。dd if=/dev/vda3 of=/tmp/data bs=4096 count=1 skip=1282094; cmp -l /tmp/data /tmp/zero.4096
   1 333   0
   2 335   0
   3   4   0
   5  14   0
   7   1   0
   8   2   0
   9  56   0
  13 221   0
  14 335   0
  15   4   0
  17 364   0
  18  17   0
  19   2   0
  20   2   0
  21  56   0
  22  56   0

これは/tmp/fooの内容と同じではありません。ブロックから外れたのではないかと思い、周辺ブロック(1282093と1282095)も抽出しましたが、まだ欲しいものが見つかりませんでした。

ここで何が起こっているのでしょうか?このアドインは何ですか?なぜ「AAA」がないのですか?

11/14。解決しました。ファイルシステムにいくつかの問題(孤立したinodeなど)があることがわかりましたが、fsckで問題を解決し、すべてが期待どおりに実行されます。貴重な洞察力と提案をたくさん提供してくれたWumpusとderobert(コメント参照)に大きな感謝を伝えたいと思います。素晴らしい。

ベストアンサー1

おすすめ記事