extended filesystem (ext fs), second extended filesystem (ext2fs), third extended filesystem (ext3fs) は,Laboratoire MASI--Institut Blaise Pascal の Re'my Card < card@masi.ibp.fr>, マサチューセッツ工科大学の Theodore Ts'o < tytso@mit.edu>, エディンバラ大学の Stephen Tweedie < sct@redhat.com> が Linux 上で設計,実装したファイルシステムです.
これは初期の Linux で使われていた古いファイルシステムです.
Second Extended ファイルシステムは Linux コミュニティで最も広く使われ ているファイルシステムでしょう.このファイルシステムは UNIX ファイルシステムの標準のセマンティクスと先進的な機能を持っています. さらに,カーネルのコードに組み込まれている最適化のおかげで,頑健な上に 優れた性能を発揮します.
ext2fs は拡張を念頭に置いて設計されているため,新しい機能を追加するた めのフックを持っています.現在のファイルシステムを拡張しようと作業して いる人達もいます.POSIX のセマンティクスに準拠したアクセス制御リストや 削除したファイルの復元,オン・ザ・フライのファイル圧縮の機能などです.
ext2fs はもともと Linux カーネルで開発とまとめが行われましたが,現在は 他の OS への移植も活発に行われています.GNU Hurd 上で動作する ext2fs サーバも実装されていますし,Mach マイクロカーネル上で動作する LITES サー バや VSTa OS に ext2fs を移植する作業を行っている人達もいます.最後に, しかし重要な点なのですが,Masix OS では ext2fs が重要な位置を占めてお り,現在は作者の一人が開発に従事しています.
Second Extended ファイルシステムは,最初の Extended ファイルシステムが 抱えていた問題を解決するために設計と実装が行われました. 作者らの目的は,UNIX ファイルのセマンティクスと先進的な機能を持った 強力なファイルシステムを提供することでした.
もちろん,ext2fs に優れた性能を持たせることも考えられていました. 作者らは厳しい使い方をしてもデータを失う危険の少ない非常に頑健な ファイルシステムを作ろうともしていました.最後に,これも重要な点なので すが,ext2fs にはファイルシステムを再フォーマットすることなく新しい機 能を使えるような拡張のための準備も施しておかなければなりませんでした.
ext2fs は UNIX 標準のファイル型に対応しています.すなわち 通常ファイル,ディレクトリ,デバイス特殊ファイル,シンボリックリンクです.
ext2fs は非常に大きなパーティション上に作られたファイルシステムを管理 できます.元々のカーネルコード自身が扱える最大のファイルシステムの大き さは 2GB であり,最近の VFS 層ではこの制限は 4TB まで緩和されています. したがって,現在はたくさんパーティションを作らなくても大きなディスクを 使えるようになりました.
ext2fs はロングファイルネームを扱えます.可変長のディレクトリエントリ も扱えます.ファイル名の最大の長さは 255 文字です.この制限は必要なら ば 1012 文字まで拡張できます.
ext2fs は一部のブロックをスーパーユーザ(root
)のために予約して
います.普通は,全ブロックのうち 5% が予約されています.これにより,
ユーザプロセスがファイルシステムを使い切ってしまったような状況からもう
まく修復作業を行えます.
UNIX の標準的な機能に加えて,ext2fs は UNIX ファイルシステムには通常は 含まれていない拡張機能をいくつかサポートしています.
ファイル属性を使うと,ユーザはあるファイル群に対するカーネルの動作を変 えられます.ユーザはファイル属性をファイルまたはディレクトリに設定でき ます.ディレクトリの場合は,そのディレクトリに作られた新しいファイルに その属性が反映されます.
マウント時に BSD と System V Release 4 のどちらのセマンティクスを使う かを選べます.システム管理者はマウントオプションを使ってファイル作成の セマンティクスを選べます.BSD のセマンティクスでマウントされたファイル システム上では,ファイルは親ディレクトリと同じグループ ID で作成されま す.System V のセマンティクスは多少複雑です.もしディレクトリに setgid ビットが設定されていたら新しいファイルはそのグループ ID を引き継 ぎ,ディレクトリはグループ ID と setguid ビットを引き継ぎます.それ以 外の場合には,ファイルとサブディレクトリは作成を行ったプロセスの 主グループ ID を持ちます.
ext2fs では BSD と同様の同期更新を行えます.システム管理者のマウント オプションの指定により,メタデータ(i-ノード,ビットマップブロック, 間接ブロック,ディレクトリブロック)のディスクへの書き込みを メタデータの変更と同時に行うように要求できます. これはメタデータの一貫性を厳密に確保したい場合には便利ですが, 性能はひどくなります.実際のところ, この機能は普通は使われません.なぜならメタデータの同期更新によって 性能が落ちる上,ファイルシステムの検査プログラム(訳注: fsck)が エラーを出さないのにユーザデータが壊れていることもあり得るからです.
ext2fs では,システム管理者はファイルシステムの作成時に論理ブロックの サイズを選べます.ブロックサイズは普通は 1024, 2048, 4096 のいずれかです. ブロックサイズを大きく取ると I/O 要求が減ってディスクヘッドのシークが 減るので,1 つのファイルにアクセスするのに必要な I/O 処理を高速にできます. その一方,ブロックを大きく取るとディスク容量の無駄が多くなります. 平均すると,ファイルに割り当てられた最後のブロックは半分しか埋まらない ので,ブロックを大きく取るほど各ファイルの最後の部分でのブロックの無駄 が大きくなります.さらに,大きいブロックサイズを扱う利点のほとんどは, ext2 ファイルシステムの先行割り当て(preallocation)技術によって得られる ものです.
ext2fs には高速シンボリックリンクが実装されています. この高速シンボリックはファイルシステム上のデータブロックを全く使いませ ん.リンク先の名前はデータブロックに格納されるのではなく,i-ノード自体 に格納されます.この方針によりディスク容量もいくらか節約できます( データブロックを割り当てる必要がない)し,リンクの動作を高速にできます (リンクにアクセスした際にデータブロックを読み出す必要がない).もちろん, i-ノード内で使える容量は限られているため,全てのリンクを 高速シンボリックリンクにできるわけではありません. 高速シンボリックリンクで使えるリンク先の名前は最大で 60 文字です. 開発者らはこの手法を近い将来に小さいファイルにも拡張しようと計画してい ます.
ext2fs はファイルシステムの状態を常に追跡しています.カーネルコードは スーパーブロックの特殊なフィールドを使ってファイルシステムの状態を示し ます.ファイルシステムが読み書き可能モードでマウントされている時には 「クリーンでない(Not Clean)」状態に設定されます.このファイルシステム がアンマウントされるか読み取り専用モードで再マウントされると,この状態 は「クリーン(Clean)」に再設定されます.システムの起動時には ファイルシステム検査プログラムはこの情報を見て,ファイルシステムの検査 が必要かどうかを決めます.カーネルコードはエラーもこのフィールドに記録 します.カーネルコードがファイルシステムの矛盾を発見すると, ファイルシステムは「エラーあり(Erroneous)」を記録します. ファイルシステム検査プログラムはこの状態を見つけると,クリーン状態であ るかどうかに関わらず必ずファイルシステムの検査を実行します.
ファイルシステムの検査を常に飛ばすのは危険かもしれません.したがって, ext2fs では定期的に強制的に検査を行う方法を 2 つ用意しています.1 つは マウント回数をスーパーブロックに覚えておく方法です.ファイルシステムが 読み書き可能モードでマウントされる度にこのカウンタは増えていきます. このカウンタが最大値(この値もスーパーブロックに記録されています)になる と,ファイルシステム検査プログラムはファイルシステムが「クリーン」であっ ても検査を強制的に実行します.前回の検査時刻と検査の最大間隔は スーパーブロックに記録されています.これらの 2 つのフィールドを使って, システム管理者は定期的な検査を行えます.最大検査間隔に到達すると, 検査プログラムはファイルシステムの状態を無視し,必ずファイルシステムを 検査します.
ファイル属性を用いるとユーザはファイルを安全に消すことができます. こういったファイルを削除すると,それまでファイルに割り当てられていた ディスクブロックにはランダムなデータが書き込まれます.これにより, 悪意のあるユーザがディスクエディタを使って削除前のファイルの内容を得る のを防げます.
最後に,4.4 BSD ファイルシステムにヒントを得た新しい型の ファイルシステムが最近になって ext2fs に追加されました. 不変ファイル(immutable file)は読み取りだけが可能です. このファイルには誰も書き込むことができません.これは重要な設定ファイル を保護するために使えます.追加専用のファイル(append-only file)は 書き込みモードでオープンできますが,データは必ずファイルの末尾に追加さ れます.不変ファイルと同じく,追加専用のファイルも削除や名前の変更は できません.これは大きくなっていくだけのログファイルに設定しておくと特 に便利です.
ext2 ファイルシステムの物理的な構造は BSD ファイルシステムの配置の影響 を強く受けています.ファイルシステムはブロックグループからできています. ブロックグループは BSD の FFS のシリンダグループに似ています.しかし, ブロックグループはディスク上の物理的なブロック配置に結びつけられてはい ません.なぜなら,最近のドライブは連続的なアクセスに適した最適化が行わ れ,物理的なジオメトリを OS に見せないようにしているものが多いからです.
,---------+---------+---------+---------+---------, | ブート |ブロック |ブロック | ... |ブロック | | セクタ |グループ1|グループ2| |グループn| `---------+---------+---------+---------+---------'
各ブロックグループはファイルシステムの重要な制御情報(スーパーブロック とファイルシステム記述)のコピーを冗長に持っており,また ファイルシステムの一部(ブロックビットマップ,i-ノードビットマップ, i-ノード表の一部,データブロック)を持っています.ブロックグループの構 造は以下の表の通りです:
,---------+---------+------------+------------+---------+---------, |スーパー | FS |ブロック |i-ノード |i-ノード |データ | |ブロック | 記述 |ビットマップ|ビットマップ|表 |ブロック | `---------+---------+------------+------------+---------+---------'
ブロックグループを使うことで,信頼性の面では大きな利点を得られます. 制御構造は各ブロックグループに複製されるので,スーパーブロックが壊れた ファイルシステムを復旧させるのは簡単です.この構造は性能を出すためにも 役立ちます.i-ノード表とデータブロックの距離を小さくすることにより, ファイルに対する I/O を行っている間のディスクヘッドのシークを減らせる からです.
ext2fs では,ディレクトリは可変長エントリのリンクリストとして管理され ています.各エントリは i-ノード番号,エントリの長さ,ファイル名とその 長さを持っています.可変長のエントリを用いることにより,ディレクトリ内 でディスクスペースを無駄遣いすることなくロングファイルネームを実装でき ます.
Linux カーネルの ext2fs のコードでは性能のための最適化がたくさん行われ ています.これにより,ファイルの読み書きの際の I/O 速度が向上していま す.
ext2fs は先行読み込みを行うことにより,バッファキャッシュ管理を有効に
生かしています.あるブロックを読み込まなくてはならない時には,カーネル
コードはいくつかの連続したブロックに対して I/O の要求を出します.
このようにして,次に読み込まれるブロックが既にバッファキャッシュに
ロードできているようにします.先行読み込みは普通はファイルの連続的な
読み込みの間に行われますが,ext2fs ではこの先行読み込みをディレクトリ
の読み込みに拡張しています.ディレクトリの先行読み込みは
明示的な読み込み(readdir(2)
システムコール)と暗黙的な
読み込み(カーネルの namei
によるディレクトリ参照)の両方に対し
て行われます.
ext2fs は割り当てについても多くの最適化を行っています. ブロックグループは関係する i-ノードとデータをひとまとまりにするためにも使 われます.カーネルコードは常に,1 つのファイルに対するデータブロックを 同じグループ内で i-ノードとして割り当てようとします.これはカーネルが i-ノードとそれに対応するデータブロックを読み込む時にディスクヘッドの シークを減らすための処理です.
ファイルにデータを書き込む時は,ext2fs は新しいブロックを割り当てる際 に隣接した 8 つまでのブロックを先行割り当てします.先行割り当ての ヒット率はファイルシステムがほとんどいっぱいの時でも約 75% です. この先行割り当てにより,負荷が高い時の書き込み性能が良くなります. また,先行割り当てを行うとファイルに対して連続的なブロックが割り当てら れるので,後で連続的な読み込みを行う際の速度を向上させることができます.
これらの 2 つの割り当て最適化により,以下の 2 点について非常に良い 局所性を実現できます:
ext3 は ext2 と同じ機能に対応していますが,さらにジャーナリング機能も 持っています.ext3 の先行バージョンは ftp://ftp.uk.linux.org/pub/linux/sct/fs/jfs/ から入手できます.
作者の方は現在 Be Inc に勤めているため,NTFS と ext2 ファイルシステム サポートについての情報は WWW ページにはあまり載らなくなるでしょう. ドライバは将来の BeOS のリリースに入るでしょう.
これは Macintosh で ext2 ファイルシステム(Linux, MkLinux)をマウントで きるようにする MacOS 用ドライバです.