diff --git a/hosts/c1/default.nix b/hosts/c1/default.nix index 2228d9b..1d3dcdd 100644 --- a/hosts/c1/default.nix +++ b/hosts/c1/default.nix @@ -1,7 +1,6 @@ { pkgs, inputs, hostname, ... }: { imports = [ - inputs.impermanence.nixosModules.impermanence ../common/compute-node.nix ./hardware.nix ]; diff --git a/hosts/common/compute-node.nix b/hosts/common/compute-node.nix index ae9dd41..b55f811 100644 --- a/hosts/common/compute-node.nix +++ b/hosts/common/compute-node.nix @@ -1,5 +1,9 @@ -{ config, pkgs, inputs, ... }: +{ pkgs, ... }: { + imports = [ + ./impermanence.nix + ]; + boot.initrd.kernelModules = [ "usb_storage" ]; boot.initrd.luks.devices."luksroot" = { allowDiscards = true; @@ -8,68 +12,6 @@ keyFile = "/dev/sda"; }; - fileSystems."/".options = ["compress=zstd" "noatime" ]; - fileSystems."/nix".options = ["compress=zstd" "noatime" ]; - fileSystems."/persist".options = ["compress=zstd" "noatime" ]; - fileSystems."/persist".neededForBoot = true; - fileSystems."/var/log".options = ["compress=zstd" "noatime" ]; - fileSystems."/var/log".neededForBoot = true; - - # reset / at each boot - # Note `lib.mkBefore` is used instead of `lib.mkAfter` here. - boot.initrd.postDeviceCommands = pkgs.lib.mkBefore '' - mkdir -p /mnt - - # We first mount the btrfs root to /mnt - # so we can manipulate btrfs subvolumes. - mount -o subvol=/ /dev/mapper/luksroot /mnt - - # 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 - - 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. - umount /mnt - ''; - - # configure impermanence - environment.persistence."/persist" = { - directories = [ - "/etc/nixos" - ]; - files = [ - "/etc/machine-id" - "/etc/ssh/ssh_host_ed25519_key" - "/etc/ssh/ssh_host_ed25519_key.pub" - "/etc/ssh/ssh_host_rsa_key" - "/etc/ssh/ssh_host_rsa_key.pub" - ]; - }; - security.sudo = { extraConfig = '' # rollback results in sudo lectures after each reboot diff --git a/hosts/common/impermanence.nix b/hosts/common/impermanence.nix new file mode 100644 index 0000000..3df8f86 --- /dev/null +++ b/hosts/common/impermanence.nix @@ -0,0 +1,68 @@ +{ pkgs, inputs, ... }: +{ + imports = [ + inputs.impermanence.nixosModules.impermanence + ]; + + environment.persistence."/persist" = { + directories = [ + "/etc/nixos" + ]; + files = [ + "/etc/machine-id" + "/etc/ssh/ssh_host_ed25519_key" + "/etc/ssh/ssh_host_ed25519_key.pub" + "/etc/ssh/ssh_host_rsa_key" + "/etc/ssh/ssh_host_rsa_key.pub" + ]; + }; + + fileSystems."/".options = ["compress=zstd" "noatime" ]; + fileSystems."/nix".options = ["compress=zstd" "noatime" ]; + fileSystems."/persist".options = ["compress=zstd" "noatime" ]; + fileSystems."/persist".neededForBoot = true; + fileSystems."/var/log".options = ["compress=zstd" "noatime" ]; + fileSystems."/var/log".neededForBoot = true; + + # reset / at each boot + # Note `lib.mkBefore` is used instead of `lib.mkAfter` here. + boot.initrd.postDeviceCommands = pkgs.lib.mkBefore '' + mkdir -p /mnt + + # We first mount the btrfs root to /mnt + # so we can manipulate btrfs subvolumes. + mount -o subvol=/ /dev/mapper/luksroot /mnt + + # 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 + + 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. + umount /mnt + ''; +} +