Ext2 FS
Rev.14を表示中。最新版はこちら。
編集中ディスク上のレイアウト
領域 |
説明 |
---|---|
スーパーブロック |
パーティション全体に関する情報を持つ。 ・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中のテーブルで管理される。このテーブルはファイルデータが格納されているディスクブロックのブロック番号を格納しており、ここを参照することでファイルデータにアクセスすることができる。テーブルの最初のエントリがファイルの先頭ブロックのブロック番号、二番目のエントリがファイル中2番目のブロックのブロック番号となっている(図1)。
ブロック番号を格納したテーブルは16エントリある。エントリ0〜12はそのままブロック0〜12のブロック番号を直接指している。エントリ13〜15は扱いが異なり、ブロック番号を間接的に参照する。これらのエントリが指しているブロックにはi-nodeにあるのと同じブロック番号を保持した16エントリのテーブルが格納されており、そこから、さらにブロック番号をたどってデータブロックを指すようになっている。i-node上のテーブルのエントリ13は2段間接参照、 エントリ14は3段間接参照、エントリ15は4段間接参照するようになっている。
ファイル中の14番目(#13)のブロックのデータが格納されているブロックのブロック番号を取得したい場合は、- i-nodeのテーブルのエントリ13から2段目のテーブルを取得
- 2段目のテーブルのエントリ0からブロック番号を取得
というようにテーブルをたどって行くことになる。
このように、ファイルサイズに合わせてブロック管理テーブルを増設するようにすることでして、たどるようにすることで、管理領域の無駄が発生しないようになっている。
Read処理
Read処理のエントリルーチンはgeneric_file_read()(struct file_operationsの.readに設定されている)。