{ config, lib, pkgs, ... }: let cfg = config.soispha.disks; defaultMountOptions = [ "compress-force=zstd:15" # This saves disk space, at a performance cost "noatime" # should have some performance upsides, and I don't use it anyways "lazytime" # make time changes in memory ]; in { options.soispha.disks = { enable = lib.mkEnableOption "disk setup with disko"; disk = lib.mkOption { type = lib.types.path; example = lib.literalExpression "/dev/disk/by-uuid/0442cb6d-f13a-4635-b487-fa76189774c5"; description = lib.mdDoc "The disk used for installing the OS"; }; ssd = lib.mkOption { type = lib.types.bool; example = lib.literalExpression "true"; default = false; description = lib.mdDoc "Enable ssd specific improvements, like trim"; }; swap = { uuid = lib.mkOption { type = lib.types.str; example = lib.literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89"; description = lib.mdDoc "The uuid of the swapfile"; }; resumeOffset = lib.mkOption { type = lib.types.str; example = lib.literalExpression "134324224"; description = lib.mdDoc "The resume offset of the swapfile"; }; }; }; config = lib.mkIf cfg.enable { systemd = lib.recursiveUpdate (import ./hibernate.nix {inherit pkgs;}) (import ./fstrim.nix {inherit pkgs lib cfg;}); disko.devices = { disk = { main = { device = cfg.disk; content = { type = "gpt"; partitions = { root = { size = "100%"; name = "root"; content = { type = "luks"; name = "nixos"; extraOpenArgs = ["--allow-discards"]; content = { type = "btrfs"; extraArgs = ["-f" "--label nixos"]; # Override existing partitions subvolumes = { "nix" = { mountpoint = "/nix"; mountOptions = defaultMountOptions; }; "persistent-storage" = { mountpoint = "/srv"; mountOptions = defaultMountOptions; }; "persistent-storage@snapshots" = { mountpoint = "/srv/.snapshots"; mountOptions = defaultMountOptions; }; "swap" = { mountpoint = "/swap"; mountOptions = defaultMountOptions; }; }; }; }; }; boot = { type = "EF00"; size = "512M"; name = "boot"; content = { type = "filesystem"; format = "vfat"; mountpoint = "/efi"; }; }; }; }; }; }; nodev = { "/" = { fsType = "tmpfs"; mountOptions = ["defaults" "size=4G" "mode=755"]; }; "/tmp" = { fsType = "tmpfs"; mountOptions = ["defaults" "size=16G" "mode=755"]; }; }; }; fileSystems = { "/srv" = { neededForBoot = true; }; "/swap" = { neededForBoot = true; }; }; swapDevices = [ #{ # device = "/swap/swapfile"; # priority = 1; # lower than zramSwap, just in case # # size = 2048; # TODO: can nixos create a btrfs swapfile correctly? #} ]; zramSwap = { enable = true; priority = 10; # needs to be higher than hardware-swap }; boot = { kernelParams = [ "resume_offset=${cfg.swap.resumeOffset}" "zswap.enabled=0" # zswap and zram are not really compatible ]; resumeDevice = "/dev/disk/by-uuid/${cfg.swap.uuid}"; }; }; }