[ccollect – (pseudo) incremental backup with different exclude lists using hardlinks and rsync](http://linux.schottelius.org/ccollect/)
社内の Subversion, Trac, tDiary などを実行しているサーバがあるのですが、これらのデータの世代別バックアップを取るのに ccollect を使っています。
ccollect で特徴的なところは、rsync によりインクリメンタルなバックアップを実行するようになっており shell script で出来ているところです。また、変更のないファイルは hardlink が作成されディスクを消費しないように出来ています。
## インストール ##
現状 ccollect をパッケージにしている Linux distributor はないようなので、ソースからインストールします。まず ccollect のサイトから [ccollect-0.7.0.tar.bz2](http://linux.schottelius.org/ccollect/ccollect-0.7.0.tar.bz2) をダウンロードします。
展開する場所は、ここでは /usr/local/share にインストールすることにします。
$ tar xjf ccollect-0.7.0.tar.bz2 -C /usr/local/share
/usr/local/share/ccollect-0.7.0 に展開されます。
後で役に立つかも知れないので /usr/local/share/ccollect でアクセスできるように symlink を作成しておきます。
$ ln -s ccollect-0.7.0 /usr/local/share/ccollect
## 設定 ##
ccollect の設定ファイルは /etc/ccollect ディレクトリに置きます。環境変数 CCOLLECT_CONF で指定すれば別のディレクトリに置くことも出来ます。
今回は /var, /home, /etc をバックアップ対象として 60 日保存されるように設定しました。
mkdir /etc/ccollect
### interval ###
まずは 60 日保存をデフォルトの設定として /etc/ccollect/defaults/intervals/daily に書き込みます。
mkdir -p /etc/ccollect/defaults/intervals
echo -n 60 >/etc/ccollect/defaults/intervals/daily
### source ###
次は /etc/ccollect/sources ディレクトリにバックアップの設定を対象ごとに記述します。
mkdir /etc/ccollect/sources
# /var
mkdir /etc/ccollect/sources/var
echo ‘/var’ >/etc/ccollect/sources/var/source
echo ‘/disk/backups/var’ >/etc/ccollect/sources/var/destination
echo ‘/var/tmp’ >/etc/ccollect/sources/var/exclude
echo ‘/var/cache’ >>/etc/ccollect/sources/var/exclude
# /home
mkdir /etc/ccollect/sources/home
echo ‘/home’ >/etc/ccollect/sources/home/source
echo ‘/disk/backups/home’ >/etc/ccollect/sources/home/destination
# /etc
mkdir /etc/ccollect/sources/etc
echo ‘/etc’ >/etc/ccollect/sources/etc/source
echo ‘/disk/backups/etc’ >/etc/ccollect/sources/etc/destination
上記のように source にバックアップ元を、destination にバックアップ先を書き込んでおくだけです。
またバックアップ対象から除外したい場合には exclude ファイルに対象となるディレクトリをリストしておきます。
バックアップの直前でコマンドを実行することやリモートマシンにあるディレクトリをバックアップすること(rsync + ssh で)も出来ますので、より細かな設定は [Source configuration](http://linux.schottelius.org/ccollect/doc/ccollect.html#_source_configuration) を見てください。
## バックアップ実行 ##
後は次のコマンドを1日1回実行すれば、すべてのバックアップ元に対して 60 日保存のバックアップが実行できます。
/usr/local/share/ccollect/ccollect.sh -a daily
手動で実行してバックアップができているか試しておきます。
$ ls -l /disk/backups/var
total 0
drwxr-xr-x 3 root root 16 2008-04-24 04:51 daily.20080424-0451.17298
drwxr-xr-x 3 root root 16 2008-04-25 04:51 daily.20080425-0451.17953
drwxr-xr-x 3 root root 16 2008-04-26 04:51 daily.20080426-0451.18710
drwxr-xr-x 3 root root 16 2008-04-27 04:51 daily.20080427-0451.19905
drwxr-xr-x 3 root root 16 2008-04-28 04:51 daily.20080428-0451.20670
うまくいっていれば上記のようなディレクトリが出来ているはずです。
## バックアップ対象ごとに設定可能な項目 ##
最後にバックアップごとに指定できる項目を列挙しておきます。
### source ###
バックアップ対象のパスを rsync が理解できる形式でテキストで記述します。
### destination ###
バックアップ先のディレクトリをテキストで記述します。
### verbose ###
/etc/ccollect/sources/NAME/verbose というファイルがあると verbose モードになります。
実際には rsync に -v オプションが渡ります。
### very_verbose ###
verbose モードよりも更に verbose になります。これもファイルがあるとこのモードになります。
実際には mkdir -v, rm -v, rsync -vv で実行されます。
### summary ###
rsync が終わったときにサマリーを出力させたい場合には summary ファイルを作成しておきます。
### exclude ###
exclude ファイルにはバックアップ対象から除外したいパスを一行ずつ記述します。
### rsync_options ###
rsync に渡したいオプションがあれば、rsync_options ファイルに一行ごとに記述します。
### pre_exec ###
このファイルが用意すとバックアップ元に対してバックアップを開始する前に実行してくれます。
pre_exec を実行しようとするので、pre_exec ファイルは実行可能にしておきます。
### post_exec ###
pre_exec はバックアップの開始前ですが、post_exec はバックアップの終了後に実行されます。
このファイルも同様に実行可能にしておきます。
### delete_incomplete ###
このファイルがあると、バックアップが不完全だった場合に不完全になったバックアップ先のディレクトリを削除するようになります。
### remote_host ###
バックアップ先を自マシンではなくて、別のマシンにしたい場合にはこの remote_host ファイルにそのホスト名を記述します。