次のページ 前のページ 目次へ

6. Extended ファイルシステム (ext, ext2, ext3)

extended filesystem (ext fs), second extended filesystem (ext2fs), third extended filesystem (ext3fs) は,Laboratoire MASI--Institut Blaise Pascal の Remy Card < card@masi.ibp.fr>, マサチューセッツ工科大学の Theodore Ts'o < tytso@mit.edu>, エディンバラ大学の Stephen Tweedie < sct@redhat.com> が Linux 上で設計,実装したファイルシステムです.

6.1 Extended ファイルシステム (extfs)

これは初期の Linux で使われていた古いファイルシステムです.

6.2 Second Extended ファイルシステム (ext2 fs)

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 の「標準」機能

ext2fs は UNIX 標準のファイル型に対応しています.すなわち 通常ファイル,ディレクトリ,デバイス特殊ファイル,シンボリックリンクです.

ext2fs は非常に大きなパーティション上に作られたファイルシステムを管理 できます.元々のカーネルコード自身が扱える最大のファイルシステムの大き さは 2GB であり,最近の VFS 層ではこの制限は 4TB まで緩和されています. したがって,現在はたくさんパーティションを作らなくても大きなディスクを 使えるようになりました.

ext2fs はロングファイルネームを扱えます.可変長のディレクトリエントリ も扱えます.ファイル名の最大の長さは 255 文字です.この制限は必要なら ば 1012 文字まで拡張できます.

ext2fs は一部のブロックをスーパーユーザ(root)のために予約して います.普通は,全ブロックのうち 5% が予約されています.これにより, ユーザプロセスがファイルシステムを使い切ってしまったような状況からもう まく修復作業を行えます.

ext2fs の「先進的な」機能

UNIX の標準的な機能に加えて,ext2fs は UNIX ファイルシステムには通常は 含まれていない拡張機能をいくつかサポートしています.

ファイル属性を使うと,ユーザはあるファイル群に対するカーネルの動作を変 えられます.ユーザはファイル属性をファイルまたはディレクトリに設定でき ます.ディレクトリの場合は,そのディレクトリに作られた新しいファイルに その属性が反映されます.

マウント時に BSD と System V Release 4 のどちらのセマンティクスを使う かを選べます.システム管理者はマウントオプションを使ってファイル作成の セマンティクスを選べます.BSD のセマンティクスでマウントされたファイル システム上では,ファイルは親ディレクトリと同じグループ ID で作成されま す.System V のセマンティクスは多少複雑です.もしディレクトリに setgid ビットが設定されていたら新しいファイルはそのグループ ID を引き継 ぎ,ディレクトリはグループ ID と setguid ビットを引き継ぎます.それ以 外の場合には,ファイルとサブディレクトリは作成を行ったプロセスの 主グループ ID を持ちます.

ext2fs では BSD と同様の同期更新を行えます.システム管理者のマウント オプションの指定により,メタデータ(i-ノード,ビットマップブロック, 間接ブロックとディレクトリブロック)のディスクへの書き込みを 変更が行われたと同時に行うように要求できます.これはメタデータの一貫性 を厳密に確保したい場合には便利ですが,性能は低下します.実際のところ, この機能は普通は使われません.なぜならメタデータの同期更新による性能の 低下に加え,ファイルシステムの検査プログラムがフラグを立てないユーザ データを壊してしまうことがあるからです.

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 点について非常に良い 局所性を実現できます:

6.3 Third Extended Filesystem (Ext3 FS)

ext3 は ext2 と同じ機能に対応していますが,さらにジャーナリング機能も 持っています.ext3 の先行バージョンは ftp://ftp.uk.linux.org/pub/linux/sct/fs/jfs/ext3/ から入手できます.

6.4 E2compr - ext2fs における透過的な圧縮

このソフトウェアパッケージは ext2 ファイルシステムで `chattr +c' が行 えるようにします.パッケージは Linux カーネルへのパッチと,パッチが当 たったバージョンの各種プログラム(主に e2fsprogs に含まれるプログラム. つまり e2fsck 等)からできています. このソフトウェアを何年も使っている人もいますが,これはまだ開発中で す.したがって,エンドユーザが使うものではありません.

6.5 DOS から ext2 にアクセスする方法(ext2 tools)

Linux の ext2 ファイルシステムを DOS で読めるようにする DOS 用プログラム 集です.

6.6 DOS, Windows 9x/NT, 他の UNIX から ext2 にアクセスする方法 (LTools)

LTOOLS は DOS/Windows 3.x/Windows 9x/Windows NT や Linux 以外の UNIX で動作し,Linux の MTOOLS のように動作します.LTOOLS を使えば, 他の OS から Linux ファイルにアクセス(読み書きと修正)できます. LTOOLS の中心となるのはコマンドライン用のプログラム群です. これに加えて Java 用のスタンドアロンの GUI が利用可能です.この他にも, 普通の WWW ブラウザを GUI として使えます.LTOOLS はローカルの Linux ファイルにアクセスできるだけでなく,他のマシンのファイルにリモート アクセスすることもできます.

6.7 OS/2 から ext2 にアクセスする方法

EXT2-OS2 は OS/2 から Linux の ext2 でフォーマットされたパーティション にアクセスできるようにするパッケージで,ext2 パーティションを OS/2 標準のドライブレターのように扱えるようになります.このパッケージの最終 目標は,ext2 ファイルシステムを FAT や HPFS に置き換えて使えるようにす ることです.今のところ目標達成に足りない機能は OS/2 拡張属性への対応だ けです.

6.8 Windows 95/98 から ext2 にアクセスする方法(FSDEXT2)

6.9 Windows 95 から ext2 にアクセスする方法(Explore2fs)

ext2fs を読み書きできるユーザ空間アプリケーションです.ハードディスク および ZIP やフロッピーディスクを含むリムーバブルメディアに対応してい ます.Windows のエクスプローラのようなインタフェースを使ってファイルや 詳細情報を見ることができます.ドラッグ&ドロップやコンテクストメニュー 等にも対応しています.Windows NT 用に書かれていますが,Windows 95 にも ある程度対応しています.大きなディスクでは問題が起きることがあります.

6.10 Windows NT から ext2 にアクセスする方法 (ext2fsnt)

6.11 BeOS から ext2 にアクセスする方法

これは BeOS が Linux の ext2 ファイルシステムをマウントできるようにす るドライバです.作者は現在リリースされているバージョンがかなり安定して いると考えているようです.このドライバは長い間使われていますが, バグ報告はありません.

作者の方は現在 Be Inc に勤めているため,NTFS と ext2 ファイルシステム サポートについての情報は WWW ページにはあまり載らなくなるでしょう. ドライバは将来の BeOS のリリースに入るでしょう.

6.12 MacOS から ext2 にアクセスする方法(MountX)

これは Macintosh で ext2 ファイルシステム(Linux, MkLinux)をマウントで きるようにする MacOS 用ドライバです.

6.13 MiNT から ext2 にアクセスする方法

これは FreeMiNT で完全に動作する ext2 ファイルシステムドライバです. 例えば,このドライバは Linux に実装されているものと同じように実際の ext2 を読み書きできます.パーティションのサイズの制限はなく, 論理セクタサイズは 1024, 2048, 4096 バイトにできます.唯一の制限は 物理セクタサイズは論理セクタサイズ以下でなければならないことです. パーティションを mke2fs で初期化していればブロックサイズを変更するこ とができます.

6.14 ext2fs のデフラグ

ext2 ファイルシステムのデフラグを行います.glib ライブラリのアップデート が必要です.

6.15 ext2fs のサイズ変更

ext2fs のサイズ変更を行います.

6.16 Ext2end

LVM に対して使うツールで,2 つのユーティリティが 含まれています.ext2endable は空の ext2 ファイルシステムを再編成して 容量を広げられるようにし,ext2end マウントされていない ext2 ファイルシステムの容量を広げます.ファイルシステムを作成したときに ext2endable を実行されていないと,ext2end は次の 256MB の倍数までしか 容量を増やせません.

6.17 E2fsprogs を使った ext2 の修復/解析/作成

ext2fsprogs には ext2 ファイルシステム用の重要なユーティリティが含まれ ています.すなわち,e2fsck, mke2fs, debugfs, dumpe2fs, tune2fs やその 他の重要な ext2 ファイルシステム用ユーティリティです.

6.18 ext2 ファイルシステムエディタ - Ext2ed

EXT2ED は ext2 ファイルシステム用のディスクエディタです. このエディタは ext2 ファイルシステムの構造を分かりやすく直観的な形で表 示し,ファイルシステム上を容易に「動きまわって」必要な修正を加えること ができます.

6.19 Linux ファイルシステムエディタ - lde

lde を使うと Linux のファイルシステムのいくつかを表示します.現在は 16 進ブロックと i-ノードの編集にも対応しており,lde を使って少し作業す るだけで消してしまったファイルを他のパーティションにダンプすることがで きます.対応しているファイルシステムは ext2, minix, xiafs です. 「LaTeX Introduction to the Minix fs」も入っています. 2.2.x と 2.3.x カーネルでコンパイルするにはソースにパッチを当てる必要 があります.なぜなら,これらのバージョンのカーネルでは Xia のヘッダが なくなっているからです.

6.20 ext2 用の削除取り消しユーティリティ

これはカーネル 2.0.30 用のパッチで,ext2fs に用意されている 「削除取り消し可能」属性を使って削除取り消し機能を追加します. このパッチには man ページ,削除取り消しデーモン,削除取り消しユーティリティ が入っています.WWW ページをチェックして最新で一番出来のよいバージョン を入手してください.


次のページ 前のページ 目次へ