nkjmkzk.net

powered by Kazuki Nakajima

NILFS2を使ってみた

NILFSはLinux Kernelにマージされているログ構造化データベースで、連続的で自動的なチェックポイント作成によって実質的に常にSnapshotが取得され続けるというユニークなFilesystemです。Kernel2.6.30より利用できます。

ということで使ってみました。OSはOracle Linux 5.5をベースとしてKernelは2.6.36をCONFIG_NILFS2_FS=mとしてビルドしたものを使いました。恐らくわざわざビルドしなくてもFedoraとかを使う方が楽でしょう。多分カーネルモジュールとしてビルドはされていると思います。(憶測だけど)

NILFSを利用するにはカーネルモジュールがビルドされていることと、mkfs.nilfs2等のユーティリティツール(ユーザーランドツール)が必要です。このツールはこちらからダウンロード可能です。

http://www.nilfs.org/ja/download.html

まずユーティリティツールをビルドします。

[root@~]# tar xvfj nilfs-utils-2.0.20.tar.bz2
[root@~]# cd nilfs-utils-2.0.20/
[root@~]# ./configure
[root@~]# make && make install

ちなみに手元の環境ではuuid libraryがないと怒られました。そんなことがあればe2fsprogs-develをインストールすればことなきを得ます。

ツールがインストールされればNILFSを使う準備は完了です。任意のブロックデバイスまたはパーティションまたはLogical Volumeをフォーマットしましょう。

[root@~]# mkfs.nilfs2 /dev/xvdb
mkfs.nilfs2 (nilfs-utils 2.0.20)
Start writing file system initial data to the device
       Blocksize:4096  Device:/dev/xvdb  Device Size:1073741824
File system initialization succeeded !!

マウントします。

[root@~]# mkdir /nilfs1
[root@~]# mount -t nilfs2 /dev/xvdb /nilfs1
mount.nilfs2: WARNING! - The NILFS on-disk format may change at any time.
mount.nilfs2: WARNING! - Do not place critical data on a NILFS filesystem.
/sbin/nilfs_cleanerd: error while loading shared libraries: libnilfs.so.0: cannot open shared object file: No such file or directory
[root@~]#

ということでマウントは成功するのですが、マウントと同時に起動するように仕組まれているnilfs_cleanerdがlibrary pathエラーで起動しません。ちゃんと調べていないですがとりあえず下記のように手動で起動しておきます(それでいいのか)。

[root@~]# LD_LIBRARY_PATH=/usr/lib /sbin/nilfs_cleanerd
[root@~]# export LD_LIBRARY_PATH=/usr/lib (これをやっておかないと後のlscpでも同様のエラーが出る)

そしてlscpコマンドで現在のチェックポイントをいきなり確認してみたりします。

[root@~]# lscp
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   1  2010-11-10 17:36:16   cp    -         11          3

すでに作成されてますね。
NILFSは一定間隔毎、または同期書き込み毎にチェックポイントをどんどん作成していきます。
いくつかファイルを作ってみて確認してみましょう。

[root@~]# dd if=/dev/zero of=/nilfs1/1.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 1.44347 seconds, 72.6 MB/s

[root@~]# lscp
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   1  2010-11-10 17:36:16   cp    -         11          3
                   2  2010-11-10 17:46:22   cp    -       8295          4

[root@~]# dd if=/dev/zero of=/nilfs1/2.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 1.37617 seconds, 76.2 MB/s

[root@~]# lscp
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   1  2010-11-10 17:36:16   cp    -         11          3
                   2  2010-11-10 17:46:22   cp    -       8295          4
                   3  2010-11-10 17:47:43   cp    -       1060          5
                   4  2010-11-10 17:47:48   cp    -       5477          5

どんどん作成されてますね。
今、MODEのカラムが「cp」となっています。これはチェックポイントであることを意味しており、このままだとしばらくすると破棄されます。これを保護しておくには任意のチェックポイントをSnapshotとして指定しておきます。

[root@~]# chcp ss 2
[root@~]# lscp
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   1  2010-11-10 17:36:16   cp    -         11          3
                   2  2010-11-10 17:46:22   ss    -       8295          4
                   3  2010-11-10 17:47:43   cp    -       1060          5
                   4  2010-11-10 17:47:48   cp    -       5477          5

「2」のところでどのチェックポイントをSnapshotにするか指定します。chcpを実行したらその後のlscpの出力から「2」のMODEのカラムが「ss」になっていることがわかります。これはSnapshotとして保護されていることを意味しています。
SnapshotはRead-onlyでマウント可能です。

[root@~]# mount -t nilfs2 -r -o cp=2 /dev/xvdb /nilfs2
[root@~]# ls /nilfs2
1.img
[root@~]# ls /nilfs1
1.img 2.img

-o cp=2のところでマウントするSnapshotを指定しています。
過去の時点がちゃんと保存されていますね。
通常Linuxで間違ってrmしたら相当頑張らないと消したデータを取り戻せませんが、NILFSの場合は直近のチェックポイントからすぐに復旧させることができます。他にもいろいろ応用は考えられそうです。

without comments

Written by 中嶋 一樹

11月 10th, 2010 at 5:48 pm

Posted in Uncategorized

Tagged with

Leave a Reply