universe/lib/disko.nix

126 lines
2.4 KiB
Nix

{ lib }:
let
inherit (builtins) mapAttrs removeAttrs;
inherit (lib) optionals flip genAttrs;
in
rec {
# Constants
defaultMountOptions = [
"defaults"
"noatime"
];
# Common
mkDisk = id: content: {
type = "disk";
device = "/dev/disk/by-id/${id}";
content = {
type = "gpt";
} // content;
};
mkESP' = mountOptions: size: mountpoint: {
inherit size;
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
inherit mountpoint mountOptions;
};
};
mkESP = mkESP' defaultMountOptions;
mkTmpfs' = mountOptions: size: mode: {
fsType = "tmpfs";
mountOptions = mountOptions ++ [
"size=${size}"
"mode=${mode}"
];
};
mkTmpfs = size: mkTmpfs' defaultMountOptions size "755";
# btrfs
mkBtrfsPart' =
base: mountpoint: content':
{
content = {
inherit mountpoint;
type = "btrfs";
} // content';
}
// base;
mkBtrfsPart = size: mkBtrfsPart' { inherit size; };
mkBtrfsPartEndAt = end: mkBtrfsPart' { inherit end; };
mkBtrfsSubvols' =
mountOptions:
mapAttrs (
n: v:
{
mountpoint = n;
mountOptions = mountOptions ++ (optionals (v ? mountOptions) v.mountOptions);
}
// (removeAttrs v [ "mountOptions" ])
);
mkBtrfsSubvols = mkBtrfsSubvols' defaultMountOptions;
# ZFS
mkZPart' =
base: content: pool:
{
content = {
type = "zfs";
inherit pool;
} // content;
}
// base;
mkZPart = size: mkZPart' { inherit size; } { };
mkZPartEndAt = end: mkZPart' { inherit end; } { };
mkZDisk =
id: pool:
mkDisk id {
partitions = {
zfs = mkZPart "100%" pool;
};
};
mkZPool' =
mountOptions: name: options:
{
type = "zpool";
mode = "raidz";
mountpoint = "/media/${name}";
rootFsOptions = {
mountpoint = "legacy";
compression = "zstd";
atime = "off";
};
inherit mountOptions;
}
// options;
mkZPool = mkZPool' defaultMountOptions;
mkZPools = mapAttrs mkZPool;
mkZfs' = mountOptions: mountpoint: options: {
type = "zfs_fs";
inherit mountpoint mountOptions;
options = {
mountpoint = "legacy";
} // options;
};
mkZfs = mkZfs' defaultMountOptions;
mkZvol = size: content: {
type = "zfs_volume";
inherit size content;
};
markNeededForBoot = flip genAttrs (_: {
neededForBoot = true;
});
}