125 lines
3.2 KiB
Nix
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;
|
|
};
|
|
}
|