Linuxの主要なファイルシステム

2、3年前とは異なり、Linuxシステムで使用するファイルシステムを選択するのは、数秒で済む問題(Ext2とReiserFSのどちらにするか)ではありません。. カーネル2.4およびそれ以降では、さまざまなファイルシステムが選択できるようになりました。 この後で、各ファイルシステムの基本的な動作原理、およびそれらが提供する利点の概要について説明します。

あらゆる用途で最適な単一のファイルシステムなど存在しない、ということを考慮しておくことが重要です。 各ファイルシステムには特定の利点と欠点があり、それらを考慮する必要があります。 最も洗練されたファイルシステムであっても、妥当なバックアップの方針を別の機能で置き換えることはできません。

この章で「データの完全性」および「データの一貫性」という用語が登場した場合、それらはユーザスペースのデータ(アプリケーションが自らのファイルに書き込むデータ)の一貫性を指していません(メタデータの一貫性を指します)。 ユーザスペースのデータが一貫しているかどうかは、アプリケーション自体が管理する必要があります。

[Important]ファイルシステムのセットアップ

この章では特に注記がない限り、パーティションやファイルシステムのセットアップまたは変更するために必要なステップは、すべてYaSTを使用して実行できます。

ReiserFS

2.4カーネルの主要機能の1つとして、バージョン6.4から2.2.x SUSEカーネルに対して、ReiserFSをカーネルパッチとして利用できるようになりました。ReiserFSは、Hans ReiserとNamesys開発チームにより設計されました。ReiserFSは、Ext2に代わる強力な選択肢であることを実証してきました。 その主要な利点は、より良いディスクスペース使用効率、より良いディスクアクセスパフォーマンス、およびより高速なクラッシュ回復機能です。

ReiserFSの利点をより詳細に記述すると、以下のようになります。

より良いディスクスペース使用効率

ReiserFSでは、すべてのデータは、B*-Tree(バランスドツリー)と呼ばれる構造内で編成されています。 このツリー構造は、より良いディスクスペース使用効率に貢献しています。小さなファイルは、B*-Treeのリーフノードに直接格納されるからです。そのようなファイルをどこか他の場所に格納して、ディスク上の実際の場所を指すポインタを維持するより優れています。 それに加えて、ストレージ(記憶領域)は 1KBまたは 4KBのチャンク単位で割り当てられるのではなく、実際に必要なサイズの構成部分(エクステント)を割り当てられます。もう1つの利点は、inodeの動的割り当てに関係しています。 これは、ファイルシステムの作成時にinodeの密度を指定する必要のある、Ext2のような従来のファイルシステムに比べて、ファイルシステムの柔軟性を高めます。

より良いディスクアクセスパフォーマンス

小規模なファイルでは、多くの場合、ファイルのデータと「stat_data」 (inode)情報が互いに隣り合って保存されます。 これらは1回のディスクI/O操作で読み取れるので、ただ1回のディスクアクセスで、必要な情報すべてを取得できることを意味します。

高速なクラッシュ回復機能

ジャーナルを使用して、メタデータに加えられた最新の変更結果を記録しているので、ファイルシステムが大規模な場合を含め、ファイルシステムを数秒でチェックできます。

データジャーナリングによる信頼性

ReiserFSは、Ext3のセクション25.2.3項 「Ext3」で説明した概念に類似したデータジャーナリングおよび順序データモードをサポートしています。 デフォルトのモードは、data=orderedです。このモードでは、データとメタデータの完全性は保証されますが、メタデータのジャーナリングだけが行われます。

Ext2

Ext2の起源は、Linuxの歴史の初期にさかのぼります。 その前身であったExtended File Systemは、1992年4月に実装され、Linux 0.96cに統合されました。 Extended File Systemは多くの変更を加えられ、Ext2として数年にわたって、最も人気のあるLinuxファイルシステムになりました。 その後、他のジャーナルファイルシステムが作成され、非常に短い回復時間を達成したため、Ext2の重要性は低下しました。

Ext2の利点に関する短い要約を読むと、かつて幅広く好まれ、そして今でも一部の分野で多くのLinuxユーザから好まれるLinuxファイルシステムである理由を理解するのに役立ちます。

堅牢性

古くからある標準」として、Ext2は過去に多くの改良を受け、集中的にテストされてきました。 このような理由で、多くの人はExt2を岩のように堅牢(rock-solid)と呼びます。 ファイルシステムが正常にアンマウントできず、システムが機能停止した場合、e2fsckはファイルシステムのデータの分析を開始します。 メタデータは一貫した状態に戻り、保留されていたファイルとデータブロックは、指定のディレクトリ(lost+found)に書き込まれます。 ジャーナルファイルシステムとは対照的に、e2fsckは、最近変更されたわずかなメタデータだけではなく、ファイルシステム全体を分析します。 この結果、ジャーナルファイルシステムがログデータだけをチェックするのに比べて、かなり長い時間を要します。 ファイルシステムのサイズにもよりますが、この手順は30分またはそれ以上を要することがあります。 したがって、高可用性を必要とするどのようなサーバでも、Ext2を選択することは望ましくありません。 ただし、Ext2はジャーナルを維持せず、非常にわずかなメモリを使用するだけなので、時には他のファイルシステムより高速なことがあります。

容易なアップグレード性

Ext2のコードは、Ext3が次世代ファイルシステムであることを明確に主張するための強力な土台になりました。 Ext2の信頼性および堅牢性が、ジャーナルファイルシステムの利点と見事に融合されました。

Ext3

Ext3は、Stephen Tweedieによって設計されました。 他のすべての次世代ファイルシステムとは異なり、Ext3は完全に新しい設計理念に基づいているわけではありません。 Ext3は、Ext2をベースとしています。 これら2つのファイルシステムは、互いに非常に似通っています。 Ext3ファイルシステムを、Ext2ファイルシステムの上に構築することも容易です。 Ext2とExt3の間にある最も重要な違いは、Ext3がジャーナルをサポートしていることです。 要約すると、Ext3には、次の3つの主要な利点があります。

Ext2からの容易で信頼性の高いアップグレード

Ext3はExt2のコードをベースとし、ディスクフォーマットとメタデータフォーマットが共通しているので、Ext2からExt3へのアップグレードは非常に容易です。ReiserFSまたはXFSのような他のファイルシステムへの移行はかなり手間がかかります(ファイルシステム全体のバックアップを作成し、移行先ファイルシステムを新規に作成する必要があります)が、それとは異なり、Ext3への移行は数分で完了します。 ファイルシステム全体を新規に作成する作業は障害なしで完了するとは限りませんが、Ext3への移行にはそのような作業が伴わないので、非常に安全でもあります。 ジャーナルファイルシステムへのアップグレードを待つ既存のExt2システムの数を考慮すると、多くのシステム管理者にとってExt3が重要な選択肢になっていることが容易に想像できるはずです。 Ext3からExt2へのダウングレードも、アップグレードと同じほど容易です。 Ext3ファイルシステムのアンマウントを正常に行い、Ext2ファイルシステムとして再マウントするだけです。

信頼性とパフォーマンス

他のジャーナルファイルシステムは、「メタデータのみ」のジャーナルアプローチに従っています。 これは、使用中のメタデータは常に一貫した状態を維持されていますが、ファイルシステムのデータ自体に関しては同じことが自動的に保証されるわけではない、という意味です。 Ext3は、メタデータとデータの両方に注意するよう設計されています。 「注意」の度合いはカスタマイズできます。 Ext3のdata=journalモードを有効にした場合、最大の保護(データの完全性)を実現しますが、メタデータとデータの両方がジャーナル化されるので、システムの動作が遅くなります。 比較的新しいアプローチは、data=orderedモードを使用することです。これは、データとメタデータ両方の完全性を保証しますが、ジャーナルを適用するのはメタデータのみです。 ファイルシステムドライバは、1つのメタデータの更新に対応するすべてのデータブロックを収集します。 これらのブロックは、メタデータの更新前にディスクに書き込まれます。 その結果、パフォーマンスを犠牲にすることなく、メタデータとデータの両方に関する一貫性を達成できます。3番目のオプションは、data=writebackを使用することです。これは、対応するメタデータをジャーナルにコミットした後で、データをメインファイルシステムに書き込むことを可能にします。 多くの場合、このオプションは、パフォーマンスの点で最善と考えられています。 しかし、内部のファイルシステムの完全性が維持される一方で、クラッシュと回復を実施した後では、古いデータがファイル内に再登場することを許してしまう可能性があります。 管理者が他のオプションを指定しない限り、Ext3はデフォルトでdata=orderedを使用して動作します。

Ext2
ファイルシステムからExt3
への変換

Ext2ファイルシステムをExt3に変換するには、次の手順に従います。

  1. rootとしてtune2fs -jを実行して、Ext3ジャーナルを作成します。この結果、デフォルトのパラメータを使用してExt3ジャーナルが作成されます。

    ジャーナルの大きさや、どのデバイスにジャーナルを配置するかを自分で決定するには、代わりにtune2fs -Jを実行し、希望のジャーナルオプションであるsize=およびdevice=を指定します。 tune2fsプログラムの詳細については、「tune2fsマニュアル」ページを参照してください。

  2. Ext3 ファイルシステムがExt3として正しく認識されることを保証するために、rootとして/etc/fstabファイルを編集し、対応するパーティションに対して指定されているファイルシステムタイプをext2からext3へ変更します。この変更結果は、次回の再起動後に有効になります。

  3. Ext3パーティションとしてセットアップされたファイルシステムからブートするには、ext3jbdの各モジュールをinitrd内に含めます。 この作業を行うには、rootとして、ext3およびjbdINITRD_MODULES変数に追加して/etc/sysconfig/kernelを編集します。 変更を保存した後、mkinitrdコマンドを変更します。 これにより新規のinitrdがビルドされ、すぐに使用できます。

XFS

本来は、IRIX OS用のファイルシステムを意図してSGIがXFSの開発を開始したのは、1990年代初期です。 XFSの背後にある考えは、ハイパフォーマンスの64ビットジャーナルファイルシステムを作成し、非常に要求の多い今日のコンピューティングの課題を満たすことです。 XFSは大規模なファイルを操作する点で非常に優れていて、ハイエンドのハードウェアを適切に活用します。 しかし、XFSには1つの欠点があります。 ReiserFSと同様、XFSはメタデータの完全性には最大の注意を払いますが、データの完全性にはそれほど注意を払いません。

XFSの主要な機能を簡単に観察することにより、ハイエンドのコンピューティング分野で、XFSが他のジャーナルファイルシステムの強力な競合相手という立場を実証している理由を説明できます。

アロケーショングループの採用による高いスケーラビリティ

XFSファイルシステムの作成時に、ファイルシステムの基にあるブロックデバイスは、等しいサイズを持つ8つ以上の線形の領域に分割されます。 これらをアロケーショングループと呼びます。 各アロケーショングループは、独自のinodeと空きディスクスペースを管理します。 実用的には、アロケーショングループを、1つのファイルシステムの中にある複数のファイルシステムと見なすこともできます。 アロケーショングループは互いに独立しているのではなく、カーネルから複数を同時にアドレス指定できる、という特徴があります。 この特徴は、XFSの高いスケーラビリティの鍵です。 独立性の高いアロケーショングループは、性質上、マルチプロセッサシステムのニーズに適しています。

ディスクスペースの効率的な管理によるハイパフォーマンス

空きスペースとinodeは、各アロケーショングループ内のB+-Treeによって処理されます。 B+-Treeの採用は、XFSのパフォーマンスとスケーラビリティに大きく貢献しています。 XFSでは、遅延アロケーションを採用しています。 XFSはアロケーション(割り当て)を2つのパートに分割して、この操作を処理します。 保留されているトランザクションはRAMの中に保存され、適切な量のスペースが確保されます。 XFSはこの時点では、データの格納場所(言い換えると、ファイルシステムのどのブロックか)を決定しません。 決定可能な最後の瞬間まで、この決定は遅延(先送り)されます。 短時間だけ存続する一部の一時データは、ディスクに書き込まれません。XFSがデータの実際の保存場所を決定する時点で、それらのデータは不要になっているからです。 したがって、XFSは書き込みのパフォーマンスを向上させ、ファイルシステムの断片化(フラグメンテーション)を減らします。遅延アロケーションは、他のファイルシステムより書き込みイベントの頻度を下げる結果をもたらすので、書き込み中にクラッシュが発生した場合、データ損失が深刻になる可能性が高くなります。

事前割り当てによるファイルシステムの断片化の回避

データをファイルシステムに書き込む前に、XFSはファイルが必要とする空きスペースを予約(プリアロケート、事前割り当て)します。 したがって、ファイルシステムの断片化は大幅に減少します。 ファイルの内容がファイルシステム全体に分散することがないので、パフォーマンスが向上します。

Oracle Cluster File System 2

OCFS2は、クラスタリング設定用に作成されたジャーナルファイルシステムです。Ext3などの標準の単一ノードファイルシステムとは対称的に、OCFS2では複数ノードを管理することができます。OCFS2では、SANやマルチパスセットアップなどの共有ストレージにまたがって、ファイルシステムを拡散することができます。

OCFS2セットアップの各ノードは、すべてのデータに対して同時に読み込み/書き込みアクセスを行うことができます。そのためには、OCFS2がクラスタに対応していなければなりません。つまり、OCFS2には、クラスタを構成するノード、およびノードが実際に動作して利用できるかどうかを判断できる手段がなければなりません。クラスタのメンバーシップを算出するために、OCFS2にはノードマネージャ(NM)が用意されています。クラスタ内のノードの可用性を監視するために、OCFS2には簡単なハートビート機能が実装されています。多数のノードからのファイルシステムへの直接アクセスによる混乱を回避するために、OCFS2にはロックマネージャのDLM(distributed lock manager)も用意されています。ノード間の通信は、TCPベースのメッセージングシステムにより処理されます。

OCFS2の主要機能と利点を次に示します。

  • メタデータのキャッシングとジャーナリング

  • データベースのパフォーマンスを向上する非同期、直接I/Oのサポート

  • 最大16TBまでのボリュームで、最高4KBまでの複数ブロックサイズをサポート(各ボリュームで異なるブロックサイズを使用可能)

  • ノード間にまたがるファイルデータの整合性

  • 255台までのクラスタノードをサポート

OCFS2の詳細は、第14章 Oracle Cluster File System 2を参照してください。