{ inputs , lib , ... }: { imports = [ inputs.disko.nixosModules.disko ]; # !!! DANGER !!! # You have to carefully configure your partitions here. boot.initrd.postDeviceCommands = lib.mkAfter '' mkdir /btrfs_tmp mount /dev/disk/by-label/nixos /btrfs_tmp if [[ -e /btrfs_tmp/root ]]; then mkdir -p /btrfs_tmp/roots.old timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") mv /btrfs_tmp/root "/btrfs_tmp/roots.old/$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/roots.old/ -maxdepth 1 -mtime +7); do delete_subvolume_recursively "$i" done btrfs subvolume create /btrfs_tmp/root umount /btrfs_tmp ''; disko.devices = { disk = { main = { type = "disk"; device = "/dev/sda"; content = { type = "gpt"; partitions = { boot = { name = "boot"; size = "1M"; type = "EF02"; priority = 1; }; esp = { name = "ESP"; end = "512M"; type = "EF00"; content = { type = "filesystem"; format = "vfat"; mountpoint = "/boot"; mountOptions = [ "umask=0077" ]; }; }; root = { size = "100%"; content = { type = "btrfs"; extraArgs = [ "-L" "nixos" "-f" ]; # Override existing partition # Subvolumes must set a mountpoint in order to be mounted, # unless their parent is mounted subvolumes = { "/root" = { mountpoint = "/"; mountOptions = [ "subvol=root" "compress=zstd" "noatime" ]; }; "/home" = { mountpoint = "/home"; mountOptions = [ "subvol=home" "compress=zstd" "noatime" ]; }; "/nix" = { mountpoint = "/nix"; mountOptions = [ "subvol=nix" "compress=zstd" "noatime" ]; }; "/persist" = { mountpoint = "/persist"; mountOptions = [ "subvol=persist" "compress=zstd" "noatime" ]; }; "/var-lib" = { mountpoint = "/var/lib"; mountOptions = [ "subvol=var-lib" "compress=zstd" "noatime" ]; }; "/var-log" = { mountpoint = "/var/log"; mountOptions = [ "subvol=var-log" "compress=zstd" "noatime" ]; }; "/var-tmp" = { mountpoint = "/var/tmp"; mountOptions = [ "subvol=var-tmp" "compress=zstd" "noatime" ]; }; "/swap" = { mountpoint = "/.swap"; swap.swapfile.size = "4G"; }; }; }; }; }; }; }; }; }; fileSystems = { # /, /nix/, /nix/store, /var, /var/log, /var/lib, /var/lib/nixos, /etc, /usr # are all automatically mounted marked as needed for boot. "/boot".neededForBoot = true; "/persist".neededForBoot = true; # Possibly not required "/home".neededForBoot = true; }; }