126 lines
2.4 KiB
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;
|
|
});
|
|
}
|