nanuqsaurus/modules/system/impermanence.nix

82 lines
2.4 KiB
Nix
Raw Permalink Normal View History

2026-02-10 09:25:12 +02:00
{ config, lib, ... }:
{
2026-02-10 09:34:51 +02:00
options.nanuqsaurus.impermanence.enable = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable impermanence with a /persist Btrfs subvolume.";
};
config = lib.mkIf config.nanuqsaurus.impermanence.enable {
2026-02-10 09:25:12 +02:00
boot.initrd.supportedFilesystems = [ "btrfs" ];
# Reset the /root subvolume to a pristine snapshot on every boot.
# systemd stage-1 initrd does not support boot.initrd.postDeviceCommands, so
# this runs as an initrd systemd service, ordered after the labelled device
# appears and before the root filesystem is mounted (sysroot.mount).
# Note: `cut` (coreutils) is used instead of `awk`, which is not in the
# systemd initrd.
boot.initrd.systemd.services.rollback = {
description = "Rollback btrfs root subvolume to a pristine state";
wantedBy = [ "initrd.target" ];
after = [ "dev-disk-by\\x2dlabel-nixos.device" ];
before = [ "sysroot.mount" ];
unitConfig.DefaultDependencies = "no";
serviceConfig.Type = "oneshot";
script = ''
mkdir -p /mnt
mount -t btrfs -o subvol=/ /dev/disk/by-label/nixos /mnt
2026-02-10 09:25:12 +02:00
if [ ! -d /mnt/root-blank ]; then
btrfs subvolume snapshot -r /mnt/root /mnt/root-blank
fi
if [ -d /mnt/root ]; then
if [ -d /mnt/root-previous ]; then
btrfs subvolume delete /mnt/root-previous
fi
btrfs subvolume snapshot /mnt/root /mnt/root-previous
while true; do
subvols="$(btrfs subvolume list -o /mnt/root | cut -f9 -d' ')"
if [ -z "$subvols" ]; then
break
fi
for subvol in $subvols; do
btrfs subvolume delete "/mnt/$subvol"
done
done
btrfs subvolume delete /mnt/root
fi
2026-02-10 09:25:12 +02:00
btrfs subvolume snapshot /mnt/root-blank /mnt/root
umount /mnt
'';
};
2026-02-10 09:25:12 +02:00
fileSystems."/persist".neededForBoot = true;
environment.persistence."/persist" = {
hideMounts = true;
directories = [
"/etc/nixos"
"/etc/NetworkManager"
2026-02-10 09:25:12 +02:00
"/etc/ssh"
"/var/lib/bluetooth"
2026-02-10 09:25:12 +02:00
"/var/lib/cups"
"/var/lib/fprint"
2026-02-10 09:25:12 +02:00
"/var/lib/libvirt"
"/var/lib/NetworkManager"
2026-02-10 09:25:12 +02:00
"/var/lib/secureboot"
"/var/lib/tailscale"
"/var/lib/systemd"
"/var/lib/nixos"
];
files = [
"/etc/machine-id"
];
};
};
}