btrfs は Linux 2.6.29 で メインラインに取り込まれ、汎用ファイルシステムとしては一番先進的なものになっている。 CopyOnWrite ベースで作られており、スナップショット、サブボリューム、透過圧縮、 ファイルシステム側での RAID サポート、オンラインデフラグなどなど、 他には無い機能が満載。
しかし、今すぐ手元の ext* を置き換えられるかというと、 japan.internet.com の記事でも触れられているように、まだ 壊れた時にちゃんと直す手段がない など、 いきなりメインのファイルシステムを置き換えるには結構不安な面もあったり。
でも、バックアップ目的なら、今すぐ試せてしかも非常に快適。 バックアップなら最悪ファイルシステムが壊れても、本体と同時でなければもう一度とり直せば良いだけだしね。 ただもちろん、ちゃんとバックアップされているよう見えて、 実は読もうとするとデータが壊れている……なんてのは困るわけだけど…… 今回はそれは考えない!
btrfs + rsync を使って今回やってみる file to file 形式のバックアップは、 faubackup, pdumpfs, rsync --link-dest といったような、 ハードリンクを使う増分バックアップツールに近い。 でも、比較するとかなりのメリットがある。
ただし、デメリットもある。
まあでも、比較すれば十分じゃないかな。
まず、必要なものリスト。
増分バックアップの為にこれを使うので、 とにかく簡単にサブボリューム機能について説明してみる。
btrfs は「サブボリューム」と呼ばれる、ファイルシステムの内部に 更にルートディレクトリと見なされるものを作成できる。 これは、(マスターボリュームをマウントしている場合)見かけ上は単に中にある ディレクトリに見えるが、ただのディレクトリとは大きな違いがある。
そして、スナップショットは内部的にはサブボリュームと同じです。 いったん作ってしまえば両者の区別はありません。マウントしたり書き込みも可能。
スナップショットとサブボリュームの違いは単に作成時だけで、以下のような感じ。
なので、「スナップショットのスナップショットのスナップショット」なども取れます。
まあ、サブボリューム/スナップショット機能を解説したら、 もう何をすればいいか分かってもらえてるでしょう! レシピはかんたん。
これだけ。
ちょっと注意しないといけないのは sync 。これをやらないと、2.6.34以前では フラッシュされていないデータを含まないスナップショットが出来てしまう。 2.6.34以前のカーネルを使っている場合は忘れずにやっておく必要がある。 それ以降のものなら省略できる。 btrfs には 1 ファイルシステムだけ sync する機能があるので、これを使ってsyncする。
別に詰まる事はないと思うのだけど、 一応コマンド書いてみよう。
まずファイルシステムを作る。
mkfs.btrfs /dev/sdi1
/etc/fstab に追記。compress,noatime はお好みで。
/dev/sdi1 /backup btrfs defaults,compress,noatime 0 0
おおっと待った! /dev/sd* ではなく、UUID で書く事をお勧めしときます。 調べるには btrfs filesystem show で。
UUID=7e727a57-cb18-4869-8b50-5127a9cfb8ac /backup btrfs defaults,compress,noatime 0 0
マウント。
mkdir -p /backup mount /backup
サブボリュームを作ろう。
mkdir -p /backup/myhost/etc btrfs subvolume create /backup/myhost/etc/cur
Do rsync! (必要なら ionice とか付けてね)
rsync -avcHSX --del /etc/ /backup/myhost/etc/cur/
これで全部ファイルがコピーされたので、あとはスナップショット取るだけ。
btrfs filesystem sync /backup/myhost/etc/cur btrfs subvolume snapshot /backup/myhost/etc/cur /backup/myhost/etc/$(date +%Y-%m-%dT%H:%M:%S)
ようやく本題にたどり着いた! 上記の様に手でもできるのだけど、面倒なので スクリプトを作っておきましたぜ。 使い方は単純に
btr-backup /etc
など。後ろに rsync のオプションが渡せるので、
btr-backup /var/htdocs -C --exclude="/cache/*" btr-backup /home --exclude="/old"
と言うような事も出来ます。
リモートバックアップも対応。rsync に渡しているだけなので通常は ssh でログインします。パス無しのキーを設定しておくと good。 こんな感じ。
btr-backup remote:/etc -z
(何か rsync の説明になっているけど) ssh キーを変えたければ RSYNC_RSH を設定するか -e で。
btr-backup remote:/etc -z -e "ssh -i ~/.ssh/id_backup"
もしくは
export RSYNC_RSH="ssh -i ~/.ssh/id_backup" btr-backup remote:/etc
rsync 起動しているだけなので、rsync プロトコルも使えます(多分使わないと思うけど)。
btr-backup rsync://remote/etc/
という感じ。ぜひ試してみて下さい。詳しくは README を読んでね。 ……というか、単純なので多分スクリプトを読んだ方が早いけど。
自動クリーンアップ用に btr-backup-clean と言うのもあります(based on pdumpfs-clean/hlbackup-clean)。
これを書きたかっただけなのに、解説をしていたら疲れて段々訳の分からない 文章になってきた。よろしければツッコミお願いします。あ、パッチもぜひ。