wiki:NILFS

NILFS - 過去に遡れるファイルシステム

NTTさんが開発中の NILFSを試しに使っています。 これは、ログ構造ファイルシステム( Log-structured file system)の一種で、簡単に言えば過去の状態に簡単に遡れることを特徴とするファイルシステムです。 もちろん、物理的なディスクの容量に制限を受けるのはあたりまえですが、ディスクの容量が許す限り、過去の複数の時点のファイルシステム全体の状態を保存しておくことができます。 さらに、それら過去の時点のファイルシステムを、読み込み専用の形でマウントすることができます。 過去の複数の時点の状態を保存していたら、すぐにディスクがいっぱいになってしまうのではないかという心配はいりません。 ファイルシステム全体のコピーをいちいち保存しているわけではなく、変化があったファイルの、変化があった部分だけを保存しているそうです。

この分野で、(一部の人に)有名なのは、 Plan 9のdumpfsでしょう。 私自身は、Plan 9を初めて知った時、軽い衝撃を受けたことを覚えています。 これだけのために Plan 9を使ってみようと、当時オープンソースではなかったPlan 9を入手しました。 なかなかうまく行かずに放置しちゃったのですけどね。

さて、NILFSがすばらしいのは、 各種ディストリビューション用のバイナリパッケージが用意されていることです。 つい昨日、2008年3月31日から提供開始したばかりのようですが、Debian、Ubuntu、CentOS、Fedora、openSUSEといったディストリビューションですぐに使えるのはとても嬉しいです。 Debianが虐げられていないのも嬉しい!  これらディストリビューションにも、複数のバージョン、複数のカーネルバージョン、複数のカーネルビルド(たとえばXen用)が存在するというのに、今後継続的にバイナリパッケージをリリースしてくださる(らしい)のは、感謝すべきことでしょう。 先日、 NTT R&Dフォーラム 2008にお邪魔した際に、NILFSのブースで説明してくださった方(たぶん、実際に作っていらっしゃる方)に、NTTさん自身は何のために開発し、今後どうやってお金に換えていくのですかと尋ねたところ、「だって、便利じゃないですか」というようなお返事でした。 稼ぐ方法はまだわからないそうで。 いや、確かに便利で嬉しいのですが、なにやら申し訳ないような…。 とりあえず、NILFS、流行らせましょう!

インストール方法

 ダウンロードページからリンクされている、各ディストリビューション毎のページをごらんください。 DebianとUbuntuの場合は、aptで入るので楽ちんです。将来のアップデートも楽ちんでしょう。 それ以外のディストリビューションの場合は、パッケージをダウンロードしてrpmコマンドでインストールする形です。

使い方

「う!マニュアルが無い!」と焦りました。 manページも無いし、サイト上に「ドキュメント」みたいなセクションも見あたりません。 しばらく探して、発見しました。 ダウンロードページの後半からリンクされている、 このREADME(英語)が全てのようです。

# mkfs -t nilfs2 /dev/sdb1

フォーマットは一瞬で終わります。

# vi /etc/nilfs_cleanerd.conf

protection_period」に、「チェックポイント」を最低何秒間保持するかを指定します。 この間は、ディスクがいっぱいになろうが、チェックポイントを保持します(つまり、ディスクがいっぱいで書けない状態になる)。 この秒数を過ぎれば、ディスクがいっぱいになってくると、勝手に削除してくれるようです。

# mount -t nilfs2 /dev/sdb3 /backup
# ps -ef | grep [n]ilfs
# umount /backup
# ps -ef | grep [n]ilfs

マウントすると、「/sbin/nilfs_cleanerd」が勝手に起動されます。 アンマウントすると、nilfs_cleanerdはいなくなります。

/etc/fstab」を設定します。

/dev/sdb3 /backup        nilfs2  noauto          0       0

/etc/fstab」のファイルシステムタイプの部分に「nilfs2」を指定します。 さらに、起動時の「fsck」の対象にならないように指定しました。

あとは、ファイルを作ったり消したり、好きなことをします。

何かすると、数秒に一度、勝手にチェックポイントが作られます。 「mkcp」コマンドで、今すぐにチェックポイントを作ることもできます。

# mkcp

チェックポイントの代わりに「スナップショット」を作ることができます。 スナップショットは、上記のprotection_periodが過ぎても削除されません。

# mkcp -s

作られたチェックポイントやスナップショットの一覧は、「lscp」コマンドで表示することができます。

% lscp
                 CNO        DATE     TIME  MODE  SKT   NBLKINC       ICNT
                   1  2008-04-01 15:51:16  cp     -         11          3
                   2  2008-04-01 15:51:50  cp     -          8          3
                   3  2008-04-01 16:03:51  ss     -          8          3

MODE」の欄の「cp」はチェックポイント、「ss」はスナップショットを意味しています。 「CNO」はチェックポイントやスナップショットの番号、「DATE」と「TIME」は日付と時刻。 「NBLKINC」は、どうやら、そのチェックポイントやスナップショットだけに含まれるディスクブロックの数のようです。 「ICNT」は、どうやら、ファイルシステム全体で使用している「iノード」の個数のようです。 「どうやら」の部分は、おいおい調べます。

lscp -s」ってすると、スナップショットだけの一覧を表示します。 「lscp -r」または「lscp -rs」ってすると、新しい物から順に表示します。

チェックポイントをスナップショットに変換したり、スナップショットをチェックポイントに変換することができます。 引数には、上記の「CNO」の番号を指定します。

# chcp ss 1
# chcp cp 3

ss」はスナップショットに、「cp」はチェックポイントに変換する指示です。

チェックポイントやスナップショットを削除するには、「rmcp」コマンドを使います。

# rmcp 1

さて、特定のチェックポイントやスナップショットに遡るには、チェックポイントやスナップショットの番号を指定してマウントします。

# mount -t nilfs2 -r -o cp=300 /dev/sdb1 /mnt

もちろん、このドライブがすでにマウントされていても大丈夫です。 現状、mountコマンドはドライブがNILFSであることを自動認識できないので、「-t nilfs2」を指定する必要があります。 読み込み専用でなければマウントできないので、「-r」オプションをつけます。 チェックポイントやスナップショットの番号を「-o cp=300(300番の場合)」というように指定します。 スナップショットの場合も「cp=」なのでご注意を。

疑問点・問題点

  • fsckはどうするのだろう? いらない?? →現在は存在しない。無くても実用的に問題がない。将来、開発されるかもしれない。
  • ぶち壊れた時、既存の復旧ソフトが使えないのは辛いところ。

まとめ

ま、使ってみましょう!  だいぶ鍛えられているようなので、いきなりファイルが全部無くなっちゃうということは無いでしょうけれど、いちお、壊れてもいいデータでどうぞ。

(2008/4/1 - sgk)