diff --git a/flake.nix b/flake.nix index 58552fa..65eb049 100644 --- a/flake.nix +++ b/flake.nix @@ -12,6 +12,10 @@ inputs.nixpkgs.follows = "nixpkgs"; }; nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest"; + impermanence = { + url = "github:nix-community/impermanence"; + inputs.nixpkgs.follows = "nixpkgs"; + }; lix-module.url = "git+https://git.lix.systems/lix-project/nixos-module?ref=release-2.93"; lix-module.inputs.nixpkgs.follows = "nixpkgs"; lanzaboote.url = "github:nix-community/lanzaboote"; diff --git a/modules/profile/nanuqsaurus.nix b/modules/profile/nanuqsaurus.nix index 9e09240..8c8da3b 100644 --- a/modules/profile/nanuqsaurus.nix +++ b/modules/profile/nanuqsaurus.nix @@ -5,6 +5,7 @@ inputs.lix-module.nixosModules.lixFromNixpkgs inputs.nix-index-database.nixosModules.nix-index inputs.nix-flatpak.nixosModules.nix-flatpak + inputs.impermanence.nixosModules.impermanence ../system/flatpak.nix ../system/base.nix ../system/packages.nix @@ -13,6 +14,7 @@ ../system/home-manager-skel.nix ../system/fonts.nix ../system/printer.nix + ../system/impermanence.nix ../desktop/desktop-entries.nix ../desktop/file-manager.nix ../desktop/gnome-minimal.nix diff --git a/modules/system/disko-btrfs.nix b/modules/system/disko-btrfs.nix index 1e8bfa1..08e0a57 100644 --- a/modules/system/disko-btrfs.nix +++ b/modules/system/disko-btrfs.nix @@ -27,6 +27,7 @@ content = { type = "btrfs"; extraArgs = [ "-f" ]; + label = "nixos"; subvolumes = { root = { mountpoint = "/"; @@ -48,6 +49,13 @@ "compress=zstd" ]; }; + + persist = { + mountpoint = "/persist"; + mountOptions = [ + "compress=zstd" + ]; + }; }; }; }; diff --git a/modules/system/impermanence.nix b/modules/system/impermanence.nix new file mode 100644 index 0000000..3eb2709 --- /dev/null +++ b/modules/system/impermanence.nix @@ -0,0 +1,46 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf ( + (config.fileSystems ? "/persist") + && (config.fileSystems."/persist".fsType or "" == "btrfs") + ) { + boot.initrd.supportedFilesystems = [ "btrfs" ]; + + boot.initrd.postDeviceCommands = lib.mkAfter '' + 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 + 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/ssh" + "/etc/cups" + "/var/lib/cups" + "/var/lib/libvirt" + "/var/lib/secureboot" + "/var/lib/tailscale" + "/var/lib/systemd" + "/var/lib/nixos" + ]; + files = [ + "/etc/machine-id" + ]; + }; + }; +}