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

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`

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

eval "rsync -aHAXvv --delete${EX}${LOG} --link-dest=${LATESTDIR} ${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とほぼ同じような形でバックアップを取ることが出来るようになりました。なお、いつものように完全無保証なのでご注意あれ。