nixos-26.05 asserts against boot.initrd.postDeviceCommands under the systemd stage-1 initrd. Move the root-subvolume rollback into an initrd systemd oneshot (ordered after the labelled device, before sysroot.mount). Same rollback logic; awk swapped for cut since coreutils' cut is in the systemd initrd but awk is not. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
81 lines
2.4 KiB
Nix
81 lines
2.4 KiB
Nix
{ config, lib, ... }:
|
|
|
|
{
|
|
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 {
|
|
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
|
|
|
|
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
|
|
|
|
btrfs subvolume snapshot /mnt/root-blank /mnt/root
|
|
umount /mnt
|
|
'';
|
|
};
|
|
|
|
fileSystems."/persist".neededForBoot = true;
|
|
|
|
environment.persistence."/persist" = {
|
|
hideMounts = true;
|
|
directories = [
|
|
"/etc/nixos"
|
|
"/etc/NetworkManager"
|
|
"/etc/ssh"
|
|
"/var/lib/bluetooth"
|
|
"/var/lib/cups"
|
|
"/var/lib/fprint"
|
|
"/var/lib/libvirt"
|
|
"/var/lib/NetworkManager"
|
|
"/var/lib/secureboot"
|
|
"/var/lib/tailscale"
|
|
"/var/lib/systemd"
|
|
"/var/lib/nixos"
|
|
];
|
|
files = [
|
|
"/etc/machine-id"
|
|
];
|
|
};
|
|
};
|
|
}
|