58 lines
1.4 KiB
Nix
58 lines
1.4 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
...
|
|
}:
|
|
# Imports existing ZFS pools that hold durable service state.
|
|
let
|
|
cfg = config.modules.host.zfs; # NOLINT(let_order)
|
|
in
|
|
{
|
|
options.modules.host.zfs = {
|
|
enable = lib.mkEnableOption "ZFS pool imports for durable service state";
|
|
|
|
pools = lib.mkOption {
|
|
type = lib.types.attrsOf (lib.types.attrsOf lib.types.path);
|
|
default = { };
|
|
example = lib.literalExpression ''
|
|
{
|
|
tank = {
|
|
media = "/srv/media";
|
|
downloads = "/srv/downloads";
|
|
};
|
|
}
|
|
'';
|
|
description = ''
|
|
Lists pools that NixOS imports at boot.
|
|
Maps each dataset name to its mount point.
|
|
NixOS does not create or destroy these pools during rebuilds.
|
|
An empty map imports the pool without declaring file systems.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
boot.supportedFilesystems = [ "zfs" ];
|
|
|
|
# This module derives a stable host ID from the configured hostname.
|
|
networking.hostId = builtins.substring 0 8 (
|
|
builtins.hashString "sha256" config.networking.hostName
|
|
);
|
|
|
|
boot.zfs.extraPools = lib.attrNames cfg.pools;
|
|
|
|
fileSystems = lib.mkMerge (
|
|
lib.mapAttrsToList (
|
|
pool: mounts:
|
|
lib.mapAttrs' (
|
|
dataset: mountpoint:
|
|
lib.nameValuePair mountpoint {
|
|
device = "${pool}/${dataset}";
|
|
fsType = "zfs";
|
|
}
|
|
) mounts
|
|
) cfg.pools
|
|
);
|
|
};
|
|
}
|