{ pkgs, lib, hostName, ... }: { # none is the recommended elevator with ZFS (which has its own I/O scheduler) services.udev.extraRules = '' ACTION=="add|change", KERNEL=="sd[a-z]*[0-9]*|mmcblk[0-9]*p[0-9]*|nvme[0-9]*n[0-9]*p[0-9]*", ENV{ID_FS_TYPE}=="zfs_member", ATTR{../queue/scheduler}="none" ''; boot.supportedFilesystems = [ "zfs" ]; boot.initrd.supportedFilesystems = [ "zfs" ]; boot.kernelParams = [ # Disabled because the zfs kernel module is not signed "module.sig_enforce=0" ]; # Using ZFS together with hibernation (suspend to disk) # may cause filesystem corruption. # See https://github.com/openzfs/zfs/issues/260 boot.zfs.allowHibernation = false; # Stable enough, clearer, and faster than the default /dev/disk/by-id boot.zfs.devNodes = "/dev/disk/by-partlabel"; # Not useful so far. # See also https://github.com/NixOS/nixpkgs/issues/62644#issuecomment-1479523469 boot.zfs.forceImportAll = false; # More resilient for remote hosts, # though it may call zpool clear. boot.zfs.forceImportRoot = true; boot.zfs.requestEncryptionCredentials = lib.mkDefault [ "${hostName}/root" ]; boot.zfs.enableUnstable = false; # Enables periodic scrubbing of ZFS pools. services.zfs.autoScrub.enable = true; services.zfs.autoScrub.interval = "Sun *-*-08..14 00:15:00"; # According to zpool(8), for consumer hardware # periodic manual TRIM is preferred over the automatic TRIM # that ZFS implements. services.zfs.trim.enable = true; services.zfs.trim.interval = "Sun *-*-01..07 00:15:00"; # Hide ZFS mountpoints from gio, hence nautilus or caja systemd.services.zfs-mount.postStart = '' /run/wrappers/bin/mount -t zfs | cut -f 1 -d ' ' | xargs -n 1 -r -t /run/wrappers/bin/mount -o remount,x-gvfs-hide ''; environment.systemPackages = [ pkgs.lzop # For remote syncoid pkgs.mbuffer # For remote syncoid pkgs.sanoid ]; # Force zpool import, even if the disk has not been exported, # (ie. still imported onto another computer). systemd.services."zfs-import@" = { description = "ZFS import pool: %I"; unitConfig = { ConditionPathIsDirectory = "/sys/module/zfs"; StartLimitIntervalSec = 0; }; after = [ "systemd-modules-load.service" ]; path = lib.mkBefore [ "/run/booted-system/sw" ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; PrivateTmp = true; SyslogIdentifier = "zfs-import@%i"; Restart = "no"; ExecStart = pkgs.writeShellScript "zfs-import" '' pool="$1" set -eux zpool import -lFd /dev/disk/by-id/ -o cachefile=none "$pool" || zpool reopen "$pool" || zpool import -lfd /dev/disk/by-id/ -o cachefile=none "$pool" || zpool clear -nFX "$pool" ${pkgs.systemd}/bin/systemctl restart zfs-mount.service '' + " %I"; }; }; }