I'm probably about the only person in the world using that kind of setup, but here we go:
On btrfs, lxc containers are just subvolumes mounted into the host filesystem, and container snapshots are btrfs snapshots attached to the snapshots/ subdirectory of the container host volume.
So I'm running a simple script on the lxc host each night that cycles through all the containers and creates a snapshot named "amanda" for each of them - deleting the previous version if present. The main loop of the bash script looks more or less like this:
Amanda can do incremental backups using GNU tar (in addition to a host of other options). One of the less obvious stumbling blocks with this is that GNU tar takes the device ID into account when calculating incrementals - and as each btrfs snapshot is a new device, the default configuration will back up all of the files in the snapshot every day, even if the file metadata is unchanged. So to make this setup work, Amanda needs a new dumptype with a tar configuration that ignores the device ID (tar option --no-check-device). The amanda.conf on my backup server now defines this in addition to the pre-existing defaults:
All that's left now is to add entries to the Amanda disklist that are using my new dump type:
- I have an active Amanda (cache) installation that I use to back up various UNIX systems (to disk, with a weekly flush out to a tape rotation)
- I run a system with lxc containers, using btrfs as storage backend
On btrfs, lxc containers are just subvolumes mounted into the host filesystem, and container snapshots are btrfs snapshots attached to the snapshots/ subdirectory of the container host volume.
So I'm running a simple script on the lxc host each night that cycles through all the containers and creates a snapshot named "amanda" for each of them - deleting the previous version if present. The main loop of the bash script looks more or less like this:
if [ -d /${lxdpool}/snapshots/${container}/amanda ]; then lxc delete ${container}/amanda sleep 2 fi lxc snapshot ${container} amanda
Amanda can do incremental backups using GNU tar (in addition to a host of other options). One of the less obvious stumbling blocks with this is that GNU tar takes the device ID into account when calculating incrementals - and as each btrfs snapshot is a new device, the default configuration will back up all of the files in the snapshot every day, even if the file metadata is unchanged. So to make this setup work, Amanda needs a new dumptype with a tar configuration that ignores the device ID (tar option --no-check-device). The amanda.conf on my backup server now defines this in addition to the pre-existing defaults:
define application-tool app_amgtar_snap { # comment "amgtar for btrfs snapshots" plugin "amgtar" property "ONE-FILE-SYSTEM" "yes" #use '--one-file-system' option property "ATIME-PRESERVE" "yes" #use '--atime-preserve=system' option property "CHECK-DEVICE" "no" #use '--no-check-device' if set to "no" property "IGNORE" ": socket ignored$" # remove some log clutter property append "IGNORE" "directory is on a different filesystem" } define dumptype dt_amgtar_snap { # comment "new dump type that uses the above application definition" program "APPLICATION" application "app_amgtar_snap" } define dumptype comp-user-ssh-tar-lxd-snap { # global-ssh # use global ssh transport configuration client_username "backup" program "GNUTAR" dt_amgtar_snap # that's my new dumptype comment "partitions dumped with tar as lxd snapshot, using gnutar --no-device option" index priority low compress client fast exclude list "./rootfs/.amandaexclude" # each container can have individual exclude lists in /.amandaexclude }
All that's left now is to add entries to the Amanda disklist that are using my new dump type:
host.example.com /lxdpool/snapshots/container1/amanda comp-user-ssh-tar-lxd-snap host.example.com /lxdpool/snapshots/container2/amanda comp-user-ssh-tar-lxd-snap