[root@manage01 ~]# du -sh /etc /usr 118M /etc 3.1G /usr
著者:飯坂 剛一 (いいさか ごういち)
Version: 2009/01/18
rdiff-backupは、リモートあるいはローカルのディスク上に 差分バックアップを行うツールです。
最新の状態の他に履歴も管理しているため、 日時を指定して「あの時」のファイルを簡単に取り出すことができます。
ここでは、この rdiff-backup を使ってバックアップを行う設定と、 リストアを行うときの手順について説明します。
最新のソースコードはrdiff-backupのオフィシャルサイトから ダウンロードできます。
ビルドおよび実行には、次のツールとライブラリが必要になります。
python v2.2以降 http://www.python.org/
librsync v0.97以降 http://librsync.sourceforge.net/
pylibacl http://pylibacl.sourceforge.net/
rdiff-backup は Windowsでも動作しますが、 以下のものも必要になります。
また、この資料ではLinuxでの動作について説明しています。
python for Windows extensions http://sourceforge.net/projects/pywin32/
rdiff-backup を使って /etc や /usr などを そのまま差分バックアップしてしまうわけです。
豪快にも思えますが、バックアップそのものは通常の運用であれば、 採取するべきものです。
サイズもはじめに採取したサイズに日々の更新差分が増加するだけなので、 データや設定ファイルを日時を指定して自由にリストアできる利便性があります。
/etc や /usr はインストール状況にもよりますが、 およそ次のようなサイズになります。
[root@manage01 ~]# du -sh /etc /usr 118M /etc 3.1G /usr
バックアップ対象のディレクトリの内容に変化がなければ 1回のrdiff-backupコマンドを実行することで、 増分するサイズは100Kバイト程度です。
[root@backup etc]# du -sh rdiff-backup-data/*12-26* 4.0K rdiff-backup-data/access_control_lists.2008-12-26T01:01:46+09:00.snapshot.gz 4.0K rdiff-backup-data/current_mirror.2008-12-26T01:01:46+09:00.data 4.0K rdiff-backup-data/error_log.2008-12-26T01:01:46+09:00.data.gz 4.0K rdiff-backup-data/extended_attributes.2008-12-26T01:01:46+09:00.snapshot.gz 24K rdiff-backup-data/file_statistics.2008-12-26T01:01:46+09:00.data.gz 32K rdiff-backup-data/mirror_metadata.2008-12-26T01:01:46+09:00.snapshot.gz 4.0K rdiff-backup-data/session_statistics.2008-12-26T01:01:46+09:00.data
timemachine コマンドの中身というのは、 「rdiff-backup を make コマンドで呼び出すようにし、 cronに登録したもの」になります。
anacron で1日1回呼ばれるスクリプト timemachine を登録しています。
[root@manage01 ~]# cat /etc/cron.d/timemachine MAILTO=root 0 1 * * * root /etc/timemachine.d/timemachine.sh
cronで呼び出される timemachine.sh /etc/timemachine.d にある Makefile を実行しています。
#!/bin/sh
LOGFILE=/var/log/timemachine.log
# log rotation
[ -f ${LOGFILE}.3 ] && mv ${LOGFILE}.3 ${LOGFILE}.4
[ -f ${LOGFILE}.2 ] && mv ${LOGFILE}.2 ${LOGFILE}.3
[ -f ${LOGFILE}.1 ] && mv ${LOGFILE}.1 ${LOGFILE}.2
[ -f ${LOGFILE} ] && mv ${LOGFILE} ${LOGFILE}.1
[ "${DEBUG}" != "NO" ] && exec > ${LOGFILE} 2>&1
date "+Start %F %T"
make -C /timemachine.d all
date "+End %F %T"
サイトごとに異なる箇所としては、 ックアップ対象のディレクトリの内容に変化がなければバックアップデータをどこにおくかの指定だけでよいので、 Makefile 中の BACKUP_SERVER および BACKUP_ROOTDIR を設定します。
複数のマシンのバックアップデータを集約させたいときは、 次のようにホスト名を BACKUP_ROOTDOIR に含ませるとよいでしょう。
[root@manage01 ~]# cat /etc/timemachine.d/Makefile
MYHOST=$(shell hostname -s)
BACKUP_SERVER=backup.local
BACKUP_ROOTDIR=/backups/system/$(MYHOST)/rootdir
BACKUP_BASEDIR=$(BACKUP_SERVER)::$(BACKUP_ROOTDIR)
BACKUP_CMD=/usr/bin/rdiff-backup-wrapper.sh
BACKUP_OPTIONS += -v5 --create-full-path
.PHONY: default
default:: help
.PHONY: help
help::
@echo; echo "RESOURCES LIST"
@for D in $(BACKUPDIR) ; do \
echo " $${D}" ; \
done ; echo
@echo " make all or make /target/path"; echo
-include $(MYHOST).mk
all::$(BACKUPDIR)
@:
#!/bin/bash
MAILTO=root
MYHOST=`hostname -s`
/usr/bin/rdiff-backup $* || {
{
echo "Command Lines: /usr/bin/rdiff-backup $* "
echo ========================================================
cat /var/log/rbackup.log
} | mail -s "[${MYHOST}] rdiff-backup error" ${MAILTO}
}
このMakefileは実行したホストのホスト名から、 ホスト名.mk のMakefileを読み込み、 そこに記述したディレクトリをバックアップしています。
[root@manage01 ~]# cat /home/backups/timemachine/manage01.mk
BACKUPDIR=/etc \
/usr
/export/admin/documents \
/export/admin/adminwiki \
/export/admin/trac \
/export/admin/svn \
/etc::
$(BACKUP_CMD) $(BACKUP_OPTIONS) $@ $(BACKUP_BASEDIR)/$@
/usr::
$(BACKUP_CMD) $(BACKUP_OPTIONS) $@ $(BACKUP_BASEDIR)/$@
/export/admin/documents::
$(BACKUP_CMD) $(BACKUP_OPTIONS) $@ $(BACKUP_BASEDIR)/$@
/export/admin/home/install/adminwiki::
$(BACKUP_CMD) $(BACKUP_OPTIONS) $@ $(BACKUP_BASEDIR)/$@
/export/admin/home/install/trac::
$(BACKUP_CMD) $(BACKUP_OPTIONS) $@ $(BACKUP_BASEDIR)/$@
/export/admin/home/install/svn::
$(BACKUP_CMD) $(BACKUP_OPTIONS) $@ $(BACKUP_BASEDIR)/$@
リストアは rdiff-backup のコマンドをそのまま使います。
2日前の状態に /etc 全部を戻す
rdiff-backup -r 2D backup.local::/etc /etc
1週間の状態に /etc/hostsを戻す
rdiff-backup -r 1W backup.local::/etc/hosts /etc