Linux Kernel(2.6)の実装に関するメモ書き

Ext2 FS


Rev.19を表示中。最新版はこちら

編集中

ディスク上のレイアウト

Ext2ファイルシステムのパーティション内の構造を図1に示す。パーティションは複数のブロックグループに分割される。各ブロックグループには表1に示す領域がある。ブロックグループに分割しているのは、ファイルのフラグメントを減らすため。


図1 Ext2パーティションの構造


表1 ブロックグループ内の各領域
領域
説明
スーパーブロック
パーティション全体に関する情報を持つ。
・i-node数
・ブロック数
・空きブロック数
・空きi-node数
など。
通常はブロックグループ0のスーパーブロックがプライマリとして使用される。他のブロックグループにあるスーパーブロックはバックアップとして使用される。ただし、全ブロックにバックアップがあるわけではない。
(Ref. to man dumpe2fs, man e2fsck, ext2_fs.h::struct ext2_super_block)
ブロックディスクリプタ(群)
ブロックグループ内に関する情報を持つ。
・ブロックビットマップ領域のブロック番号
・ i-nodeビットマップ領域のブロック番号
・i-nodeテーブル領域のブロック番号
・空きブロック数
・空きi-node数
など。
自分のブロックグループに対するディスクリプタだけでなく。パーティション内の全ブロックグループのブロックディスクリプタが並べて置かれている。スーパーブロックと同じく使用されるのはブロックグループ0のディスクリプタ。他のブロックグループのディスクリプタはバックアップとして使用される。
(Ref. to ext2_fs.h::struct ext2_group_desc)
ブロックビットマップ
データブロック領域のディスクブロックの使用/未使用を管理するビットマップ
i-nodeビットマップ
i-nodeテーブル中のi-nodeの使用/未使用を管理するビットマップ
i-nodeテーブル
ファイル、ディレクトリを管理するi-nodeが並べられている。
(Ref. to ext2_fs.h::struct ext2_inode)
データブロック
ファイル、ディレクトリ等のデータが格納される領域


i-node

ファイルやディレクトリはi-nodeで管理される。ファイルやディレクトリにはi-nodeテーブルからi-nodeが1つ割り当てられる。i-nodeには、ファイルのパーミッション、オーナー、サイズ、修正日付などの属性情報が格納されている(ext2_fs.h::struct ext2_inode参照)。なお、ファイル名についてはディレクトリエントリで管理される。ディレクトリエントリについては後述。

ファイルやディレクトリの中身のデータについては、i-node内にあるブロック番号を格納したテーブル(ext2_inode.i_block[])によりデータを格納したブロックと関連付けられる(図2)。このテーブルの詳細については「ファイルデータの管理」を参照。


図2 i-node

 

ファイルデータの管理

ファイルのデータはデータブロック領域に置かれるが、データブロック領域のどのブロックに格納されているのかは、i-node中のテーブル(ext2_inode.i_block[])で管理される。このテーブルはファイルデータが格納されているディスクブロックのブロック番号を格納しており、ここを参照することでファイルデータにアクセスすることができる。テーブルの最初のエントリがファイルの先頭ブロックのブロック番号、二番目のエントリがファイル中2番目のブロックのブロック番号となっている(図3)。

ブロック番号を格納したテーブルは16エントリある。エントリ0〜12はそのままブロック0〜12のブロック番号を直接指している。エントリ13〜15は扱いが異なり、ブロック番号を間接的に参照する。これらのエントリが指しているブロックにはi-nodeにあるのと同じブロック番号を保持した16エントリのテーブルが格納されており、そこから、さらにブロック番号をたどってデータブロックを指すようになっている。i-node上のテーブルのエントリ13は2段間接参照、 エントリ14は3段間接参照、エントリ15は4段間接参照するようになっている。

ファイル中の14番目(#13)のブロックのデータが格納されているブロックのブロック番号を取得したい場合は、
  1. i-nodeのテーブルのエントリ13から2段目のテーブルを取得
  2. 2段目のテーブルのエントリ0からブロック番号を取得

というようにテーブルをたどって行くことになる。

このように、ファイルサイズに合わせてブロック管理テーブルを増設するようにすることでして、たどるようにすることで、管理領域の無駄が発生しないようになっている。



図3 i-nodeからのデータブロックの参照

ディレクトリエントリ

ディレクトリのi-nodeのデータ(ext2_inode.i_block[]の参照先)は、ディレクトリエントリのリストになっている(図3)。ディレクトリエントリとはファイル/ディレクトリの名前を格納しているエントリのことで、このリストには、ディレクトリ直下にある(ls -aで見える)ファイル/ディレクトリのディレクトリエントリが並んでいる。


図3 ディレクトリエントリ

ディレクトリエントリのリストから、ディレクトリ内のファイル/ディレクトリの名前一覧を取得できる。また、各ディレクトリエントリは対応するi-nodeの番号を保持しているため、そこから修正時刻などファイルの属性情報やファイル本体を取り出すことができる。

ディレクトリのi-nodeのデータは、そのディレクトリのエントリリストになるので、ディレクトリエントリ=>i-node=>ディレクトリエントリ=> ... のようにしてファイルシステムのツリーをたどれる。

(参照:ディレクトリエントリのフォーマット ext2_fs.h::struct ext2_dir_entry_2)

Read処理

Read処理のエントリルーチンはgeneric_file_read()(struct file_operationsの.readに設定されている)。


最終更新 2007/02/09 12:40:46 - kztomita
(2006/10/05 02:53:58 作成)
添付ファイル
inode_block.png - kztomita
partition.png - kztomita
inode.png - kztomita
direntry.png - kztomita


リンク
最近更新したページ
検索