#!/usr/bin/env bash # Needs to be run with sudo if [ "$EUID" -ne 0 ]; then echo "This script needs to be run with sudo or as a root user" exit 1 fi LOCALSNAPSHOTSDIR="/.snapshots" EXTERNALSNAPSHOTSDIR="/run/media/btrfs_formatted_drive" LATEST_HOME=(`ls -d $LOCALSNAPSHOTSDIR/home-* | sort | tail -c 9`) LATEST_HOME_EXTERNAL=(`ls -d $EXTERNALSNAPSHOTSDIR/home-* | sort | tail -c 9`) TODAY=`date +%Y%m%d` # make local snapshot if test -d "$LOCALSNAPSHOTSDIR"; then echo "Using directory $LOCALSNAPSHOTSDIR for local snapshots." if [[ $LATEST_HOME -ne $TODAY ]]; then echo "Today is $TODAY and latest home backup was $LATEST_HOME doing new snapshot" btrfs subvolume snapshot -r /home $LOCALSNAPSHOTSDIR/home-$TODAY else echo "Todays backup already done" fi fi # make an external backup of the snapshot # destination drive needs to be formatted as BTRFS ! if test -d "$EXTERNALSNAPSHOTSDIR"; then echo "using directory $EXTERNALSNAPSHOTSDIR for external backup." if [[ $LATEST_HOME_EXTERNAL -ne $TODAY ]]; then echo "Today is $TODAY and latest external backup is $LATEST_HOME_EXTERNAL copying data to external drive" # Update using latest external backup-date as reference to do the differential backup against btrfs send -p $LOCALSNAPSHOTSDIR/home-$LATEST_HOME_EXTERNAL $LOCALSNAPSHOTSDIR/home-$TODAY | btrfs receive $EXTERNALSNAPSHOTSDIR else if test -f "$EXTERNALSNAPSHOTSDIR/home-$TODAY"; then echo "External backup already up to date" else echo "Earlier versions not found, creating the first external backup to $EXTERNALSNAPSHOTSDIR" btrfs send $LOCALSNAPSHOTSDIR/home-$TODAY | btrfs receive $EXTERNALSNAPSHOTSDIR fi fi else echo "External drive not found, is it mounted?" fi