zfs-backup.sh

zfsのスナップショット機能を使って定期的なバックアップをやろうかと思って以下のようなスクリプトを書いてみた。
でも、これだと永遠に差分を取っていくしかできないので、ある程度溜まるとスナップショットが大きくなるし、そもそもrollbackが大変になる。

だから定期的にスナップショットを破棄して普通の差分ではないスナップショットを取り直すことがしたいんだけど、一般ユーザ権限ではスナップショットの破棄(zfs destroy)ができない。最新のバージョンで要確認だけどね。

というわけで不完全だけど、とりあえず記録ということで載せておく。

#!/usr/bin/env sh

TARGET="zpool_lo/home"
BACKUP_HOST="backup.example.org"
BACKUP_PATH="zfs_snapshots/"
BACKUP_PREFIX="zfs-home-"
BACKUP_SUFFIX=".zfssnap"

## Option

FORMAT="+%Y%m%d"

## Main part

LAST_SNAP=`zfs list -H -t snapshot | cut -f1 | tail -1`

DATE=`date $FORMAT`
SNAPSHOT_NAME="$TARGET@$DATE"

echo "zfs snapshot $SNAPSHOT_NAME"
zfs snapshot $SNAPSHOT_NAME

SSH_SEND="ssh $BACKUP_HOST \"\"cat > $BACKUP_PATH$BACKUP_PREFIX$DATE$BACKUP_SUFFIX\"\""
if [ -z $LAST_SNAP ]; then
    echo "zfs send $SNAPSHOT_NAME | $SSH_SEND"
#    zfs send $SNAPSHOT_NAME | $SSH_SEND
else
    # Incremental send
    echo "zfs send -i $LAST_SNAP $SNAPSHOT_NAME | $SSH_SEND"
    zfs send -i $LAST_SNAP $SNAPSHOT_NAME | $SSH_SEND
fi