ファイルシステム(その1)
今回からしばらく、Ext2 ファイルシステムについてしらべてゆく。
ここで言うような低レイヤのファイルシステムは、ディスクデータの管理機構を表す。これから、linux 標準の ext2 ファイルシステムにおけるディスク構造、及びこれらを円滑に処理するためのメモリ構造、そして、データ保存方法の概略を学習し、詳細な処理を追ってゆく事にする。
今回は、ext2 ファイルシステムのディスク構造の概略を学習してゆく。
まず、ext2 のファイルシステムの構造について話しをはじめる。尚、ここで『ディスク構造』や『ディスク管理』といった、"ディスク"用語を多用いているが、これは ext2 ファイルシステムによって管理されている記憶装置がディスクであるというだけの話しで、このファイルシステムが扱うメディア媒体がディスクである必然性はない。そして、ここでは一般的な補助記憶装置であるディスクを、ext2 ファイルシステムによって管理されている記憶装置として話しを進める。
ext2 のディスク構造のを図示したものが以下のサイト
http://opentechpress.jp/kernel/internal24/node105.shtml#SECTION03710000000000000000
から参照出来る。
図のように、ext2 におけるディスクは複数のブロックグループから構成されている。
各ブロックグループにおける "super block" は、カーネルが使用する ブロックグループ0 のそれらの複製になる。このような冗長な構造になっている理由は、整合性の一貫性を保つ為である。
仮に、ブロックグループ0 の スーパーブロック が破損した場合、e2fsck 実行時に他のブロックグループに含まれるそれらの情報を参照・復元する事ができる。
次に、スーパーブロック が保有している情報を見てゆく。
ディスクにおけるスーパーブロックの情報は、exet2_super_block 構造体から参照できる。ここでは、ブロック長、ブロック数、フラグメント長、フラグメント数、iノード数 などのリソース情報や、最後に fsck を行った時刻や、実行時間間隔などの fsck に関する情報、そして、最後にマントしたマウントポイントのパス名や時刻など、マウントに関する情報といった、ディスク全体に関する情報を持っている。
教科書的な話しになるが、ここで"フラグメント"について確認する。
ext2 ファイルシステムは、ファイル(*1)データをブロックグループ内のデータブロックに保存する(ディスク領域を管理する方法については後述する)。この時、データはブロック単位で保存され、大きいファイルは複数のブロックを必要とする。しかし、ext2 はこのような大きなファイルを保存する場合、連続的なブロック領域を確保してそこに保存するような事は一般的にはしない。このような事をした場合、外部断片化(フラグメンテーション)を引き起こす。
ext2 では、スーパーブロックの s_log_frag_size メンバを用いてフラグメント長を設定し、これより大きなファイルは、ここで指定されたフラグメント長に分割されて保存される。
(*1)ただし、デバイスファイル、パイプ そして ソケットファイル はデータブロックに保存されない。
先に説明したスーパーブロックは、ディスク全体に関する情報を持っていた。次に説明する ブロックグループディスクリプタ は、各ブロックグループに関する情報を持つ。
ブロックグループディスクリプタは、ext2_group_desc 構造体によって定義されており、ブロックグループ内の空きブロック数や、空きi ノード数、そしてブロックグループ内のディレクトリ数などを持つ。
データブロックビットマップ と iノードビットマップ はそれぞれブロックグループの後方に存在する データブロック と iノードテーブル のビットマップを表す。それぞれのビットマップは1ブロック分の領域で表現されている。よって、各ブロックグループに存在するデータブロックは、ブロックサイズを 4,096 バイトとした場合、8 倍の 131,072 個存在する(又、後述する、iノードの i_block メンバが 32 ビット変数の配列である事から、ext2 ファイルシステムの一つのパーティションで扱うことのできる最大のデータ量は 16TB である事がわかる)。
iノードは、あらゆるファイルに対する情報を持つ。Ext2 の iノードの構造は ext2_inode 構造体によって定義されており、ファイルの種類、アクセス権、iノード番号、リソース情報(ファイルの長さ、ブロック数、各種時刻)などを持っている。
ここで、iノード及びデータブロックの識別方法について話しをする。
iノードは、iノード番号と呼ばれる識別子で識別される。しかし、ext2_inode 構造体にはこの iノード番号 を持たない。にも関らず、ディレクトリと呼ばれるファイルは、今言ったように、この iノード によってファイルを識別する。
これは、iノード番号が最初のブロックグループのiノードから付けられた連番である事から、ブロックグループ番号とiノードテーブルのオフセットから iノード番号 を算出できる為、このような構造になっている。つまり、iノードのサイズは 128 バイトであり、各ブロックグループに存在する iノード の数は、先のブロックグループ数と同じく 1ブロック のサイズを 4,096 バイトとした場合、131,072 個である為、ブロックグループ番号と、iノードが存在するブロックグループにおけるiノードテーブルのオフセットによって、iノード番号がわかる。
以上が ext2 ファイルシステムにおけるディスク構造である。
まだ、ファイルのデータブロックをディスクのブロックグループのデータブロックにアドレッシングする方法について述べていないが、これについては次回説明した後、より実装的な話しをしてくつもりだ。
- Category(s)
- 学習経過
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/ohyama/30d530a130a430eb30b730b930c630e0-305d306e1/tbping