nix: strip down essential profile
[julm/julm-nix.git] / nixos / profiles / zfs.nix
index 062ffdd255cffef4bce0feb0d51fb6125164ae56..cfad16850abe10a9b840a8a6ba8ccfc9887d433f 100644 (file)
   # 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 ];
+  boot.zfs.requestEncryptionCredentials = lib.mkDefault [ "${hostName}/root" ];
 
   boot.zfs.enableUnstable = false;
 
   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";
+    };
+  };
 }