Take a btrfs snapshot on each successfull boot

To try and keep my system bootable no matter what happens I use systemd to run a script that takes a btrfs snapshot and configures bootctl to add that snapshot into the boot menu.

To do this first, write the following script here /usr/local/bin/snapshot_current_system_state.sh (and make it executable)


# take no snapshots when booted into a snapshot
  exit 0

echo "Deleting old snapshot.."
/usr/bin/btrfs subvolume delete /run/btrfs-root/__state_at_last_successful_boot

echo "Snap shotting root.."
/usr/bin/btrfs subvolume snapshot /run/btrfs-root/__current/ROOT /run/btrfs-root/__state_at_last_successful_boot

timestamp="$(/usr/bin/date +%d.%m.%Y-%H:%M:%S)"
echo "Write issue file in new snapshot.."
/usr/bin/echo -e "Arch Linux --- state at last successful boot (nonpersistent) [${timestamp}]\n" > /run/btrfs-root/__state_at_last_successful_boot/etc/issue

echo "Write STAMP file in new snapshot.."
/usr/bin/echo "${timestamp}" > "/run/btrfs-root/__state_at_last_successful_boot/SNAPSHOT-TIMESTAMP"

echo "Replace fstab mount options, so we load the snapshot.."
/usr/bin/sed --posix --regexp-extended "s/subvol=__current\/ROOT/subvol=__state_at_last_successful_boot/g" --in-place "/run/btrfs-root/__state_at_last_successful_boot/etc/fstab"


Next, write the following systemd file /etc/systemd/system/multi-user.target.wants/snapshot_current_system_state_upon_boot.service (and enable it)

Description=Takes a snapshot of _current/ROOT after multi-user.target has been reached.

ExecStart=/bin/sh /usr/local/bin/snapshot_current_system_state.sh


This is NOT generic and pretty specific to my setup, so please read and grok the script and alter accordingly.