{ 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.package = pkgs.zfs_unstable;

  # 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 || true
  '';

  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 status "$pool" ||
        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";
    };
  };
}