nixos/global/fs/zfs/default.nix
2025-01-13 11:52:09 +08:00

125 lines
3.2 KiB
Nix

{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.global.fs;
in
{
imports = [
./alert.nix
./split.nix
./replication.nix
];
# -o ashift=12
# -O encryption=on -O keyformat=passphrase -O keylocation=prompt
# -O compression=on -O mountpoint=none -O xattr=sa -O acltype=posixacl
options.global.fs.zfs = {
alert = {
zed = mkEnableOption "zfs event alerts" // {
default = true;
};
swraid = mkEnableOption "software raid alerts" // {
default = true;
};
secret = mkOption {
type = with types; nullOr str;
default = null;
description = "path to alert secrets";
};
};
persist = mkOption {
type = with types; str;
default = cfg.store;
description = ''
pool for persist dataset
defaults to nix store dataset
'';
};
mountpoints = mkOption {
type = with types; attrsOf str;
description = "zfs dataset mountpoints";
};
externalStore = mkEnableOption "external nix store filesystem";
split = {
enable = mkEnableOption "zfs state with split nix store";
mdProg = mkOption {
type = with types; str;
default = "/usr/bin/true";
description = "mdadm PROGRAM config value";
};
secret = mkOption {
type = with types; str;
description = "UUID of secret filesystem";
};
store = mkOption {
type = with types; str;
description = "UUID of store filesystem";
};
};
replication = {
enable = mkEnableOption "zfs replication to remote";
remote = mkOption {
type = with types; str;
description = "remote host as replication destination";
};
port = mkOption {
type = with types; port;
description = "ssh port of replication target";
default = 22;
};
datasets = mkOption {
type = with types; listOf str;
default = [
"persist"
"service"
"storage"
];
description = "list of filesystems to perform replication for";
};
sendOptions = mkOption {
type = with types; str;
default = "w";
description = "send options for all datasets";
};
};
};
config = mkIf (cfg.type == "zfs") {
fileSystems =
(mapAttrs (path: dataset: {
device = "${cfg.zfs.persist}/${dataset}";
fsType = "zfs";
options = [ "zfsutil" ];
# required by impermanence
neededForBoot = true;
}) cfg.zfs.mountpoints)
// {
"/nix" = (
if !cfg.zfs.externalStore then
{
device = "${cfg.store}/nix";
fsType = "zfs";
}
else
{ inherit (cfg.external) device fsType options; }
);
};
global.fs.zfs.mountpoints."/nix/persist" = "persist";
services.zfs.trim.enable = true;
services.zfs.autoSnapshot.enable = true;
services.zfs.autoScrub.enable = true;
boot.zfs.devNodes = mkDefault "/dev/disk/by-partuuid";
#boot.kernelPackages = mkDefault config.boot.zfs.package.latestCompatibleLinuxPackages;
global.kernel.lts = mkDefault true;
};
}