ファイルシステムとは
ファイルシステムとは、データとメタデータをある構造に従ってストレージデバイス上に格納したものを指す。
ファイルシステムの作成には mkfs(8)
コマンドを使用する。
全体アーキテクチャ
以下の図の通りである。詳細は以下で説明する。
ファイルシステムの構造
ここでは、古典的ファイルシステムであるext2をベースに説明する。
ファイルシステム内で領域を割り当てる基本単位を論理ブロックという。ディスクデバイスの連続する物理ブロックから構成される。論理ブロックサイズ1024,2048,4096バイトのいずれかを選択できるが、これは mkfs(8)
のパラメータとして与える。
ディスク上では、以下のように格納される。※ext2の構造はブロックグループごとに分かれており、もう少し複雑になっている。
- ブートブロック・・・OSを起動する情報を保存する。すべてのファイルシステムでブートブロック用に空きスペースとなっている。常に先頭に位置する。
- スーパブロック・・・ブートブロックの直後に位置する1ブロックの領域である。「i-nodeテーブルサイズ」「論理ブロックサイズ」「論理ブロック数」を保存する。
- i-nodeテーブル・・・ファイルシステム内のすべてのディレクトリ、ファイルはi-nodeテーブル内で1エントリを占めている。
- データブロック・・・ファイルシステムの大半を占めるブロックで、ファイル、ディレクトリを構成する情報を保存する。
i-nodeとは
i-nodeはファイルシステムにおけるデータ構造である。1ファイル、ディレクトリごとにi-node tableの1エントリが使用される。i-node内には以下の情報が保存される。
- ファイルの種類
- オーナ(UID)
- グループ(GID)
- パーミッション
- タイムスタンプ(ファイルに最後にアクセスした時刻/ファイルを最後に変更した時刻/ファイルの属性を最後に変更したした時刻)
- ハードリンクカウント
- バイト単位のファイルサイズ
- ファイルに割り当てたブロック数
- ファイルデータを保存したデータブロックへのポインタ
i-nodeは以下の図のような構造になっている。
i-nodeでは、i-node内に保持しているデータブロックへのポインタによって、ファイルデータを持つデータブロックを特定する。この構造によってファイルは連続したブロックを保持する必要がなく、ディスクを効率良く使用することができる。同時にi-nodeサイズの固定化、複数のデータブロックにまたがる巨大ファイルサイズのファイルの格納が可能、小さなサイズファイルのファイルに対して低レイテンシでアクセス可能になった。
VFS
Linuxで使用できるファイルシステムの実装はそれぞれファイルシステムごとに異なる。ユーザランドから統一的にファイルシステムを操作できるためのインターフェイスがVFSである。VFSによって、プログラムは個々のファイルシステムの実装の詳細を気にすることなく、VFSが持つインターフェイスのみを使用すればよい。
VFSが定義する汎用インターフェイスは、ファイルやディレクトリを処理する通常のシステムコール( open()
、read()
、write()
、stat()
等)に対応するものである。
プログラムからの書き込み要求に関しては、バッファキャッシュを使用した遅延書き込みが可能である。
ジャーナリングファイルシステム/非ジャーナリングファイルシステム
ext2といった非ジャーナリングファイルシステムは、ファイルの整合性/維持に fsck
を実行する必要がある。整合性確認とシステムクラッシュ時の修復にはファイルシステム全体を調べないといけない。ファイルシステムが大規模になると時間がかかるという欠点がある。
非ジャーナリングファイルシステムの欠点を補う形で、ジャーナリングファイルシステムでは、メタデータのすべての変更を、実際に変更する前にディスク上に変更内容をログ(ジャーナル)として記録する。メタデータの更新時にシステムクラッシュによって変更できなかった場合には、ディスク上に記録したログを使用して、未完の更新をredoすることでファイルシステムの整合性を保つことができる。ただし、ファイルの更新時にログへの書き込みのオーバヘッドが伴う。
参考
- [1]MICHAEL KERRISK著 千住 治郎訳,「LINUXプログラミングインタフェーズ」,O'REILLY,2012
- [2]Design and Implementation of the Second Extended Filesystem:http://e2fsprogs.sourceforge.net/ext2intro.html