ext2(Second Extended File System)は、 Linuxカーネル用のファイルシステムです。当初はフランスのソフトウェア開発者レミー・カードによって、拡張ファイルシステム(ext)の代替として設計されました。BSDのBerkeley Fast File Systemと同じ原理に基づいて設計されたため、 Linux向けの最初の商用グレードのファイルシステムとなりました。[7]
ext2の標準的な実装は、Linuxカーネルの「ext2fs」ファイルシステムドライバです。その他の実装(品質と完成度は様々ですが)は、GNU Hurd [8] 、MINIX 3 [ 9] [10]一部のBSDカーネル[11] [12] [13] MiNT [ 14] Haiku [15]、そしてサードパーティ製のMicrosoft Windows [16]およびmacOS(FUSE経由)ドライバとして存在します。ext4ドライバはext2ファイルシステムで動作するため、このドライバはLinuxバージョン6.9で廃止され、ext4ドライバが採用されました。[17]
ext2 はDebianやRed Hat Linuxを含むいくつかのLinux ディストリビューションのデフォルトのファイルシステムでしたが、 ext2 とほぼ完全に互換性があり、ジャーナリングファイルシステムであるext3に取って代わられました。ext2 は、ジャーナルがないためパフォーマンスが向上し、書き込み回数が最小限に抑えられ、フラッシュデバイスは限られた数の書き込みサイクルに耐えることができるため、今でもフラッシュベースのストレージメディア ( SD カードやUSB フラッシュドライブなど)に最適なファイルシステムです [要出典] 。2009 年以降、 [18] Linuxカーネルは、より大きなファイルサイズやボリュームサイズなど、ext2 にはない利点があるext4のジャーナルレスモードをサポートしています。 [19]
Linuxカーネルの初期開発は、 MINIXオペレーティングシステムとのクロス開発として行われました。MINIXファイルシステムはLinuxの最初のファイルシステムとして使用されました。Minixファイルシステムはバグがほとんどありませんでしたが、内部的に16ビットオフセットを使用していたため、最大サイズは64MBに制限され、ファイル名の長さも14文字に制限されていました。[20]これらの制限のため、Linuxのネイティブファイルシステムを置き換える作業が開始されました。[20]
新しいファイルシステムの追加を容易にし、汎用的なファイルAPIを提供するために、仮想ファイルシステム層であるVFS がLinux カーネルに追加されました。拡張ファイルシステム ( ext ) は、VFS API を使用した最初のファイルシステムとして 1992 年 4 月にリリースされ、Linux バージョン 0.96c に含まれていました。[21] ext ファイルシステムは、Minix ファイルシステムの 2 つの大きな問題 (最大パーティションサイズとファイル名の長さが 14 文字に制限される) を解決し、2 GBのデータと最大 255 文字のファイル名を使用できるようになりました。しかし、まだ問題がありました。ファイルアクセス、inode の変更、データの変更 に対して個別のタイムスタンプがサポートされていませんでした。
これらの問題の解決策として、1993年1月にLinuxカーネル0.99向けに2つの新しいファイルシステムが開発されました。xiafsと第2拡張ファイルシステム(ext2)です。[21] ext2は、 Berkeley Fast File Systemのアイデアを多く取り入れた拡張ファイルシステムの改良版です。ext2は拡張性も考慮して設計されており、多くのディスク上のデータ構造に将来のバージョンで使用できるスペースが残されています。[要出典]
それ以来、ext2はVFS APIの多くの新しい拡張機能のテストベッドとなってきました。撤回されたPOSIX ドラフトACL提案や撤回された拡張属性提案などの機能は、拡張が比較的容易で内部構造もよく理解されていたため、一般的に最初にext2で実装されました。
2.6.17より前のLinuxカーネルでは、[22]ブロックドライバの制限により、ext2ファイルシステムの最大ファイルサイズは2 TiBになります。
ext2は、起動可能なUSBフラッシュドライブやその他のソリッドステートドライブ(SSD)上のジャーナリングファイルシステムよりも依然として推奨されています(誰が推奨しているのでしょうか?)。ext2はジャーナリングがないため、ext3よりも書き込み回数が少なくなります。フラッシュチップの劣化の主な要因は消去サイクル数であり、書き込み時に消去サイクルが頻繁に発生するため、書き込み回数を減らすことでSSDの寿命が延びます。[23]フラッシュデバイス上のファイルシステムにおけるもう一つの推奨方法は、同じ理由から、 no atimeマウントオプションを使用することです。
Linuxカーネル6.9以降、ext2fsドライバは非推奨となり、デフォルト設定では有効化されなくなりました。主な理由は、2038年以降の日付をサポートしていなかったためです。[17]ユーザーはext4へのアップグレードが推奨されます。[24]
ext2の空間はブロックに分割されています。これらのブロックは、 Unixファイルシステムのシリンダグループに類似したブロックグループにグループ化されています。大規模なファイルシステムでは通常、数千のブロックが存在します。任意のファイルのデータは、可能な限り単一のブロックグループに収められます。これは、大量の連続データを読み取る際のディスクシーク回数を最小限に抑えるためです。
各ブロック グループには、スーパーブロックとブロック グループ記述子テーブルのコピーが含まれており、すべてのブロック グループには、ブロック ビットマップ、inode ビットマップ、inode テーブル、そして最後に実際のデータ ブロックが含まれています。
スーパーブロックには、オペレーティングシステムの起動に不可欠な重要な情報が含まれています。そのため、ファイルシステム内の複数のブロックグループにバックアップコピーが作成されます。ただし、通常、起動時にはファイルシステムの最初のブロックにある最初のコピーのみが使用されます。
グループ記述子は、各ブロックグループのブロックビットマップ、inodeビットマップ、およびinodeテーブルの開始位置を格納します。これらは、グループ記述子テーブルに格納されます。[25]
すべてのファイルまたはディレクトリは、 inodeによって表されます。「inode」という用語は「index node(インデックスノード)」に由来しています(時が経つにつれて、i-node、そしてinodeへと変化しました)。[26] inodeには、ファイルまたはディレクトリのサイズ、権限、所有権、ディスク上の位置に関するデータが含まれています。
ext2 inode構造の例:
Linuxカーネルのext2ドキュメントからの引用: [27]
inode には、ファイルのデータを含む最初の 12 ブロックへのポインタがあります。また、間接ブロック(次のブロックセットへのポインタを含む)へのポインタ、二重間接ブロックへのポインタ、そして三重間接ブロックへのポインタもあります。
したがって、ext2には15個のポインタを持つ構造体があります。ポインタ1から12は直接ブロックを指し、ポインタ13は間接ブロックを指し、ポインタ14は二重間接ブロックを指し、ポインタ15は三重間接ブロックを指しています。
各ディレクトリはディレクトリエントリのリストです。各ディレクトリエントリは、1つのファイル名を1つのinode番号に関連付け、inode番号、ファイル名の長さ、およびファイル名の実際のテキストで構成されます。ファイルを検索するには、ディレクトリを先頭から末尾まで、関連付けられたファイル名を検索します。ディレクトリのサイズが適度であれば、これで問題ありません。しかし、非常に大きなディレクトリの場合、この方法は非効率的です。そこでext3では、ファイル名のリストよりも効率的な、ディレクトリを格納する別の方法(HTree)を提供しています。
ルートディレクトリは常にinode番号2に格納されるため、ファイルシステムのコードはマウント時にルートディレクトリを見つけることができます。サブディレクトリは、サブディレクトリ名をnameフィールドに、サブディレクトリのinode番号をinodeフィールドに格納することで実現されます。ハードリンクは、複数のファイル名に同じinode番号を格納することで実現されます。どちらのファイル名でファイルにアクセスしても同じinode番号、つまり同じデータになります。
特別なディレクトリ「.」(カレントディレクトリ)と「..」(親ディレクトリ)は、ディレクトリ名「.」と「..」をディレクトリに格納し、カレントディレクトリと親ディレクトリのinode番号をinodeフィールドに格納することで実現されます。これらの2つのエントリが受ける特別な処理は、新しいディレクトリが作成されるたびに自動的に作成され、削除できないという点だけです。
新しいファイルまたはディレクトリが作成されると、ext2はデータの保存場所を決定する必要があります。ディスクがほぼ空の場合、データはほぼどこにでも保存できます。しかし、関連データでデータをクラスタ化することで、シークタイムが最小限に抑えられ、パフォーマンスが最大限に高まります。
ext2は、親ディレクトリと子ディレクトリへのアクセスは密接に関連している可能性が高いという理論に基づき、新しいディレクトリを親ディレクトリを含むグループに割り当てようとします。また、ディレクトリアクセスはファイルアクセスにつながることが多いため、ext2はファイルをディレクトリエントリと同じグループに配置しようとします。ただし、グループがいっぱいの場合、新しいファイルまたはディレクトリは、いっぱいではない別のグループに配置されます。
ディレクトリやファイルを格納するために必要なデータブロックは、データ割り当てビットマップで確認できます。inodeテーブルに必要な領域は、inode割り当てビットマップで確認できます。
ext2 にいくつかの制限がある理由は、データのファイル形式とオペレーティングシステムのカーネルにあります。これらの要因はほとんどの場合、ファイルシステムの構築時に一度決定されます。ブロックサイズと、ブロック数とinode数の比率に依存します。[要出典] Linux では、ブロックサイズはアーキテクチャのページサイズ によって制限されます。
2 GiB を超えるファイルを処理できないユーザー空間プログラムもいくつかあります。
bをブロックサイズとすると、i_block構造体(直接/間接EXT2_N_BLOCKSの配列)とファイル内の1024バイト(1キロバイト)[ 29]の「ブロック」の数を表すi_blocks (32ビット整数値)により、最大ファイルサイズはmin(((b/4)3+(b/4)2+b/4+12)×b、(232−1) ×512 )に制限されます。 [独自の研究? ]
リンク数制限のため、サブレベルディレクトリの最大数は31998です。[要出典] ext2ではディレクトリのインデックス機能が利用できないため、多数のファイル(10,000以上)を含むディレクトリではパフォーマンス上の問題が発生します。ディレクトリ内のファイル数の理論上の制限は1.3 × 10 20ですが、[独自の研究? ]これは実際の状況には当てはまりません。
注: Linux 2.4以前では、ブロックデバイスは2 TiBに制限されており、ブロックサイズに関係なくパーティションの最大サイズが制限されていました。[30]
e2compr は、ユーザー アプリケーションによるサポートなしに、ファイル システムによるファイルの圧縮と解凍をサポートするために Linux カーネルの ext2 ドライバーを変更したものです。e2compr は ext2 に対する小さなパッチです。
e2compr は通常のファイルのみを圧縮します。管理データ(スーパーブロック、inode、ディレクトリ ファイルなど)は圧縮されません(主に安全上の理由から)。圧縮ブロックへのアクセスは、読み取りおよび書き込み操作で提供されます。圧縮アルゴリズムとクラスタサイズはファイルごとに指定します。ディレクトリを圧縮対象としてマークすることもできます。その場合、ディレクトリ内に新しく作成されるすべてのファイルは、ディレクトリに指定されたものと同じクラスタサイズとアルゴリズムで自動的に圧縮されます。
e2comprは新しいファイルシステムではありません。EXT2_COMPR_FLフラグをサポートするためにext2にパッチを当てたものです。ユーザーが新しいパーティションを作成する必要はなく、既存のext2ファイルシステムの読み書きはそのまま行えます。これは、gzipやcompressのようなシンプルなユーティリティで作成できたはずのファイルに、読み書きルーチンがアクセスするための単なる手段だと考えることができます。圧縮ファイルと非圧縮ファイルは、ext2パーティション上で問題なく共存できます。
最新のe2comprブランチは、Linux 2.4、2.6、3.0の最新リリースで利用可能です。Linux 3.0の最新パッチは2011年8月にリリースされ、マルチコアとハイメモリのサポートが追加されました。Linux 2.0および2.2用のブランチも存在します。
Microsoft Windowsでは、ext2パーティションへのアクセスは、ext2ifs [31]やext2Fsd [32]などのインストール可能なファイルシステムを介して可能です。macOSでは、ユーザー空間のファイルシステムを使用できます。[33]