{ pkgs, lib, config, ... }: { # none is the recommended elevator with ZFS (which has its own I/O scheduler) # and/or for SSD, whereas HDD could use mq-deadline. services.udev.extraRules = '' # set none scheduler for non-rotating disks ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none" ACTION=="add|change", KERNEL=="nvme[0-9]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none" ''; boot.supportedFilesystems = [ "zfs" ]; # Using ZFS together with hibernation (suspend to disk) # may cause filesystem corruption. # See https://github.com/openzfs/zfs/issues/260 boot.kernelParams = [ "nohibernate" ]; # Ensure extra safeguards are active that zfs uses to protect zfs pools. boot.zfs.forceImportAll = false; boot.zfs.forceImportRoot = false; boot.zfs.enableUnstable = false; # Can be overrided with a list of specific datasets boot.zfs.requestEncryptionCredentials = lib.mkDefault true; # Enables periodic scrubbing of ZFS pools. services.zfs.autoScrub.enable = true; # According to zpool(8), for consumer hardware # periodic manual TRIM is preferred over the automatic TRIM # that ZFS implements. services.zfs.trim.enable = true; # Add tools useful with zfs send/receive environment.systemPackages = [ pkgs.lzop pkgs.mbuffer ]; }