summaryrefslogtreecommitdiffstats
path: root/nixos/modules/tasks/filesystems
diff options
context:
space:
mode:
authorFranz Pletz <fpletz@fnordicwalking.de>2017-03-02 17:13:54 +0100
committerFranz Pletz <fpletz@fnordicwalking.de>2017-03-02 17:13:54 +0100
commit7566b36259f53ebcea925b85afe5d316d67c060c (patch)
tree47ad741aa01a5663c49563d0d2493cd9172f838e /nixos/modules/tasks/filesystems
parent98523861f67992a603e503c19b9642253fd7bfca (diff)
zfs.autoScrub service: init
Diffstat (limited to 'nixos/modules/tasks/filesystems')
-rw-r--r--nixos/modules/tasks/filesystems/zfs.nix63
1 files changed, 61 insertions, 2 deletions
diff --git a/nixos/modules/tasks/filesystems/zfs.nix b/nixos/modules/tasks/filesystems/zfs.nix
index 045cbeb7cff8..c8fa6c21a4f6 100644
--- a/nixos/modules/tasks/filesystems/zfs.nix
+++ b/nixos/modules/tasks/filesystems/zfs.nix
@@ -13,12 +13,14 @@ let
cfgZfs = config.boot.zfs;
cfgSnapshots = config.services.zfs.autoSnapshot;
cfgSnapFlags = cfgSnapshots.flags;
+ cfgScrub = config.services.zfs.autoScrub;
inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems;
inSystem = any (fs: fs == "zfs") config.boot.supportedFilesystems;
enableAutoSnapshots = cfgSnapshots.enable;
- enableZfs = inInitrd || inSystem || enableAutoSnapshots;
+ enableAutoScrub = cfgScrub.enable;
+ enableZfs = inInitrd || inSystem || enableAutoSnapshots || enableAutoScrub;
kernel = config.boot.kernelPackages;
@@ -217,6 +219,37 @@ in
'';
};
};
+
+ services.zfs.autoScrub = {
+ enable = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Enables periodic scrubbing of ZFS pools.
+ '';
+ };
+
+ interval = mkOption {
+ default = "Sun, 02:00";
+ type = types.str;
+ example = "daily";
+ description = ''
+ Systemd calendar expression when to scrub ZFS pools. See
+ <citerefentry><refentrytitle>systemd.time</refentrytitle>
+ <manvolnum>5</manvolnum></citerefentry>.
+ '';
+ };
+
+ pools = mkOption {
+ default = [];
+ type = types.listOf types.str;
+ example = [ "tank" ];
+ description = ''
+ List of ZFS pools to periodically scrub. If empty, all pools
+ will be scrubbed.
+ '';
+ };
+ };
};
###### implementation
@@ -282,7 +315,7 @@ in
zfsSupport = true;
};
- environment.etc."zfs/zed.d".source = "${packages.zfsUser}/etc/zfs/zed.d/*";
+ environment.etc."zfs/zed.d".source = "${packages.zfsUser}/etc/zfs/zed.d/";
system.fsPackages = [ packages.zfsUser ]; # XXX: needed? zfs doesn't have (need) a fsck
environment.systemPackages = [ packages.zfsUser ]
@@ -391,5 +424,31 @@ in
};
}) snapshotNames);
})
+
+ (mkIf enableAutoScrub {
+ systemd.services.zfs-scrub = {
+ description = "ZFS pools scrubbing";
+ after = [ "zfs-import.target" ];
+ serviceConfig = {
+ Type = "oneshot";
+ };
+ script = ''
+ ${packages.zfsUser}/bin/zpool scrub ${
+ if cfgScrub.pools != [] then
+ (concatStringsSep " " cfgScrub.pools)
+ else
+ "$(${packages.zfsUser}/bin/zpool list -H -o name)"
+ }
+ '';
+ };
+
+ systemd.timers.zfs-scrub = {
+ wantedBy = [ "timers.target" ];
+ timerConfig = {
+ OnCalendar = cfgScrub.interval;
+ Persistent = "yes";
+ };
+ };
+ })
];
}