{ config, lib, inputs, ... }: let inherit (lib) mkIf mkEnableOption; inherit (lib.pantheon) mkStrOption; cfg = config.machine.drives.btrfs; ephemeralRootCfg = { boot.initrd.postDeviceCommands = lib.mkAfter '' mkdir /btrfs_tmp mount /dev/root_vg/root /btrfs_tmp if [[ -e /btrfs_tmp/root ]]; then mkdir -p /btrfs_tmp/old_roots timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" fi delete_subvolume_recursively() { IFS=$'\n' for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do delete_subvolume_recursively "/btrfs_tmp/$i" done btrfs subvolume delete "$1" } for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do delete_subvolume_recursively "$i" done btrfs subvolume create /btrfs_tmp/root umount /btrfs_tmp ''; programs.fuse.userAllowOther = true; fileSystems."/persist".neededForBoot = true; #FIXME: below should be in module or something environment.persistence."/persist" = { hideMounts = true; files = [ "/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" "/etc/machine-id" ]; }; }; in { imports = [ inputs.disko.nixosModules.disko inputs.impermanence.nixosModules.impermanence ]; options.machine.drives.btrfs = { enable = mkEnableOption ""; drive = mkStrOption; ephemeralRoot = mkEnableOption ""; }; config = mkIf cfg.enable ( { boot.initrd.kernelModules = [ "dm-snapshot" ]; disko.devices.disk.main = { device = cfg.drive; type = "disk"; content.type = "gpt"; content.partitions = { boot.name = "boot"; boot.size = "1M"; boot.type = "EF02"; esp.name = "ESP"; esp.size = "500M"; esp.type = "EF00"; esp.content = { type = "filesystem"; format = "vfat"; mountpoint = "/boot"; }; swap.size = "4G"; swap.content = { type = "swap"; resumeDevice = true; }; root.name = "root"; root.size = "100%"; root.content = { type = "lvm_pv"; vg = "root_vg"; }; }; }; disko.devices.lvm_vg.root_vg = { type = "lvm_vg"; lvs.root.size = "100%FREE"; lvs.root.content.type = "btrfs"; lvs.root.content.extraArgs = [ "-f" ]; lvs.root.content.subvolumes = { "/root".mountpoint = "/"; "/persist".mountpoint = "/persist"; "/persist".mountOptions = [ "subvol=persist" "noatime" ]; "/nix".mountpoint = "/nix"; "/nix".mountOptions = [ "subvol=nix" "noatime" ]; }; }; } // ephemeralRootCfg ); }