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.
This commit is contained in:
Jörg Thalheim 2019-07-24 13:41:22 +01:00
parent ffabf51767
commit 1d86714a2b
No known key found for this signature in database
GPG Key ID: B3F5D81B0C6967C4

View File

@ -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
<citerefentry><refentrytitle>systemd.time</refentrytitle>
<manvolnum>7</manvolnum></citerefentry>.
'';
};
};
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
'';
};
})
];
}