著者:飯坂 剛一 (いいさか ごういち)

Version: 2009/01/18

はじめに

rdiff-backupは、リモートあるいはローカルのディスク上に 差分バックアップを行うツールです。

最新の状態の他に履歴も管理しているため、 日時を指定して「あの時」のファイルを簡単に取り出すことができます。

ここでは、この rdiff-backup を使ってバックアップを行う設定と、 リストアを行うときの手順について説明します。

rdiff-backup の入手

最新のソースコードはrdiff-backupのオフィシャルサイトから ダウンロードできます。

ビルドおよび実行には、次のツールとライブラリが必要になります。

rdiff-backup は Windowsでも動作しますが、 以下のものも必要になります。

また、この資料ではLinuxでの動作について説明しています。

rdiff-backup コマンド

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 コマンド

timemachine コマンドの中身というのは、 「rdiff-backup を make コマンドで呼び出すようにし、 cronに登録したもの」になります。

cronへ timemachine を登録する

anacron で1日1回呼ばれるスクリプト timemachine を登録しています。

[root@manage01 ~]# cat /etc/cron.d/timemachine

MAILTO=root

0 1 * * * root /etc/timemachine.d/timemachine.sh

timemachine のコンフィグレーション

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