1 { pkgs, lib, config, hostName, ... }:
6 extraArgs = [ "--verbose" ];
28 # Tigger backups when disks are plugged
29 services.udev.extraRules = ''
30 ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*", ATTRS{size}=="1953525168", ENV{SYSTEMD_WANTS}+="zfs-usb-backup@WD10JPVT.service"
32 systemd.services."zfs-usb@" = {
33 description = "ZFS over USB: %I";
35 #ConditionPathExists = [ "/dev/disk/by-label/%I" ];
39 RemainAfterExit = true;
42 # Scan the zpools, using stable paths
43 "/run/booted-system/sw/bin/zpool import -d /dev/disk/by-id/"
47 "/bin/sh -xc '/run/booted-system/sw/bin/zpool import -lFd /dev/disk/by-id/ %I || /run/booted-system/sw/bin/zpool reopen %I || /run/booted-system/sw/bin/zpool clear -nFX %I'";
50 systemd.services."zfs-usb-backup@" = {
51 description = "ZFS backup over USB: %I";
52 after = [ "zfs-usb@%i.service" ];
53 wants = [ "zfs-usb@%i.service" ];
56 RemainAfterExit = true;
58 CacheDirectory = [ "zfs-usb-backup-%I" ];
59 RuntimeDirectory = [ "zfs-usb-backup-%I" ];
63 "+/run/booted-system/sw/bin/zfs allow ${User} bookmark,hold,mount,send ${hostName}/home"
64 "+/run/booted-system/sw/bin/zfs allow ${User} bookmark,hold,mount,send ${hostName}/var"
65 "+/run/booted-system/sw/bin/zfs allow ${User} bookmark,create,destroy,load-key,mount,mountpoint,receive,rollback,snapshot %I/${User}"
67 ExecStart = pkgs.writeShellScript "zfs-usb-backup" ''
70 install -D -m 444 /dev/stdin /tmp/sanoid/sanoid.conf <<EOF
75 process_children_only=false
77 [$DESTPOOL/${User}/backup/${hostName}/home/work]
83 ${pkgs.sanoid}/bin/sanoid \
84 --cache-dir /var/cache/zfs-usb-backup-"$DESTPOOL" \
85 --configdir /tmp/sanoid \
87 --run-dir /run/zfs-usb-backup-"$DESTPOOL" \
90 for dataset in ${hostName}/home; do
91 ${pkgs.sanoid}/bin/syncoid \
93 --exclude "home/room" \
95 --no-privilege-elevation \
102 "$DESTPOOL"/${User}/backup/"$dataset"
105 # Scrub the zpool (in the background)
106 ExecStartPost = "+/run/booted-system/sw/bin/zpool scrub %I";