Does anyone have a good, simple btrfs snapshot backup solution?

You could use this template (it is missing your time limit setting) as a baseline.

#!/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

external link to sample backup script

4 Likes