Ext4

ext4は、Linuxのファイルシステムで、ジャーナリングファイルシステムの一つである。ext3の後継のファイルシステムで、拡張機能を使っていない場合に限りext3としてマウントできる。1EiBまでのストレージをサポートし、ファイルの断片化を防ぐextent file writingと呼ばれるシステムが導入される。ファイルのタイムスタンプは、ナノ秒単位で西暦1901年から2514年までの範囲をサポートする。Linuxカーネル 2.6.19より開発版が利用が可能になり、2.6.28より安定版のファイルシステムとなった。

1. 経緯
-----

ext3に対して後方互換性を保ちつつ、64ビットストレージの制限を除き、パフォーマンスを向上させるために開発が始められた。しかしLinuxカーネルの開発者たちは、安定性に対する懸念から、ext3に拡張を加えることに反対した。その代わり、ext3のソースコードから分岐してext4と改名し、現行のext3ユーザーに影響を及ぼすことなく開発を進めることを提案した。この提案は受け入れられ、2006年6月28日、ext3のメンテナであるセオドア・ツォー  は新しいプロジェクトとしてext4の開発を発表した。

最初の開発スナップショットはLinux 2.6.19に導入された。2008年10月11日には、ext4を安定コードとしたパッチがLinux 2.6.28のソースコードリポジトリに結合された。これは開発段階の終了を意味し、ext4の採用を推奨するものであった。ext4ファイルシステムを含むLinux 2.6.28は、2008年12月25日にリリースされた。

2. 特徴
-----

大きなボリュームサイズとファイルサイズext4ファイルシステムは、最大1EiBまでのボリュームサイズと、最大16TiBまでのファイルサイズをサポートする。エクステントエクステントは、ext2およびext3で使われてきた伝統的なブロックマッピング方式を置き換える概念である。エクステントは連続した物理ブロックの集合であり、大きなファイルに対するパフォーマンスを改善し、フラグメンテーションの発生を減らすことができる。ext4におけるエクステントは、4KiBのブロックサイズで最大128MiBまでの連続した領域をマッピングすることができる。inodeごとに4つのエクステントを格納することができる。ひとつのファイルに5つ以上のエクステントがあるとき、残りのエクステントはHtreeで構造化される。後方互換性ext4ファイルシステムはext3およびext2に対する後方互換性を持つ。すなわち、ext3およびext2ファイルシステムをext4ファイルシステムとしてマウントすることができる。その場合でも、わずかにパフォーマンスの向上が見られる。なぜなら、ブロック確保アルゴリズムなどの新しい機能はext3やext2でも使用できるからである。ext3ファイルシステムは部分的にext4に対する前方互換性を持つ。すなわち、ext4ファイルシステムをext3パーティションとしてマウントできる。しかし、もしext4パーティションがエクステントを使用しているなら、ext3としてマウントすることはできなくなる。永続的な事前確保ext4ファイルシステムはファイルのためのディスク空き領域の事前確保を可能にする。ほとんどのファイルシステムにおけるこれまでの方法論では、ファイルが作成されたときに予約されたスペースを0で埋める形で書き込まれる。ext4においてはこの方法で要求されることはもはやない。そのかわり、新しくfallocateシステムコールがLinuxカーネルにファイルシステム用に追加され、ext4やXFSにおいて使われている。これにより互換性が維持されている。ファイルのために確保されたスペースはディスクフルによる書き込み失敗はしないことが保証され、連続していることが期待される。この機能はメディアストリーミングやデータベースで使われる。遅延確保
ext4ファイルシステムのパフォーマンス向上のテクニックとして、allocate-on-flushと呼ばれるものがある。これは//遅延確保//としても知られている。つまりext4では、データがディスクにフラッシュされるまでブロックの確保が遅延される。より大きなデータを一度に効率的に確保することにより、遅延確保はパフォーマンスを向上させ、フラグメント化を減少させる。サブディレクトリの32000個制限の撤廃ext3ファイルシステムにおいては、1つのディレクトリに入れられるサブディレクトリ数が32,000個に制限されている。この制限がext4ファイルシステムでは65,000個まで引き上げられ、"dir_nlink"機能を使うとそれを超える事が可能となる。一つのディレクトリ内のファイル数が増えた場合における性能を上げる為、Htreeインデックスは、ext4でデフォルトでオンになった。この機能はLinux kernel 2.6.23 から導入されている。Htreeはext3でもdir_index機能が有効であれば利用可能であった。ジャーナルのチェックサムext4は信頼性を向上するため、ジャーナルにチェックサムを使用する。なぜならばジャーナルはディスクで最も使用されるファイルの一つだからである。この機能によってジャーナル過程の間ディスクI/Oの待機を安全に避ける事ができるという利点を持つ。これによりパフォーマンスが若干向上する。ジャーナルのチェックサムのテクニックは『IRON File Systems』というウィスコンシン州立大学の研究論文にインスパイアされたものである。オンラインのデフラグメンテーションe4defrag により、マウント中でのデフラグが可能になった。ファイルシステムのフラグメンテーションを避けるための様々なテクニックによってフラグメントしにくくなっているが、それでもなお、長期間運用されたファイルシステムは時間経過によってフラグメントが発生する場合がある。より高速なファイルシステムチェックext4において、確保されていないブロック群とi-nodeテーブル部は印をつけられる。これはe2fsck
の実行時に全体のチェックを不要にし、ファイルシステムのチェックにかかる時間を大きく減少させる。この機能は2.6.24のLinuxカーネルで実装された。マルチブロックの確保ext3では、ファイルが追加される際にブロックアロケータをそれぞれのブロック個別に1回ずつ呼び出す。そのため、同時に複数書き込みを行う場合には、ディスク上でファイルのフラグメントは容易に発生する。しかし、ext4ではデータをバッファして複数のブロック群を一度に確保する遅延確保を利用する。これはアロケータは何を書き込むべきかについてより多くの情報を保持することを意味し、そしてディスク上のファイル領域確保のためより良い選択を行うことができるようになる。マルチブロックアロケータは遅延確保がファイルシステム上で有効になっているとき、もしくはファイルがO_DIRECTモードで開かれているときに使用される。この機能はディスクフォーマットには影響しない。タイムスタンプの改良コンピューターが全体的により高速になると共に、Linuxはよりミッションクリティカルな用途で使用されるようになり、秒ベースの粒度のタイムスタンプでは不十分となってきている。この解決として、ext4ではタイムスタンプをナノ秒単位で提供している。付け加えて、2038年問題を引き伸ばすためにタイムスタンプの秒フィールドの上位に2ビットの拡張タイムスタンプフィールドが付け加えられ、結果として204年後まで先延ばしにしている。ext4は作成日時のタイムスタンプを追加でサポートする。しかし、セオドア・ツォーが指摘するように、inodeに作成日時フィールドを追加するのは簡単であるものの、stat などの必要なシステムコールや、それに依存する各ライブラリの変更や追加はより難しい。これらの変更は様々なプロジェクトでの調整が必要となる。そのため、ext4に保存された作成日時は、現在のところLinux上のユーザプログラムに対してstatx APIによってのみ提供される。

3. 欠点
-----

3.1. 遅延割り当てとデータ損失
-----------------

遅延割り当ては、すべてのデータをディスクに書き出す前にファイルシステムがクラッシュした際、データを損失する危険性を孕む。

このようなことが起こる典型的なシナリオは、fsyncでディスクに書き出すことをせずにファイルの内容を書き換えるようなプログラムを使用する時である。実際に書き出しをする前にシステムがクラッシュすると、問題が起こる可能性がある。このような状況では、ext3のユーザーは、クラッシュ後に変更前か変更後のどちらかのデータがディスクに残されているということを期待することができた。一方、Linuxカーネル2.6.28のext4では、クラッシュ前にファイルの内容を消去するが新しいデータを書き出さず、結果としてデータが損失するということがしばしば見られた。

この問題に対処するためにfsyncを頻繁に使用すると、data=orderedフラグでマウントされたext3ファイルシステムでは深刻なパフォーマンス低下が起こる恐れがある。どちらのファイルシステムもしばらくの間使用されるだろうということを考えると、これはエンドユーザーアプリケーション開発者にとって非常に厄介な問題となる。このため、セオドア・ツォーは、上記のような場合の遅延割り当てを制限するext4のパッチを作成した。パフォーマンスは多少低下するが、これによってクラッシュ後にどちらかのバージョンのデータが残る可能性が著しく高まった。

このパッチはメインライン・カーネル2.6.30に導入されているが、様々なディストリビューションは2.6.28や2.6.29へとバックポートすることができる。例えば、Ubuntuはバージョン9.04 Jaunty Jackalopeでカーネル2.6.28にそのパッチを導入した。

4. ディストリビューション
--------------

以下の Linux ディストリビューションで標準ファイルシステムとして採用されている。

Ubuntu - 9.04 から利用可能、9.10 から標準
Debian - 6.0 から利用可能
Fedora - 9 から利用可能、11〜15 にて標準
Red Hat Enterprise Linux - 5.6 からフルサポート
Amazon Linux AMI - 2011.02 から標準

5. 脚注
-----

6. 関連項目
-------

Btrfs
ファイルシステム

7. 外部リンク
--------

[1]
[2]
[3]
[4]
[5] 
[6] 
[7] 
[8]
[9]
[10], with ext4 and ssh
[11]