この質問は、次の質問の派生です。ディスクからraw ext3 inodeデータを抽出する方法は?
内容が単純なテキスト文字列「AAA」の/tmp/fooファイルがあります。このデータを含むディスクブロック#を見つけて、そのブロックからデータを抽出して実際に「AAA」が含まれていることを確認したいと思います。だから私は次のことをしました。
stat foo
アイノード番号が318903だと思います。debugfs -R 'imap <318903>' /dev/vda3
この inode がブロック 1277956、オフセット 0x0600 にあることを通知します。dumpe2fs /dev/vda3
これは、ブロックサイズが4096(バイト)で、inodeサイズが256(バイト)であることを示します。- ディスクの起動に基づいて256バイトブロックのinodeオフセットを計算します(ddを使用して256バイトブロックを抽出する方が簡単です):(1277956 x 4096)+(1536)/ 256 = 20447302
- ディスクからinode(生データ)を抽出する:dd if=/dev/sda3 of=/tmp/inode.0 bs=256 count=1 Skip=20447302
- ext2 inodeテーブルの構造を見てください(ext3 inodeは同じ構造を持っています)。http://www.nongnu.org/ext2-doc/ext2.html#INODE-TABLE
- 正しい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 ブロックがあるかどうかを確認し続けます。
- ドキュメントによると、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
- 今、"1282094"は私たちのデータに適したブロック番号ですか? dumpefsの出力を見直すと、inode(ブロック1277956)とデータ(ブロック1282094)の両方がブロックグループ39に含まれる範囲に属することがわかり、合理的な数値を持つように見えます。
グループ 39: (ブロック 1277952-1310719) 1277954-1278464 の Inode テーブル (+2)
- したがって、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(コメント参照)に大きな感謝を伝えたいと思います。素晴らしい。