バックアップに一番いいファイルシステムを頼む
DESCRIPTION
comicmarket80 で頒布されたLinuxSearchers の LinuxManiacs に寄稿した原稿です.TRANSCRIPT
バックアップに一番いいファイルシステムを頼む
KenichiroMATOHARA(matoken)
http://hpv.cc/~maty/
現在バックアップに rsync で--link-dest オプションを利用して世代バックアップをしています.
これはファイルシステムのハードリンクを利用してファイル単位で毎回差分バックアップをするので
すが,バックアップされたファイルを見ると毎回フルバックアップを取得しているように見えます.
Mac OS X の TimeMachine にイメージは近いです. 削除も古いものをディレクトリごと削除す
るだけなので運用も楽です.編集ファイルが少なかったり,差分が少ない時には向いています.仮想
マシンイメージなどがあると仮想マシン実行毎に差分が発生するのであまり向かないでしょう. 以
下はバックアップの例です.crontab で毎日深夜に実行するようにしています.
# 日時バックアップ3 25 * * * /usr/bin/rsync -avv --delete --link-dest=/backup/`/bin/date -d '1 day ago' +%Y%m%d`/ /home/mk/ /backup/`date +%Y%m%d`/ > /dev/null 2>&1 # 14 日前のバックアップを削除3 15 * * * /bin/rm -rf /backup/`/bin/date -d '14 day ago' +%Y%m%d` > /dev/null 2>&1
これで,/home/mk を毎日/backup/yyyymmdd 以下に 2 週間分バックアップします.差分
バックアップですが,見た目は毎日フルバックアップのように見えます. rsync の他のオプションも
勿論利用できるので,リモートバックアップや,特定のファイル・ディレクトリを除外といったことも可
能です.
これはこれで便利だしそこそこ満足しているんですが,欲を言えば圧縮が効けばいいなというこ
とで,幾つかファイルシステムを試してみました.
NILFS2
国産の Linux 用ファイルシステムで,オンラインでスナップショットをどんどん取っていけるログ
構造化ファイルシステムです.間違って削除してしまったり,上書き保存してしまっても過去のデー
タを参照して復旧できます.
ということで前から興味はあったけど実際運用したことのない nilfs2 ですが,東京 Debian 勉
強会で取り上げられたのをきっかけに試してみました.
※以下の NILFS2 の設定は DebianSqueeze と UbuntuNatty の環境で確認しました.環境が
違う場合は適時読み替えてください.
導入
パッケージがあるので導入は簡単です.
$ sudo apt-get install nilfs2-tools
これだけです.
ディスクの初期化
以下の例では/dev/vdb1 というディスクを nilfs で初期化しています.
$ sudo mkfs.nilfs2 /dev/vdb1
mkfs.nilfs2 ver 2.0
Start writing file system initial data to the device
Blocksize:4096 Device:/dev/vdb1 Device Size:10736328704
File system initialization succeeded !!
マウント
早速マウントします.
$ sudo mount -t nilfs2 /dev/vdb1 /export/
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.
怖いメッセージが出ますがうまくマウントできたようです.
恒久的なマウントの設定
このままでは再起動を行うとアンマウントされるので,/etc/fstab に設定します.まずはそのために
UUID を調べようとしましたが,UUID が見当たりませんでした.
$ sudo blkid /dev/vdb
$ ls -l /dev/disk/by-uuid/
合計 0
lrwxrwxrwx 1 root root 10 2011-06-16 03:26 a4ad2750-5207-4d1a-abdd-9680b5469780 -> ../../vda1
以下のスレッドを見ると,nilfs には実装されているけど周りの実装が追いついていないんでしょう
か.
"Nilfs users (Log-Structured Snapshotting Filesystem)" http://comments.gmane.org/gmane.comp.file-systems.nilfs.user/1400
仕方がないのでデバイス名で設定します./etc/fstab に以下を追記して念の為再起動して動作確
認を行います.
/dev/vdb1 /export nilfs2 noauto 0 0
再起動.
$ mount|grep /dev/vdb1
/dev/vdb1 on /export type nilfs2 (rw,gcpid=654)
チェックポイントの確認
lscp コマンドで,チェックポイント(cp)の確認が出来ます.
$ lscp
CNO DATE TIME MODE FLG NBLKINC ICNT
1 2011-06-10 01:52:47 cp - 11 3
2 2011-06-10 01:54:41 cp - 11 4
3 2011-06-10 02:00:11 cp - 1324 143
4 2011-06-10 02:00:17 cp - 4674 184
自動的に cp が作られているのが解ります.
スナップショットの作成
mkcp -s でコマンド実行時のスナップショット(ss)が取得できます.
$ sudo mkcp -s
$ lscp|grep ss
42 2011-06-10 02:02:59 ss - 2878 816
cp の場合は自動的に生成されますが,ガベージコレクションが自動的に削除します.削除タイミン
グは/etc/nilfs_cleanerd.conf の protection_period の秒数の間は保護されるのでそれ以降
になります. それに対して ss はGC では削除されません.
スナップショットからの復元
さて,スナップショットからの復元も試してみます. まずはテストファイルを作成してスナップショット
の作成を行います.
$ mkdir test
$ echo test > test/testdata
$ cat test/testdata
test
$ sudo mkcp -s
$ lscp | tail -2
9519 2011-06-17 00:59:57 ss - 25 585668
9520 2011-06-17 01:00:23 cp i 20 585668
今作ったファイルを削除してスナップショットをマウントして復元してみます. スナップショットのマウ
ントはマウントオプションに -o ro,cp=9519 の様にリードオンリーと,対象のスナップショットを指
定してマウントします.
$ rm test/testdata
$ sudo mkdir /media/nilfs-ss
$ sudo mount -t nilfs2 -o ro,cp=9519 /dev/sdc1 /media/nilfs-ss
$ ls -l /media/nilfs-ss/test/testdata
-rw-r--r-- 1 mk mk 5 2011-06-17 00:59 /media/nilfs-ss/test/testdata
$ cat /media/nilfs-ss/test/testdata
test
$ cp -p /media/nilfs-ss/test/testdata test/
$ cat test/testdata
test
$ sudo umount /media/nilfs-ss
うまく行きました!
スナップショットの削除
スナップショットは自動的に消えないのですが,ある程度のところで削除しないとディスクがいっぱ
いになってしまいます.スナップショットの削除を試してみます.
スナップショットを確認して rmcp コマンドで削除してみます.
$ lscp|grep ss
42 2011-06-10 02:02:59 ss - 2878 816
9519 2011-06-17 00:59:57 ss - 25 585668
$ sudo rmcp 42
rmcp: 42: cannot remove snapshot
To delete snapshot(s), change them into checkpoints with
chcp command before removal.
失敗しました.スナップショットのままでは削除できないようです.一旦 cp に変更して削除してみま
す.
$ sudo chcp cp 42
$ lscp |grep ss
9519 2011-06-17 00:59:57 ss - 25 585668
$ lscp |grep '42 2011-06-10 02:02:59'
42 2011-06-10 02:02:59 cp - 2878 816
cp になりました.放おっておいてもGC されると思いますが明示的に削除してみます.
$ sudo rmcp 42
$ lscp |grep '42 2011-06-10 02:02:59'
消えたようです.
最古の ss を cp にするのは以下のような感じで行けそうです.
# lscp | grep ss | head -1 | awk '{print $1}' | xargs chcp cp
先ずは,1 日一回 crontab で mkcp -s してみようと思います. 消すのは容量と相談しながらです
が 1月後くらいでいいかな…
Lessfs
このファイルシステムを知ったのは,2ch の Linux板「ファイルシステム総合スレ その 12」の 990
でした.
990 名前:login:Penguin [sage]: 2011/07/27(水) 20:31:12.69 ID:8rO7Z0JW
>>987
うちはこんなの使ってる。
ttp://www.lessfs.com/wordpress/
重複排除、圧縮、暗号化と一通り対応してる。
恐くてバックアップ用途だけだけど、7世代バックアップ取っても、オリジナルよりサイズが
小さくすんでるよ。
これは良さそうだ.ということで試してみました.
※以下の Lessfs の設定は UbuntuNatty の環境で確認しました.環境が違う場合は適時読み替
えてください.Lucid については ppa のパッケージが一緒に用意されていたので恐らく同じ手順で
動くでしょう.“lessfs | Open source data de-duplication ”http://www.lessfs.com/wordpress/
Lessfs は重複排除,圧縮と暗号化(lzo or QuickLZ)を行う fuse を利用したファイルシステムの
ようです.重複排除はブロックデバイス単位で行うようです.
パッケージはないようですが,PPA があったのでこれを利用させてもらうことにします.
“Lessfs : Brandon Snider ”https://launchpad.net/~brandonsnider/+archive/lessfs
lessfs の原稿執筆時点での最新版のソースは 1.5.0,ppa は 1.4.8 ですが,1.4.9 ではログ書き
出し機能の追加,1.5.0 では db のパフォーマンス改善などが盛り込まれているようです.とりあえ
ず試すのには問題なさそうなので ppa の 1.4.8 で試します.
導入
ppa を登録して導入します. $ sudo add-apt-repository ppa:brandonsnider/lessfs $ sudo apt-get update $ sudo apt-get install lessfs
これで lessfs が導入されたはずです.
起動スクリプトも設定されました.
ファイルシステムの作成
今回は試しに 4GB の USB メモリ上で試してみました. テスト用の領域は前もって初期化し
て/media/lessfs にマウントしておきます.
$ sudo mkfs.ext3 /dev/sdc1 $ sudo mount /dev/sdc1 /media/lessfs $ sudo chown mk:mk /media/lessfs
設定ファイルを用意します.パッケージで用意された設定ファイルをベースに編集します.
$ cp /usr/share/doc/lessfs/examples/lessfs.cfg /media/lessfs
このベースファイルの/data/{dta,mta} にメタデータが作成されるようです.環境に合わせて/data
部分を書き換えます. 今回は/media/lessfs にしました. ほかの部分は既定値のままです.
メタデータのディレクトリを作成しておきます.
$ mkdir /media/lessfs/{dta,mta}
そしていよいよマウントです.マウントポイントは/media/lessfs/mnt にしました.
初回マウント時はメタデータを作ららしく 20秒ほど時間がかかりました.
$ mkdir /media/lessfs/mnt $ lessfs /media/lessfs/lessfs.cfg /media/lessfs/mnt $ mount |grep lessfs lessfs on /media/lessfs/lessfs type fuse.lessfs (rw,nosuid,nodev,max_read=131072,default_permissions,allow_other)
無事マウントされたようです.
利用前の容量を確認しておきます.
$ df -k|grep lessfs lessfs 3850292 137952 3516752 4% /media/lessfs/lessfs
重複排除の確認をしてみます.
先ずは適当なファイルを lessfs 以下に cp します.
$ ls -l ~/Downloads/squeeze-custom-amd64-0710.iso-rw-r--r-- 1 mk mk 196120576 2011-07-10 21:35 /home/mk/Downloads/squeeze-custom-amd64-0710.iso$ cp /home/mk/Downloads/squeeze-custom-amd64-0710.iso /media/lessfs/lessfs/$ df -k|grep lessfslessfs 3850292 517508 3137196 15% /media/lessfs/lessfs$ cp /media/lessfs/lessfs/squeeze-custom-amd64-0710.iso /media/lessfs/lessfs/squeeze-custom-amd64-0710.iso-2$ df -k|grep lessfslessfs 3850292 517628 3137076 15% /media/lessfs/lessfs$ cp /media/lessfs/lessfs/squeeze-custom-amd64-0710.iso /media/lessfs/lessfs/squeeze-custom-amd64-0710.iso-3$ cp /media/lessfs/lessfs/squeeze-custom-amd64-0710.iso
/media/lessfs/lessfs/squeeze-custom-amd64-0710.iso-4$ cp /media/lessfs/lessfs/squeeze-custom-amd64-0710.iso /media/lessfs/lessfs/squeeze-custom-amd64-0710.iso-5$ df -k|grep lessfslessfs 3850292 517904 3136800 15% /media/lessfs/lessfs$ ls -l /media/lessfs/lessfs/
合計 957620-rw-r--r-- 1 mk mk 196120576 2011-08-10 02:42 squeeze-custom-amd64-0710.iso-rw-r--r-- 1 mk mk 196120576 2011-08-10 02:46 squeeze-custom-amd64-0710.iso-2-rw-r--r-- 1 mk mk 196120576 2011-08-10 02:47 squeeze-custom-amd64-0710.iso-3-rw-r--r-- 1 mk mk 196120576 2011-08-10 02:47 squeeze-custom-amd64-0710.iso-4-rw-r--r-- 1 mk mk 196120576 2011-08-10 02:47 squeeze-custom-amd64-0710.iso-5
中身な同じファイルが増えても利用量は殆ど増えません.次は圧縮の確認をしてみます.圧縮効率
が良くなるように中身が 0だけの大きなファイルを作ります.
$ dd if=/dev/zero of=/media/lessfs/lessfs/zero bs=1M count=10001000+0 記録始め1000+0 記録終わり1048576000 バイト (1.0 GB) コピー終了, 4.35437 s, 241 MB/s$ ls -l /media/lessfs/lessfs/zero -rw-r--r-- 1 mk mk 1048576000 2011-08-10 02:50 /media/lessfs/lessfs/zero$ df -k|grep lessfslessfs 3850292 518360 3136344 15% /media/lessfs/lessfs
1GB のファイルを追加しましたが容量は殆ど増えていません.素晴らしいですね.
終わりに
NILFS2 はスナップショットからの復元が簡単なので,バックアップだけでなくホームディレクトリな
どの通常作業時のディレクトリとして利用するのも便利そうです.Lessfs は fuse 経由ですし書き
込みも遅いようですが重複排除や圧縮などが便利なので頭で紹介した rsync バックアップなどと
組み合わせて使うと便利そうです.ブロックデバイス単位で重複排除も効きそうなので仮想マシン
イメージなどのバックアップにも良さそうです.問題はどちらも利用実績が少ないので不安が残る
ところでしょうか.私の環境では現在 NILFS2 はバックアップ領域から更に差分バックアップ取得
のために利用しています.Lessfs は未だ検証中といったところです.
後は,期待のBtrfs やライセンスの関係で Linux で利用するのは面倒ですが ppa への登録もあ
る ZFS なども近いうちに試してみようと思っています.
参考 URL
NILFS |技http://www.waza.jp/nilfs/ NILFS - Continuous Snapshotting Filesystem for Linux
http://www.nilfs.org/ja/index.html [NILFS] What is NILFS? http://www.nilfs.org/ja/about_nilfs.html
第 70 回 東京エリア Debian 勉強会 2010 年 11 月 - 特集 : 俺のファイルシステムは熱いぜ!- http://tokyodebian.alioth.debian.org/pdf/debianmeetingresume201011.pdf lessfs | Open source data de-duplicationhttp://www.lessfs.com/wordpress/ “Lessfs : Brandon Snider ”https://launchpad.net/~brandonsnider/+archive/lessfs