# Filesystem Backups This guide will cover how to use bupstash for system backups, it is divided into sections which cover different use cases. For all of the guides the shown commands can be put into a cron job or other tool for running background tasks for automated backups. The guides below can also be combined with remote repositories with access controls to allow 'upload only' for secure deployments. ## Simple directory snapshots The simplest use of bupstash is to simply snapshot your home directory to a repository on an external drive. Create the file backup.sh: ``` set -eu export BUPSTASH_KEY=/root/backup-put.key export BUPSTASH_REPOSITORY=/mnt/external-drive/bupstash-backups bupstash put \ --send-log /root/backup.sendlog \ --exclude "/home/*/.cache" \ hostname=$(hostname) \ name=home-backup.tar \ /home/ ``` Then running a backup is as simple as: ``` $ sudo sh ./backup.sh ``` Now to restore files or sub directories we can use `bupstash get`: ``` $ bupstash list name=home-backup.tar ... id="aa87fdbc72241f363568bbb888c0834e" name="backup.tar" timestamp="2020-07-24 15:25:00" ... $ bupstash get id="aa8*" | tar -C restore ... $ bupstash get --pick some/sub-dir id="aa8*" | tar -C restore ... $ bupstash get --pick some/file.txt id="aa8*" > file.txt ``` Some points to consider about this snapshot method: - The use of --exclude to omit the user cache directories, we can save a lot of space in backups by ignoring things like out web browser cache, at the expense of less complete backups. You can specify --exclude more than once to skip more than one directory or file. See the man page for more details. - Bupstash incremental backups work best when the send log file used was last used for a snapshot of the same or similar input data. Manually specifying a send log path with --send-log ensures subsequent similar snapshots use the same send log, often dramatically increasing efficiency. - This method of backup is simple, but does not account for files being modified during upload. The simplest way to to think about this problem, is files will be changing while the backup is uploading, so you might capture different directories at different points in time. - In this command we are also using a 'put' key (see the offline keys guide) so that backups cannot be decrypted even if someone was to steal your external drive. ## Btrfs directory snapshots If you are running linux with btrfs, (or any other operating system + filesystem that supports snapshots), you can use this to get stable snapshots that won't be modified during upload. Create the file backup.sh: ``` set -eu export BUPSTASH_KEY=/root/backup-put.key export BUPSTASH_REPOSITORY=/mnt/external-drive/bupstash-backups if test -e /rootsnap then echo "removing snapshot, it already existed." btrfs subvolume delete /rootsnap fi btrfs subvolume snapshot -r / /rootsnap > /dev/null bupstash put \ --send-log /root/backup.sendlog \ --exclude "/home/*/.cache" \ hostname=$(hostname) \ name=backup.tar \ /rootsnap btrfs subvolume delete /rootsnap > /dev/null ``` Then running a backup is as simple as: ``` $ sudo sh ./backup.sh ``` Filesystem enabled snapshots do not suffer from 'time smear'. All points about '--send-log', '--exclude' and backup restore from simple directory snapshots also apply to this snapshot method. ## Btrfs send snapshots If you are running linux with btrfs, (or any other operating system + filesystem that supports exporting directories as a stream), you can directly save the output of such a command into a bupstash repository. Create the file backup.sh: ``` set -eu export BUPSTASH_KEY=/root/backup-put.key export BUPSTASH_REPOSITORY=/mnt/external-drive/bupstash-backups if test -e /rootsnap then echo "removing snapshot, it already existed." btrfs subvolume delete /rootsnap fi btrfs subvolume snapshot -r / /rootsnap > /dev/null bupstash put \ --exec --send-log /root/backup.sendlog \ hostname=$(hostname) \ name=backup.btrfs \ btrfs send /rootsnap btrfs subvolume delete /rootsnap > /dev/null ``` Then running a backup is as simple as: ``` $ sudo sh ./backup.sh ``` Restoration of the backup is done via the `btrfs receive` command: ``` $ bupstash get name=backup.btrfs | sudo btrfs receive ./restore ```