From 1d86714a2b6a9737104a06a27b7564c2c775c6ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Wed, 24 Jul 2019 13:41:22 +0100 Subject: [PATCH] nixos/zfs: add trim service Introduces a trim timer similar to the fstrim service. According to zpool(8) for consumer hardware periodic manual TRIM is preferred over automatic TRIM that ZFS implements. The period of one week is based on recommendations of fstrim. --- nixos/modules/tasks/filesystems/zfs.nix | 39 ++++++++++++++++++++----- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/nixos/modules/tasks/filesystems/zfs.nix b/nixos/modules/tasks/filesystems/zfs.nix index f7f07bad9522..ac06b6caee30 100644 --- a/nixos/modules/tasks/filesystems/zfs.nix +++ b/nixos/modules/tasks/filesystems/zfs.nix @@ -1,8 +1,6 @@ { config, lib, pkgs, utils, ... }: # -# todo: -# - crontab for scrubs, etc -# - zfs tunables +# TODO: zfs tunables with utils; with lib; @@ -13,6 +11,7 @@ let cfgSnapshots = config.services.zfs.autoSnapshot; cfgSnapFlags = cfgSnapshots.flags; cfgScrub = config.services.zfs.autoScrub; + cfgTrim = config.services.zfs.trim; inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems; inSystem = any (fs: fs == "zfs") config.boot.supportedFilesystems; @@ -268,14 +267,26 @@ in }; }; - services.zfs.autoScrub = { - enable = mkOption { - default = false; - type = types.bool; + services.zfs.trim = { + enable = mkEnableOption "Enables periodic TRIM on all ZFS pools."; + + interval = mkOption { + default = "weekly"; + type = types.str; + example = "daily"; description = '' - Enables periodic scrubbing of ZFS pools. + How often we run trim. For most desktop and server systems + a sufficient trimming frequency is once a week. + + The format is described in + systemd.time + 7. ''; }; + }; + + services.zfs.autoScrub = { + enable = mkEnableOption "Enables periodic scrubbing of ZFS pools."; interval = mkOption { default = "Sun, 02:00"; @@ -535,5 +546,17 @@ in }; }; }) + + (mkIf cfgTrim.enable { + systemd.services.zpool-trim = { + description = "ZFS pools trim"; + after = [ "zfs-import.target" ]; + path = [ packages.zfsUser ]; + startAt = cfgTrim.interval; + script = '' + zpool list -H -o name | xargs -n1 zpool trim + ''; + }; + }) ]; }