トップ «前の日記(2010-09-19) 最新 編集

TPRG: 迷走メモ書き

[Donate to CCjp]
2000|12|
2001|01|02|03|04|05|06|07|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|07|08|11|12|
2009|01|02|
2010|04|06|09|

2010-09-21 btr-backup: btrfs で差分バックアップを取ろう

_ btr-backup: btrfs でインクリメンタルバックアップを取ろう

btrfs は Linux 2.6.29 で メインラインに取り込まれ、汎用ファイルシステムとしては一番先進的なものになっている。 CopyOnWrite ベースで作られており、スナップショット、サブボリューム、透過圧縮、 ファイルシステム側での RAID サポート、オンラインデフラグなどなど、 他には無い機能が満載。

しかし、今すぐ手元の ext* を置き換えられるかというと、 japan.internet.com の記事でも触れられているように、まだ 壊れた時にちゃんと直す手段がない など、 いきなりメインのファイルシステムを置き換えるには結構不安な面もあったり。

でも、バックアップ目的なら、今すぐ試せてしかも非常に快適。 バックアップなら最悪ファイルシステムが壊れても、本体と同時でなければもう一度とり直せば良いだけだしね。 ただもちろん、ちゃんとバックアップされているよう見えて、 実は読もうとするとデータが壊れている……なんてのは困るわけだけど…… 今回はそれは考えない!

メリットとデメリット

btrfs + rsync を使って今回やってみる file to file 形式のバックアップは、 faubackup, pdumpfs, rsync --link-dest といったような、 ハードリンクを使う増分バックアップツールに近い。 でも、比較するとかなりのメリットがある。

  • 透過圧縮が効くのでたくさん保存できる
  • 途中でハードリンクが切れて容量が爆発したりしない
  • スナップショット単位での削除が一瞬でできる
  • 拡張属性、ACL の完全なサポート

ただし、デメリットもある。

  • ファイルシステムを用意しないといけない
    • 新しいカーネル、ディスク(もしくはループバック用イメージファイル)が必要
  • btrfs 自体が壊れるかも
  • rsync でコピーするので、ファイルを mv した時にはサイズが増加する (pdumpfs は inode 番号で管理しているので、mv してもバックアップサイズは増加しない)

まあでも、比較すれば十分じゃないかな。

準備するもの

まず、必要なものリスト。

  • btrfs v2.6.32 以降 (スナップショットの削除のため。後述の理由により、できれば 2.6.34)
  • btrfsctl ではなく、新しい統合コマンド "btrfs" (btrfs-progs-unstable の git で 2010-01-24 から入ってます。 Debian sid ならパッケージにバックポートされている。)
  • rsync

仕組みと手順の説明

サブボリュームとスナップショット

増分バックアップの為にこれを使うので、 とにかく簡単にサブボリューム機能について説明してみる。

btrfs は「サブボリューム」と呼ばれる、ファイルシステムの内部に 更にルートディレクトリと見なされるものを作成できる。 これは、(マスターボリュームをマウントしている場合)見かけ上は単に中にある ディレクトリに見えるが、ただのディレクトリとは大きな違いがある。

  • btrfs subvolume create で作成する
  • ディレクトリに見えるが、rmdir では消えない。消すには btrfs subvolume delete を使う
  • サブボリュームだけをマウントすることも可能
  • サブボリューム単位でスナップショットが取れる
  • トップレベルのマスターボリュームも一つのサブボリュームと同じ

そして、スナップショットは内部的にはサブボリュームと同じです。 いったん作ってしまえば両者の区別はありません。マウントしたり書き込みも可能

スナップショットとサブボリュームの違いは単に作成時だけで、以下のような感じ。

  • サブボリュームは空の状態で作られる
  • スナップショットは、あるサブボリュームの現在の状態をポイントしたものが作られる

なので、「スナップショットのスナップショットのスナップショット」なども取れます。

実際の手順

まあ、サブボリューム/スナップショット機能を解説したら、 もう何をすればいいか分かってもらえてるでしょう! レシピはかんたん。

  1. (準備) バックアップ対象に対して1つサブボリュームを作る
  2. サブボリュームに対して rsync でコピー
  3. btrfs filesystem sync (注意!)
  4. 現在の日付などで rsync したスナップショットを取る

これだけ。

ちょっと注意しないといけないのは 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 スクリプト作りました

ようやく本題にたどり着いた!  上記の様に手でもできるのだけど、面倒なので スクリプトを作っておきましたぜ。 使い方は単純に

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)。

と。

これを書きたかっただけなのに、解説をしていたら疲れて段々訳の分からない 文章になってきた。よろしければツッコミお願いします。あ、パッチもぜひ。

ChangeLog

  • 2010-09-28: 2.6.34 で sync が必要なくなっていたのでその旨を追加
お名前:
E-mail:
コメント:
[]


Tatsuki Sugiura <sugi@nemui.org>