理解ext 4,第1部(extents)


翻訳http://computer-forensics.sans.org/blog/2010/12/20/digital-forensics-understanding-ext4-part-1-extents
EXT 4はEXT 2、EXT 3ファミリーの次世代ファイルシステムとして2008年10月に2.6.28バージョンのカーネルに受け入れられた.本明細書では、EXT 4がデフォルトのファイルシステムとして多くのリリースLinuxによって作成されている.EXT 4ファイルシステムはEXT 2,EXT 3とある程度互換性があるが,既存のファイルシステムとは大きな違いがある.Sleuthkitのようなファイルシステムツールソフトウェアでは、EXT 4ファイルシステムの下で機能する機能もありますが、EXT 4のこれらの変化に完全に互換性がありません.
EXT 4に関するレポートを読んだとき、EXT 4構造のディスク上の実際の分布状況、既存のツールがEXT 4ファイルシステムで失効した原因に興味を持ちました.だから私は16進エディタを使って検討することにしました.これはこのシリーズの最初の文章です.
ブロックアドレスEXT 4は48ビットのブロックアドレスを使用しており、EXT 4ファイルシステムがなぜこのように設計されたのか、なぜファイルシステムのサイズが大きくなったのかを上記の文章を引用して説明します.EXT 4とEXT 2、EXT 3などの従来のUnixファイルシステムの最大の違いは
間接ブロック(inefficient indirect block)ではなくextentsがファイル内容をマークします.extentはNTFSファイルシステムの実行(run)に似ており、本質的にはextentを構成する一連のファイルブロックの開始アドレス、数を示す.1つのファイルは複数のextentで構成される場合がありますが、EXT 4はできるだけファイルの連続保存を保証します.
この新しいブロックアドレスメカニズムは、既存のファイルシステムツールのほとんどが異常である原因である.たとえば、EXT 4ファイルシステムで新しいファイルを作成し、Sleuthkitツールパッケージのistatで確認すると、istatが完全に解析できないことがわかります.
# echo Here is a new file >testfile
# ls -li testfile
918817 -rw-r--r-- 1 root root 19 2010-12-05 11:08 testfile
# istat /dev/mapper/elk-home 918817
inode: 918817
Allocated
Group: 112
Generation Id: 3173542730
uid / gid: 0 / 0
mode: rrw-r--r--
Flags:
size: 0
num of links: 1

Inode Times: Accessed: Sun Dec 5 11:08:49 2010 File Modified: Sun Dec 5 11:08:49 2010 Inode Modified: Sun Dec 5 11:08:49 2010

Direct Blocks:

istatは、新しいファイルinodeのextent構造を完全に解析できないため、ブロックアドレスを表示できません.以上の出力をよく見ると、表示されているファイルのサイズが0バイトであることもわかります.これは完全に間違っています.別の観点から、inodeメタデータの多くの他の情報は、owner、group owner、MAC timesなど、正しいように見えます.
実際,EXT 4開発者はEXT 4のinodeがEXT 2,EXT 3のinode構造を最大限下に互換性を持つことを保証するのに苦労した.しかし、extent、新しいタイムスタンプなど、完全な互換性を保証することはできません.
解析EXT 4のinode
EXT 4のinode構造を16進エディタで観察したいのですが、ディスク内のinodeの位置を正確に計算する必要があることを意味します.幸いなことに、EXT 4ファイルシステム上のスーパーブロック、ブロックグループ記述テーブルは下向きに互換性があり、fsstatを使用すると十分な情報を得ることができます:#
fsstat/dev/mapper/elk-home
FILE SYSTEM INFORMATION -------------------------------------------- File System Type: Ext3 [...] CONTENT INFORMATION -------------------------------------------- Block Range: 0 - 113971199 Block Size: 4096 Free Blocks: 13506529
BLOCK GROUP INFORMATION -------------------------------------------- Number of Block Groups: 3479 Inodes per group: 8192 Blocks per group: 32768 [...] Group: 112: Inode Range: 917505 - 925696 Block Range: 3670016 - 3702783 Layout: Data bitmap: 3670016 - 3670016 Inode bitmap: 3670032 - 3670032 Inode Table: 3670048 - 3670559 Data Blocks: 3670033 - 3670047, 3670560 - 3702783 Free Inodes: 3281 (40%) Free Blocks: 0 (0%) Total Directories: 2 [...]
以前のistat出力結果から,inodeが112ブロック群にあると判断できた.fsstatの出力の112ブロックグループに関する情報を観察することもでき、918817という番号のinodeがちょうどこのブロックグループの範囲内にあることがわかります.
EXT 4の最大の変化は、そのinodeが256バイトであり、EXT 2、EXT 3ファイルシステムのinodeは128バイトしかないことである.これは、4 K毎のブロックに16個のinodeがあることを意味し、各ブロック群には8192個のinodeが含まれ、開始位置の512個のブロックが占有される.現在のブロックグループには、3670048から36700559まで512ブロックが占有されていることがわかります.結果はまさに予想された.
しかし、さっきファイルを作成したinodeが含まれているブロックはどれですか?112グループにおいて、最初のinodeのアドレスは917505である.918817でこの値を減算すると、探しているinodeはinodeテーブルの開始位置から1312番目のinodeを計算することが分かった.幸いなことに、1312を16で割るとちょうど82、すなわちinodeテーブルの82番目のブロックが得られるため、これはちょうど1つのブロックの始まりである.また、inodeテーブルの最初のブロックアドレスが3670048であるため、36700130ブロックの最初の256バイトにinodeを見つける必要があります.
blkcatコマンドを使用してこのブロックをエクスポートすると、16進エディタで分析できます.
# blkcat /dev/mapper/elk-home 3670130 >blk-3670130

EXT 4のinode顕微
新しいEXT 4 inodeはEXT 3のファイルシステムの2倍であり,EXT 4の開発者はinodeの上位128ビットの試用方法をできるだけ変更しないことを試みた.したがって、4~7バイト目に小エンドバイト順の32ビットファイルサイズを見つけることができます.
理解ext4,第一部分(extents)_第1张图片小端バイトシーケンスでは、生成されたファイルの長さである19バイトのファイル長として解析されます.正しいinodeを見つけたように見えます.
しかしながら、EXT 4は、ブロックがファイルの内容を指すのではなく、extentを試用したため、40〜99の60バイト目から、ブロックポインタではなくextent情報を保存するために使用された.extent構造は12バイトなので、inodeごとに最大5つのextentを試用できます.その後、最初の12バイトはextent領域(40〜51バイト)であり、1つのextentヘッダ構造によって占有されるため、1つのinodeには実際に4つのextentが含まれ得る.
The values in the extent header are broken out as follows:
extentヘッダの値解析は、次のようになります.
オフセットバイト数で細分化し、次のようにします.
Bytes 40-41: Magic number (0xF30A = 62218)
      42-43: Number of extents (0x0001 = 1)
      44-45: Max number of extents (0x0004 = 4)
      46-47: Depth of tree (0x0000 = 0)
      48-51: Generation ID (0x00000000 = 0)
マジック数(magic number)は、異なるextent実装方式を区別するために使用される.魔数の新機能は、古い実装方式との互換性を強化するために使用される.「Depth of tree」と「GenerationID」の値については後述する.
我々の前の議論によれば、inodeのextent数は、最大4であり、44〜45バイト目にタグ付けされる.今後、EXT 4の実施者は、inodeに追加のextentを保存する方法を選択すると予想されるので、2バイトのプレースホルダを将来に残す方法がある.42~43バイト目で、このファイルにはextentが1つしかないことを示します.
次の12バイトはextentの詳細を示します.
Bytes 52-55: Logical block number (0x0000)
      56-57: Number of blocks in extent (0x0001)
      58-59: Upper 16 bits of physical block address (0x0000)
      60-63: Lower 32 bits of physical block address (0x003A883F)
論理ブロック番号は、ファイルtに対するextenの開始位置を示す.マルチextentsのファイルでは、これは非常に重要な内容になります.しかし、現在のファイルにはextentが1つしかないため、論理ブロック番号が0のファイルの開始があります.
次の2バイトは、このextentにいくつかのブロックがあることを示します.小さなファイルなので、ブロックが1つしか必要ありません.
次の6バイトは、このextentの最初のブロックの物理ブロック番号、すなわち、このブロックのディスク上の位置を示します.現在のコンピュータシステムでは、魚16、32、64ビットの位置合わせが期待されていますが、48ビットは多少問題があります.したがって、48ビットのブロックアドレスは、実際には2つの値を表す:最初の2バイトはブロックアドレスの高い16ビットを与え、後の4ビットは小端バイトシーケンスの32ビットアドレスを与える.我々の例では、ブロック番号3835967をビットブロックアドレス0 x 000003 A 883 Fに解析する.
次に、正しいかどうか試してみます.
# blkcat /dev/mapper/elk-home 3835967
Here is a new file

これ以上extentがないため、inodeに続く36バイトが空です.これは興味深い実験であり、これらの未使用のフィールドがデータを隠すために使用できるかどうかを確認します.
続行...