JFFS2 - Journaling Flash File System, version 2
JFFS2は、
Linuxオペレーティングシステム向けに開発されたNAND型フラッシュメモリ用のログ構造
ファイルシステムです。このシステムは、初代の
JFFSを改良したものであり、2001年9月に
Linuxカーネルのメインラインに統合されて以来、広く使用されています。
JFFS2は、Axis Communicationsの開発した初期バージョンを基に、Red Hatのデビッド・ウッドハウスによって改良されました。特に、
OpenWrtなどのプロジェクトで多く利用されています。
JFFS2は、特にNAND型フラッシュメモリに特化した設計がなされており、従来の
JFFSが持ついくつかの欠点を克服するために数多くの改良が加えられています。
JFFSは、
NOR型フラッシュメモリ特有の
ウェアレベリングアルゴリズムを使用していたために、その寿命を短くする傾向がありましたが、
JFFS2ではこれが改良され、循環ログの概念が廃止されました。また、データ圧縮の導入により、パフォーマンスの向上も実現されています。
主な機能
JFFS2で新たに実装された機能は以下の通りです:
1.
NANDフラッシュデバイスのサポート: NAND型デバイスは読み書きのインターフェースが独特であるため、これに対応するための工夫が求められました。
2.
ハードリンクのサポート: 以前の
JFFSでは不可能だったハードリンク機能が追加され、より柔軟なファイル管理が可能になりました。
3.
データ圧縮: 圧縮
アルゴリズムとして、zlib、rubin、rtime、およびlzoを選択でき、データの効率的な保存を実現しています。
4.
性能の向上: 従来の循環ログ方式で生じる不要な入出力を大幅に削減し、
ガベージコレクションアルゴリズムによって効率的なデータ管理を行なっています。
設計とデータ構造
データの記録は、ノードと呼ばれる単位で行われます。主なノードの種類は以下のとおりです:
- - iノード: これはファイルメタデータを含むヘッダーとファイルデータのペイロード(圧縮される場合も含む)を保持しています。
- - direntノード: 各ディレクトリエントリは、名前とiノード番号を保有し、異なる名前で同じiノード番号を持つことによってハードリンクを表現します。
ノードは、作成時には有効として扱われ、新しいバージョンが作成されると廃止される仕組みです。ただし、従来の循環ログは採用されておらず、
JFFS2ではフラッシュメディアの消去セグメントに合わせたサイズのブロックを用いてデータが管理されます。データは、下から上に順次埋められ、不要なデータを持つダーティブロックと、有効なデータのみを持つクリーンブロックによって管理されます。
ガベージコレクターはバックグラウンドで動作し、ダーティブロックをクリーンなブロックに変換します。このプロセスでは有効なノードが新しいブロックに移動され、不要なノードはスキップされます。作業が完了した後、ダーティブロックは消去され、空きブロックとなります。また、
ウェアレベリングの観点から、ガベージコレクタはクリーンなブロックも使用しつつ、消去作業を行います。
課題と改善点
JFFS2のデザインにはいくつかの欠点もあります。特に、マウント時にすべてのノードをスキャンする必要があるため、これが遅延の要因となります。この問題に対処するため、
Linuxカーネルのバージョン2.6.15でEBS(消去ブロックの概要)が導入され、効率的なノードのスキャンが実現されています。また、小さいブロックの書き込みが多くなると圧縮効率が低下することがあり、大きな書き込みバッファを使う必要があります。
結論として、
JFFS2はその設計において多くの倫理的な改善を加えた成功した
ファイルシステムであり、特にフラッシュメモリを利用する多様なデバイスにおいてその効果を発揮しています。