FreeBSD - The Power To Serve

24日(協定世界時)、FreeBSD開発者であるJeff Roberson氏によって開発ブランチへある機能がマージされた。UFS2にジャーナリング機能を追加するコードだ。開発者の間ではSoft-Updates Journaling、またはSUJと呼ばれている。FreeBSD UFSでもっとも改善が望まれていた機能であり、FreeBSD 9の目玉機能になるとみられている。以降でその概要と実際の利用方法を紹介する。

UFSの課題と発展

これまでUNIX系のOSではUFS(UNIX File System)と呼ばれるファイルシステムがデフォルトで採用されてきた。ZFSなどの次世代ファイルシステムが普及しつつあるが、長い実績があるUFSを使いつづけるシステムも多い。BSD系OSでは今でもUFSがデフォルトのファイルシステムとして採用されている。

最初のUFSはシンプルな構造になっている。ディスクの情報を保持するスーパーブロック、ディレクトリやファイルの情報を保持するinodeブロック、実際のデータを保持するデータブロックに分かれている。これに対してその時々に応じた改善と拡張が実施されてきた。主な取り組みは次のとおり。こうした改善に、さらに独自機能を追加するためのフィールドの追加などが実施されている。

課題 BSD UFSでの取り組み
スラッシングの発生 ディスクサイズが増えるとinodeブロックとデータブロックの間をヘッダがいったりきたりするスラッシングがボトルネックになってきた。これに対して4.2BSDでシリンダグループを導入。シリンダグループはinodeブロックとデータをある程度のサイズでグループ化したもので、処理を局所化してスラッシングを軽減する効果を持たせている。またシリンダグループにスーパーブロックのコピーを配置することで故障時の復旧にも役立たせている。
データの断片化 ディスクサイズの増加にともなってデータが断片化するようになった。これに対してはブロックサイズを引き上げることで対応。ブロックサイズを引き上げると利用できないディスク領域が発生してスペースの無駄になるため、ブロックをフラグメントに分割して利用することでこれに対処。性能とスペースの両方の課題に対応。
課題 FreeBSD UFSでの対応
大容量ディスクの登場 ブロックポインタを64ビットに拡張して対応。64ビット化したあとのFreeBSD UFSはUFS2と呼ばれることが多い。
ビルドやPorts Collectionなど大量にある小さいファイルの扱い Soft Updatesと呼ばれるメタデータ操作の順序を工夫した機能を追加。ビルドのように小さいファイルを生成しては直ぐに削除するようなケースや、大量のファイルの削除などで大幅な高速化を実現。
スナップショットの必要性 Soft Updatesの導入と同時にスナップショット機能も実現。
fsck(8)のボトルネック スナップショットをとっておき、背後でfsck(8)を実行するという方法で回避。

UFSの最大の問題点として指摘されるものが、fsck(8)にかかる時間の長さだ。ソフトウェアの不具合やハードウェアの不具合でシステムが予期せぬシャットダウンやフリーズに見舞われた場合、UFSはマウントする前にファイルシステムの整合性をチェックして修復する処理を実施する必要がある。このfsck(8)には長い時間がかかる。利用するディスクサイズが大容量になり、そこに保持されるファイル数が多くなると、fsck(8)に数時間という長い時間がかかるようになる。システムが起動するまでに何時間も待たなければならないというのは問題だし、ストレージのサイズによっては日という単位で時間がかかることもある。

fsck(8)への対処、ジャーナリングとSoft Updates

システムがクラッシュしたあとの起動に数時間もかかっては困る。こうした場合、ジャーナル機能を追加することで対処することが多い。UFSやUFSとよく似たファイルシステムではジャーナル機能を追加することでこれに対処している。ジャーナルを追加するとクラッシュが発生しても記録されているログにしたがって復旧すればよく、全体をチェックする必要がなくなる。復旧が高速になる。

FreeBSDのUFSはこれとは異なり、バックグラウンドfsck(8)を採用することでこの問題に対処した。クラッシュしたあとの起動時にファイルシステムのスナップショットを取り、背後でそのスナップショットに対してfsck(8)を実施するという方法だ。この方法でクラッシュ後にfsck(8)の完了を待たずにシステムが起動するようになった。しかし、バックグラウンドfsck(8)の実行中はシステムがきわめて重くなるという問題が残っていた。

なおSUJの登場以前であっても、FreeBSDのUFS2はGEOMのジャーナル機能と組み合わせることでジャーナリング機能を提供してはいる。しかしデフォルトで採用されるといった位置づけにはなく、SUJの導入後にはUFS2にとってはあまり重要な機能ではなくなる見通し。

Soft-Updates Journalingの特徴

SUJはUFSにジャーナル機能を提供するものだが、ほかのジャーナリングと違ってチェックに必要になるメタデータの操作のみを記録するという特徴がある。fsck(8)ではファイルシステムの整合性をチェックするが、このとき必要になるデータのみを記録する。このため、ほかのジャーナル機能と比べて消費するジャーナル領域が少ないという特徴がある。

また、今回追加されたSUJは従来のUFS2に対して最小限の変更のみを実施する内容になっている。UFS2の仕組みや動作そのものにはほぼ変更を加えていないため、今回追加されたSUJによってUFS2の信頼性が損なわれる可能性が低くなっているところもポイントになっている。