office: simple-scan: install
[julm/julm-nix.git] / nixos / profiles / zfs.nix
index a5c5560a32df7ce9f32e09c1da328049610da9e2..dff137f2fe193b6c9274f669e62b9af80e007747 100644 (file)
@@ -1,37 +1,83 @@
-{ pkgs, lib, config, hostName, ... }:
+{ pkgs, lib, hostName, ... }:
 {
-# 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" ];
-boot.initrd.supportedFilesystems = [ "zfs" ];
-boot.zfs.requestEncryptionCredentials = lib.mkDefault [ hostName ];
-
-# 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;
-
-# 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;
-
-environment.systemPackages = [
-  pkgs.syncoid
-];
+  # 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";
+    };
+  };
 }