birdpdumpfsからrdumpfsへ

Debian jessieにしてからpdumpfsが使いづらくなってしまい、後継をどうしようかと考えていて、Google先生に聞いたところrsyncの–link-destオプションで似たようなことが出来る、と知り、ちゃちゃっと1時間ハックで下記のようなスクリプトを書きました。

#!/bin/bash

set -f

usage_exit() {
	echo "Usage: $0 [-l log_file] [-e exclude_pattern] src dest" 1>&2
	exit 1
}

LOGFILE=""
EXCLUDE=""

while getopts e:l:h OPT
do
	case $OPT in
        l) LOGFILE=$OPTARG
            ;;
        e) EXCLUDE=$OPTARG
            ;;
        h) usage_exit
            ;;
        \?) usage_exit
            ;;
	esac
done

shift $((OPTIND - 1))
if [ $# -lt 2 ]; then
	usage_exit
fi

EX=""
if [ "${EXCLUDE}" != "" ]; then
	for e in `echo "${EXCLUDE}"`; do
        EX="${EX} --exclude='${e}'"
	done
fi
LOG=""
if [ "${LOGFILE}" != "" ]; then
	LOG=" --log-file=${LOGFILE}"
fi

SRCDIR=`readlink -m $1`
DSTDIR=`readlink -m $2`
DATEDIR="$(date +'%Y')/$(date +'%m')/$(date +'%d')"
TARGETDIR=`readlink -m ${DSTDIR}/${DATEDIR}`

if [ ! -d "${TARGETDIR}" ]; then
	mkdir -p -m 0700 ${TARGETDIR}
fi

LATESTDIR=`find ${DSTDIR} -maxdepth 3 -mindepth 3 -type d ! -path "${TARGETDIR}" -print | sort -r | head -1`
LD=""
if [ "${LATESTDIR}" != "" ]; then
	LD=" --link-dest=${LATESTDIR}"
fi

eval "rsync -aHAXvv --delete${EX}${LOG}${LD} ${SRCDIR} ${TARGETDIR}"

rm -f ${DSTDIR}/latest
ln -s ${DATEDIR} ${DSTDIR}/latest

実際には上記をrdumpfsとしてpathの通ったところに置き、以下のようなスクリプトで呼び出しています。

#!/bin/bash
TARGET="/mnt0/time_machine"
for SOURCE in bin boot etc home lib opt root sbin srv usr var; do
	/root/bin/rdumpfs -l /root/var/log/rdumpfs.log -e 'var/tmp/* var/cache/* var/log/*' /${SOURCE} ${TARGET}
done

これでとりあえずそれまで使っていたpdumpfsとほぼ同じような形でバックアップを取ることが出来るようになりました。なお、いつものように完全無保証なのでご注意あれ。