Skip to content

Instantly share code, notes, and snippets.

@tasoseng
Created March 27, 2021 22:24
Show Gist options
  • Save tasoseng/0c8f629c44b719c443158d15ddcee8fe to your computer and use it in GitHub Desktop.
Save tasoseng/0c8f629c44b719c443158d15ddcee8fe to your computer and use it in GitHub Desktop.
incremental zfs backup
#!/bin/sh
export PATH=/usr/local/sbin:/sbin:/usr/local/bin:/bin:/usr/sbin:/usr/bin
#DEBUG="echo"
DEBUG=""
set -eu # -x
TODAY=$(date +%Y-%m-%d)
NOW=$(date +%s)
KEEP_DAYS=30
HOST=backup.server.example.com
SSH_PORT=22
RUSER=remote_username
SSH_KEY=/path/to/ssh_key
SSH="ssh -p $SSH_PORT -i $SSH_KEY $RUSER@$HOST"
#ping -c 3 ${HOST} || exit 1
FS=zroot/testfs
RFS=zroot/backups/testfs
## check if remote fs is mounted
yesno=$($SSH zfs get -Hp mounted ${RFS} | awk '{print $3}')
if [ "$yesno" != "yes" ];then
exit 2
fi
LOCAL_GUID="$(zfs get -Hp -o value guid ${FS}@backup)"
for SNAP in $($SSH zfs list -Hp -o name -t snapshot $RFS); do
GUID="$($SSH zfs get -Hp -o value guid $SNAP)"
if [ "$GUID" == "$LOCAL_GUID" ]; then
echo skip $SNAP
continue
else
CREATION="$($SSH zfs get -Hp -o value creation $SNAP)"
if [ $((NOW - CREATION)) -gt $((KEEP_DAYS*86400)) ]; then
echo Deleting $SNAP
$DEBUG $SSH zfs destroy $SNAP
else
$DEBUG echo Keeping $SNAP
fi
fi
done
#!/bin/sh
export PATH=/usr/local/sbin:/sbin:/usr/local/bin:/bin:/usr/sbin:/usr/bin
set -eu -x
TODAY=$(date +%Y-%m-%d)
HOST=backup.server.example.com
SSH_PORT=22
RUSER=remote_username
SSH_KEY=/path/to/ssh_key
SSH="ssh -p $SSH_PORT -i $SSH_KEY $RUSER@$HOST"
# do not run if last snapshot is today
LAST_SNAP_TIME=$(zfs get -Hp -o value creation $FS@backup)
LAST_SNAP_DATE=$(date +%Y-%m-%d --date=@$LAST_SNAP_TIME)
[[ $LAST_SNAP_DATE == $TODAY ]] && exit 1
#ping -c 3 ${HOST} || exit 1
FS=zroot/testfs
RFS=zroot/backups/testfs
## check if remote fs is mounted
yesno=$($SSH zfs get -Hp mounted ${RFS} | awk '{print $3}')
if [ "$yesno" != "yes" ];then
exit 2
fi
## snap and send diff
zfs snapshot ${FS}@${TODAY}
zfs send -i ${FS}@backup ${FS}@${TODAY} | $SSH zfs recv -F ${RFS}
## rotate
zfs destroy ${FS}@backup
zfs rename ${FS}@${TODAY} ${FS}@backup
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment