diff --git a/common/impermanence.nix b/common/impermanence.nix index c1ae31c..ea49111 100644 --- a/common/impermanence.nix +++ b/common/impermanence.nix @@ -34,41 +34,27 @@ # reset / at each boot # Note `lib.mkBefore` is used instead of `lib.mkAfter` here. boot.initrd.postDeviceCommands = pkgs.lib.mkBefore '' - mkdir -p /mnt + mkdir /mnt + mount /dev/mapper/luksroot /mnt + if [[ -e /mnt/root ]]; then + mkdir -p /mnt/old_roots + timestamp=$(date --date="@$(stat -c %Y /mnt/root)" "+%Y-%m-%-d_%H:%M:%S") + mv /mnt/root "/mnt/old_roots/$timestamp" + fi - # We first mount the btrfs root to /mnt - # so we can manipulate btrfs subvolumes. - mount -o subvol=/ /dev/disk/by-label/btrfs /mnt + delete_subvolume_recursively() { + IFS=$'\n' + for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do + delete_subvolume_recursively "/mnt/$i" + done + btrfs subvolume delete "$1" + } - # While we're tempted to just delete /root and create - # a new snapshot from /root-blank, /root is already - # populated at this point with a number of subvolumes, - # which makes `btrfs subvolume delete` fail. - # So, we remove them first. - # - # /root contains subvolumes: - # - /root/var/lib/portables - # - /root/var/lib/machines - # - # I suspect these are related to systemd-nspawn, but - # since I don't use it I'm not 100% sure. - # Anyhow, deleting these subvolumes hasn't resulted - # in any issues so far, except for fairly - # benign-looking errors from systemd-tmpfiles. - btrfs subvolume list -o /mnt/root | - cut -f9 -d' ' | - while read subvolume; do - echo "deleting /$subvolume subvolume..." - btrfs subvolume delete "/mnt/$subvolume" - done && - echo "deleting /root subvolume..." && - btrfs subvolume delete /mnt/root + for i in $(find /mnt/old_roots/ -maxdepth 1 -mtime +30); do + delete_subvolume_recursively "$i" + done - echo "restoring blank /root subvolume..." - btrfs subvolume snapshot /mnt/root-blank /mnt/root - - # Once we're done rolling back to a blank snapshot, - # we can unmount /mnt and continue on the boot process. + btrfs subvolume create /mnt/root umount /mnt ''; }