Ext3
Third Extended ("ext3") ファイルシステムには長所がたくさんあります。ext3 のカーネル内のコードやユーザー空間のツールは他の Linux 対応のファイルシステムよりも多く使われ、テストされ、修正が施され、改善が加えられています。ext3 はシンプルかつ強固でありながら、拡張性もあります。この記事ではファイルシステムのパフォーマンスと信頼性の両方を良くするためのヒントを説明しています。
このドキュメントでは一般的なパーティションを /dev/hdXY
と表記します。あなたの使用している実際のデバイスノードに適宜置き換えてください。例えば、スレーブディスクの一番目のパーティションなら /dev/hdb1
、一番目の SCSI または Serial ATA ディスクの二番目のパーティションなら /dev/sda2
になります。
目次
tune2fs と e2fsck を使う
まず最初に、tune2fs ユーティリティを使って ext2 や ext3 パーティションのファイルシステムオプションを変更できる (もしくは ext2 を ext3 に変換する) ことを確認する必要があります。tune2fs の man ページを見て下さい。
ファイルシステムに変更を加えた後は e2fsck ユーティリティを使ってファイルシステムのチェックを実行すると良いでしょう。ファイルシステムが問題ないか確認して、必要であれば修正を行います。まだ使ったことがないのであれば e2fsck ユーティリティの man ページを読んで下さい。
ディレクトリインデックスを使う
この機能は、ハッシュ化されたバイナリツリーを使ってディレクトリの情報を保存することで、巨大なディレクトリや、多数のファイルを含んでいるディレクトリでのファイルアクセスを高速化します。完全に安全に使うことができ、ほとんとの場合で、劇的にアクセス速度が向上します。したがって有効化すると良いでしょう:
# tune2fs -O dir_index /dev/hdXY
ディレクトリインデックスは tune2fs を実行した後に、ファイルシステムに作成されたディレクトリにだけ影響を与えます。既存のディレクトリに適用したいときは、e2fsck ユーティリティを使ってファイルシステム上のディレクトリを最適化して再インデックスする必要があります:
# e2fsck -D -f /dev/hdXY
フルジャーナリングの有効化
デフォルトでは、ext3 パーティションは 'ordered' データモードでマウントされます。このモードでは、全てのデータはメインのファイルシステムに書き込まれ、メタデータがジャーナルに送られます。ジャーナルのブロックは論理的にトランザクションにグループ化されディスク I/O を削減します。大抵の場合、これで問題は発生しませんが、(特定の状況下で) 信頼性とパフォーマンスの両方を向上させる方法があります: ファイルデータそのものを含む、全てのデータをジャーナリングさせるのです (別名 'journal' データモード)。通常、全てのデータをジャーナリングするのはパフォーマンスが落ちるように思われます。データがディスクに二回書き込まれることになるからです: 一度はジャーナルに、そしてメインのファイルシステムに。しかしながら、そうではない場合があります。読み書きを同時にたくさん行うようなファイルシステムではパフォーマンスが改善された例があります。詳しくは Daniel Robbins によって IBM のウェブサイトに書かれた この記事 を読んで下さい。
journal データモードを有効化する方法は2つあります。1つは /etc/fstab
でマウントオプションとして data=journal
を追加する方法です。この方法を使う場合、root ファイルシステムで journal データモードを使うときはブートローダーの設定で rootflags=data=journal
をカーネルパラメータとして設定する必要があります。二番目の方法は、tune2fs を使ってファイルシステムのスーパーブロックのデフォルトマウントオプションを変更します:
# tune2fs -O has_journal -o journal_data /dev/hdXY
古いカーネルでは二番目の方法は使えないことがあるので注意してください。特に Linux 2.4.20 以下ではスーパーブロックのデフォルトマウントオプションが無視されます。さらに大胆に、ジャーナルのサイズを変更することもできます。ジャーナルを大きくすればパフォーマンスが良くなる可能性があります (そのかわりディスクの消費量は増えてリカバリにかかる時間は長くなります)。以下を実行する前に tune2fs マニュアルをよく読むようにしてください:
# tune2fs -J size=$SIZE /dev/hdXY
長ったらしいブート時のチェックを無効化
ext3 ファイルシステムは30回マウントされるたびにチェックが走ります。IDE/SATA/SCSI の配線に問題が生じたときや電源の供給が止まったときなどハードウェアに問題が発生した場合に、ファイルシステムが破損することを防げるため基本的には良いことです。ジャーナリングファイルシステムはトランザクションを再生して簡単にファイルシステムを元の状態に復帰できるようにするために作られました。したがって、必要なときにジャーナルを復元してファイルシステムを元に戻してデータを失わないようにすることができるのであれば、一定のマウント回数で行うチェックは無効にしても安全です。無効化する前に /etc/fstab
のファイルシステムエントリの6番目のフィールド (pass) が正数 (起動時に自動的にチェック) になっていることを確認してください。以下のコマンドで無効化できます:
# tune2fs -c 0 -i 0 /dev/hdXY
完全に無効化するのではなく (安全のために) 発生回数を減らしたい場合、カウントチェックからタイムフレームチェックに変更すると良いでしょう。1ヶ月毎にチェックするように変更するには:
# tune2fs -c 0 -i 1m /dev/hdXY
予約済みのファイルシステム領域を回収する
Ext3 パーティションはデフォルトで使用領域の 5% を特殊な目的のために使います。主な目的はファイルシステムの断片化を抑えるためです。ファイルシステムの使用量が 100% に達しても root がログインできるように領域を残しているという理由もあります。領域が全く残っていないとログを書き出すことすらできず、システムが不安定になって root ユーザーがログインできなくなる可能性があります。
ハードディスクの容量が大きくなると、たとえ 5% でもかなり無駄な領域を消費することになります (例えば 100 GB のハードディスクなら 5 GB が予約されます)。/home
などのファイルシステムを分割している場合はオプションを調整して浪費されている領域を回収すると良いでしょう (詳しくは こちらのメール を参照)。ルートファイルシステムなどは 5% の予約領域をそのままにしておくほうが安全です。/var
や /tmp
ファイルシステムが含まれているファイルシステムの予約領域をなくしてしまうと問題になるでしょう。
ルートファイルシステム以外のファイルシステムで予約領域をドライブの 1% に変更するには:
# tune2fs -m 1 /dev/sdXY
ラベルを割り当てる
パーティションを作成・フォーマットしたら、e2label
コマンドを使ってラベルを割り当てることができます。ラベルを割り当てることでデバイスパスの代わりにラベルを使って /etc/fstab
にパーティションを追加できるようになります (USB ドライブなどで有用です)。パーティションにラベルを追加するには、root で以下のコマンドを実行:
# e2label /dev/sdXY new-label
任意の引数 new-label を指定しなかった場合、e2label は現在のファイルシステムのラベルを表示します。任意の引数 new-label を指定した場合、e2label はファイルシステムのラベルを new-label に設定します。Ext2 と ext3 ファイルシステムのラベルは最大で16文字まで設定できます。new-label が16文字よりも長い場合、e2label は末端を切り取り警告メッセージを出力します。