Earlier I merged my @home subvolume with the @ subvolume, which makes snapshotting and incremental backup up 1/2 the work, since I am creating a snapshot only for @. This also increases the number of snapshots I can have on my SSD without running into balance problems as quicklly.
I wrote a script to make the snapshot process faster and less error prone, given my shaky typing. It worked well but one weakness became apparent. I listed the existing snapshots and chose which snapshot I wanted to use as the parent for the incremental backup. It became apparent that 99.99999999% of the time is was the snapshot I made previously. By chance today I happened upon this website. It had the answer to the problem of how to pick out the first and second to last snapshot. With that information in hand I rewrote my script, which I saved as:
make_snapshot.sh
You may want to comment out the DELSNAP commands until your number of archive snapshots hits somewhere between 5 and 10. Then, the script will maintain the number when you remove the comment flag.
If you see any errors or ways of improving it let me know.
I wrote a script to make the snapshot process faster and less error prone, given my shaky typing. It worked well but one weakness became apparent. I listed the existing snapshots and chose which snapshot I wanted to use as the parent for the incremental backup. It became apparent that 99.99999999% of the time is was the snapshot I made previously. By chance today I happened upon this website. It had the answer to the problem of how to pick out the first and second to last snapshot. With that information in hand I rewrote my script, which I saved as:
make_snapshot.sh
Code:
#!/bin/bash
#
# script to create backup snapshots to /mnt/snapshots and a differential backup to /backup
# To be run as root from /
#
echo "Mounting drives"
eval "mount /dev/disk/by-uuid/ce2b5741-c01e-4b3d-b6ba-401ad7f7fcdf /mnt"
eval "mount /dev/disk/by-uuid/e84e2cdf-d635-41c5-9f6f-1d0235322f48 /backup"
NOW=$(date +%Y%m%d%H%M)
echo "Making today's snapshot"
MKSNAP='btrfs su snapshot -r /mnt/@ /mnt/snapshots/@'$NOW
eval $MKSNAP
eval 'sync'
eval 'sync'
echo "Finding previous snapshot as parent "
PREVSNAP=""
list=($(ls /mnt/snapshots/))
PREVSNAP=${list[-2]}
NOW=${list[-1]}
echo "Attempting incremental backup"
if [[ -s "/mnt/snapshots/"$PREVSNAP ]];
then
MKINC='btrfs send -p /mnt/snapshots/'$PREVSNAP
MKINC=$MKINC' /mnt/snapshots/'$NOW
MKINC=$MKINC' | btrfs receive /backup'
echo $MKINC
eval $MKINC
eval 'sync'
eval 'sync'
eval "sync"
DELSNAP='btrfs subvol delete -C /mnt/snapshots/'${list[0]}
eval $DELSNAP
eval 'sync'
eval 'sync'
eval 'sync'
list=''
list=($(ls /backup))
DELSNAP='btrfs subvol delete -C /backup/'${list[0]}
eval $DELSNAP
eval 'sync'
eval 'sync'
eval 'sync'
echo "Snapshots completed, oldest snapshots deleted"
eval 'umount /backup'
eval 'umount /mnt'
echo "Drives unmounted"
else
echo 'Incremental backup failed using '$PREVSNAP' and '$NOW
echo 'Drives still mounted, ready to clean up'
fi
If you see any errors or ways of improving it let me know.




Comment