アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

以前のディスク状態に簡単に戻せるファイルシステム NILFS

こんにちは、牧野です。
最近は、システム開発のプロジェクトから離れ気味で、自社製品関係、社内サーバの整備に割く時間が多くなりました。
そんな中、ハードディスクのデータを誤って消してしまった場合でも簡単に元の状態に戻せるファイルシステムがあるという話を聞いたので、試してみました。
「NILFS」というファイルシステムで、無料で利用できます。
ディスクに変更がある度に自動的に記録されるようになっていて、記録が残っているポイントを指定することで、いつでもその状態に戻すことができます。
詳しくはこちらのページをご覧下さい。

テスト環境はvmwareのCentOS5.5、今回はrpmパッケージを使ってインストールしました。
uname -a でカーネルのバージョンを確認して、対応するパッケージをインストールします。


rpm -ivh kmod-nilfs-xen-2.0.20-4.2.6.18_194.el5.x86_64.rpm
rpm -ihv nilfs-utils-2.0.20-4.x86_64.rpm

カーネルのバージョンが2.6.30以上の場合は、nilfs-utilだけインストールすればOKです。

早速使ってみます。
今回、NILFS用にハードディスクを追加し、1つのパーティションを作りました。
これをNILFSでフォーマットします。


fdisk /dev/sdc




mkfs -t nilfs2 /dev/sdc1

これで、NILFSの/dev/sdc1が用意できました。

今回はテストも兼ねて、mysqlのデータディレクトリをNILFSにしました。


/etc/init.d/mysqld stop
cp -rp /var/lib/mysql /var/lib/mysql_bak
rm -rf /var/lib/mysql/*
mount -t nilfs2 /dev/sdc1 /var/lib/mysql

NILFSでは個々の変更の記録をチェックポイントといい、lscpコマンドで、チェックポイントの一覧を確認できます。

NILFSに変更を加えます。ディレクトリを丸ごとコピーして、所有者をmysqlにしました。
改めてlscpを実行すると、

チェックポイントが増えているのがわかります。
CNOは各チェックポイントの番号で、MODEがcpだとチェックポイント、ssだとスナップショットです。
チェックポイントをスナップショットに変更すると、その時のハードディスクの状態を読み取り専用でマウントすることができるようになります。

過去の状態を再現する前に、もう少し変更してみます。


/etc/init.d/mysql start
mysql -u root -p

mysql> delete from mysql.user;
mysql> flush privileges;
mysql> \q

これで、mysqlにログインできなくなりました。。
過去のハードディスクの状態を再現したい場合は、chcpコマンドで、再現したいチェックポイントをスナップショットに変えます。
lscpを実行すると、

チェックポイントがたくさん作られていることがわかります。
チェックポイントをスナップショットにするために、


chcp ss 3

を実行します。
3は再現したいチェックポイントの番号です。

スナップショットのマウント用ディレクトリを作成して、マウントします。


mkdir /nilfstest-snapshot
mount -t nilfs2 -o 'ro,cp=3' /dev/sdc1 /nilfstest-snapshot

/dev/sdc1をマウントしたままでもスナップショットを同時にマウントすることができます。
これで、/nilfstest-snapshotから、欲しいデータを取り出せます。



rm -rf /var/lib/mysql/*
cp -rp /nilfstest-snapshot/mysql /var/lib/mysql
/etc/init.d/mysql start

mysqlのユーザが以前の状態に戻りました。(今回はテスト用DBで、mysqlデータベース以外のデータベースはありませんでした)
スナップショットからデータを取ったら、アンマウントしてチェックポイントに戻します。


umount /nilfstest-snapshot
chcp cp 3


このように、間違って消してしまった場合の復旧が非常に簡単です。
ただ、NILFSには欠点もあります。

1.使用できる領域が実際より小さくなる。
チェックポイントがたくさん作られるとデータ領域が圧迫されて、実際に使える領域が小さくなります。
チェックポイントはデーモンが定期的に削除するようになっていて、/etc/nilfs_cleanerd.confで設定を変更できます。
デフォルトでは各チェックポイントは1時間は保持、残り容量が10%以下になると削除を開始するようになっています。
詳しくは、man nilfs_cleanerd.conf で確認できます。

2.安定性
こちらが最大の問題で、mountする時には警告が出ます。。


mysqlのバックアップ用スレーブのデータ領域や、データバックアップのバックアップで使ってみるのはいいかもしれないと思いました。