ext3では、トランザクションのコミット操作はカーネルスレッドである「kjournald」によって定期的に行われる。kjournaldは、Linuxに実装されているダイナミックタイマと呼ばれる時間管理のためのタイマ機構を利用し、これらのコミット操作が時系列に沿って実行されるようにする。
kjournaldは、カーネルから起動されるとインターバルが5秒ごとに実行されるタイマリストを作成する。個々のトランザクションは、このタイマリストに現在の時刻+5秒後にコミットが実行されるようにタイマをセットする。kjournaldは5秒置きに起動し、コミットが予定されているトランザクションを登録していた場合は、そのトランザクションをコミットする。ext3では、コミットとチェックポイントはkjournaldの中に一緒に実装されており、コミットが完了するとチェックポイントが行われる。
トランザクションがコミットされると、完了した処理がチェックポイントリストに追加される。
コミットまでの処理が完了しているトランザクションは、ディスクに書き込まれていることが保証されるため、記録を維持する必要はない。そのため、チェックポイントのリストに入っているトランザクションの記録は破棄され、ログのスペースが解放される。これにより、新たにトランザクションが書き込みをするスペースとして利用できる。クラッシュ後の起動時には、トランザクションIDに沿って前後関係が正しく回復される。
クラッシュ時は、トランザクションを基に復旧または破棄の操作が行われる。クラッシュの発生をカーネルが捕捉できた場合は、何らかのシグナルが発生する。それを受け取ることができた場合、直ちにジャーナルをディスクにフラッシュし、ファイルシステムをアンマウントする。ファイルシステムが安全にアンマウントできた場合、再起動時には何も行わない。しかし、アンマウントが不完全であった場合は、ジャーナルはできるだけ情報を回復するように試みる(注)。
注:ただし、ext3のデフォルトのジャーナリングモード(後述)であるorderdでは、ファイルシステムの更新情報が完全にディスクに書き込まれているとは限らない。また、ジャーナリングも「メタ・データ」(管理情報)が対象なので、回復はメタ・データ情報レベル(ディスクブロックの回復)である。
回復は次のように行われる。ext3は、ジャーナルログに記録されていたトランザクションがコミットを取得しているか否かを確認し、取得していない場合はそのトランザクションに含まれているブロックのrevoke(廃棄)リストを作成する。次に廃棄リストに記録されているブロックを確認し、予定のトランザクションが完了していないブロックについては、トランザクション時に行われた操作(関数)の記録を基に、同じ手順を再開する。しかし、メタ・データの記録に存在しない内容については、ジャーナリングは何も行わない(行えない)。
第1回のバッファの書き込みの部分で解説したように、通常のディスクI/Oはkupdateやbdflushによってなされる。つまり、書き込み情報などの実際のデータは、これらのディスクI/Oで行われる。
ext3のジャーナリング機能では、現在3つのモードが指定可能である。それぞれのモードによって、このI/Oとの関連が異なる。
■journalモード
このモードでは、メタ・データと実際のデータの両方をジャーナリングの対象とする(注)。これは、ディスクへの書き込みが完了してからメタ・データのジャーナリングを行うもので、クラッシュ後のデータとジャーナリングのデータの整合性が取れた最も信頼性の高いモードである。しかし、ディスクI/Oを待ってからジャーナリングを行うため、速度は犠牲になる。
注:「データをジャーナリングの対象とする」とは、「データそのもの」をジャーナリングに記録することではない。「データそのもの」をディスクに書き込むのは、ディスクI/Oの処理である。通常は、ある程度の速度性を重視するために、I/Oのバッファに更新記録が書き込まれた時点でジャーナリングの記録を行う。しかし、journalモードではディスクへの書き込みが完了したことを確認してからジャーナリングの記録を行う。つまり、ジャーナリングの記録にあるものは、完全にディスクへの書き込みと同期が取れていることを保証するという意味である。
■orderdモード(デフォルト)
orderdモードは、メタ・データのジャーナリングのみを対象とし、データはジャーナリングの対象としない。ただし、書き込むためのバッファにデータがあることを確認してからジャーナリングを行う。また、トランザクションのコミットも、データの書き込みおよびトランザクションのコミットとシーケンシャルに行われる。このように、順序は保証されるため、メタ・データが不正なデータを指し示すことはない。
メタ・データはジャーナリングされるので、クラッシュ後もメタ・データは正しく修正され、ディスクブロックは整合性を保つことができる。ただし、クラッシュ時点でディスクI/Oが実際に同期していない場合は、データ自体は復旧されない。
■writebackモード
orderdと同様、メタ・データのジャーナリングのみを対象とする。しかしorderdと異なり、トランザクションのコミットが行われる前に次のデータがディスクに書き込まれるなど、トランザクションの順序よりも効率を重視した方法である。そのため、データとメタ・データの整合性は必ずしも保証されない。
最後に、ext3関連のコマンドを紹介する。
■ファイルシステムの作成
# mke2fs -j /dev/hdXX |
「man mke2fs」には、「-Jオプションで内部ジャーナルのサイズを指定できる」とあるが、デフォルトでこの内部ジャーナルの値はプログラム内で自動的に調整されるので、あえて設定する必要はないだろう。また、e2fsprogsパッケージがインストールされている場合は、mkfs.ext3で簡単にファイルシステムを作成できる(mkfs.ext3はmke2fsプログラムのハードリンク)。
# mke2fs -j /dev/hdXX |
■外部ジャーナルファイルの指定
別のデバイスのジャーナルファイルを利用する場合は、初めに外部デバイス側のジャーナルファイルを作成し、それを利用するデバイスを指定する。
# mke2fs -O journal_dev /dev/hda5 |
外部デバイス側(/dev/hda5)のジャーナルファイルの作成 |
# mke2fs -J device=/dev/hda5 /dev/hda4 |
外部デバイスのジャーナルファイルに/dev/hda4をアタッチ |
■ジャーナリングモードの変更
ジャーナリングモードはmountオプションのdata=で指定できる。また、現在のジャーナリングモードはdmesgで確認できる。例は、journalモードに変更する場合とその確認方法である。
# mount -t ext3 -o data=journal /dev/hdXX |
■fstabの変更
ファイルシステムを常にext3でオートマウントする場合は、/etc/fstabを次のように記述する。
/dev/hdXX /opt defaults, data=journal 0 0 |
ファイルシステムのラベルの設定は、e2labelで指定する。この場合、fstabにはラベルで指定できる。
# e2label /dev/hdXX data |
■ファイルシステムのチェックのインターバル変更
デフォルトでは、ファイルシステムは27回目の起動または前回のfsck以来180日経過すると、自動的にfsckを行うようになっている。このチェックには時間がかかるので、外したい場合は次のコマンドを実行する。
# tune2fs -i 0 -c 0 /dev/hdXX |
■ext2とext3の変換
現在ext2で使用しているファイルシステムをext3にする場合は、tune2fsコマンドを利用する。tune2fsの-jオプションは、ext3のジャーナルをファイルシステムに追加する。
# tune2fs -j /dev/hdXX |
また、ext3をext2にするのは、マウントオプションを変更するだけで可能だ。
# umount /dev/hdXX |
次回は、ReiserFSについて解説する。
Copyright © ITmedia, Inc. All Rights Reserved.