Merge pull request #70601 from Mic92/zfs-trim

nixos/zfs: only enable trim if zfs is enabled
This commit is contained in:
Jörg Thalheim 2019-10-14 11:04:35 +01:00 committed by GitHub
commit d633ec9787
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 10 deletions

View File

@ -36,6 +36,19 @@
quirk in the boot menu. quirk in the boot menu.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
By default zfs pools will now be trimmed on a weekly basis.
Trimming is only done on supported devices (i.e. NVME or SSDs)
and should improve throughput and lifetime of these devices.
It is controlled by the <varname>services.zfs.trim.enable</varname> varname.
The zfs scrub service (<varname>services.zfs.autoScrub.enable</varname>)
and the zfs autosnapshot service (<varname>services.zfs.autoSnapshot.enable</varname>)
are now only enabled if zfs is set in <varname>config.boot.initrd.supportedFilesystems</varname> or
<varname>config.boot.supportedFilesystems</varname>. These lists will automatically contain
zfs as soon as any zfs mountpoint is configured in <varname>fileSystems</varname>.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>

View File

@ -16,9 +16,7 @@ let
inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems; inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems;
inSystem = any (fs: fs == "zfs") config.boot.supportedFilesystems; inSystem = any (fs: fs == "zfs") config.boot.supportedFilesystems;
enableAutoSnapshots = cfgSnapshots.enable; enableZfs = inInitrd || inSystem;
enableAutoScrub = cfgScrub.enable;
enableZfs = inInitrd || inSystem || enableAutoSnapshots || enableAutoScrub;
kernel = config.boot.kernelPackages; kernel = config.boot.kernelPackages;
@ -395,7 +393,7 @@ in
system.fsPackages = [ packages.zfsUser ]; # XXX: needed? zfs doesn't have (need) a fsck system.fsPackages = [ packages.zfsUser ]; # XXX: needed? zfs doesn't have (need) a fsck
environment.systemPackages = [ packages.zfsUser ] environment.systemPackages = [ packages.zfsUser ]
++ optional enableAutoSnapshots autosnapPkg; # so the user can run the command to see flags ++ optional cfgSnapshots.enable autosnapPkg; # so the user can run the command to see flags
services.udev.packages = [ packages.zfsUser ]; # to hook zvol naming, etc. services.udev.packages = [ packages.zfsUser ]; # to hook zvol naming, etc.
systemd.packages = [ packages.zfsUser ]; systemd.packages = [ packages.zfsUser ];
@ -487,7 +485,7 @@ in
systemd.targets.zfs.wantedBy = [ "multi-user.target" ]; systemd.targets.zfs.wantedBy = [ "multi-user.target" ];
}) })
(mkIf enableAutoSnapshots { (mkIf (enableZfs && cfgSnapshots.enable) {
systemd.services = let systemd.services = let
descr = name: if name == "frequent" then "15 mins" descr = name: if name == "frequent" then "15 mins"
else if name == "hourly" then "hour" else if name == "hourly" then "hour"
@ -525,7 +523,7 @@ in
}) snapshotNames); }) snapshotNames);
}) })
(mkIf enableAutoScrub { (mkIf (enableZfs && cfgScrub.enable) {
systemd.services.zfs-scrub = { systemd.services.zfs-scrub = {
description = "ZFS pools scrubbing"; description = "ZFS pools scrubbing";
after = [ "zfs-import.target" ]; after = [ "zfs-import.target" ];
@ -552,15 +550,13 @@ in
}; };
}) })
(mkIf cfgTrim.enable { (mkIf (enableZfs && cfgTrim.enable) {
systemd.services.zpool-trim = { systemd.services.zpool-trim = {
description = "ZFS pools trim"; description = "ZFS pools trim";
after = [ "zfs-import.target" ]; after = [ "zfs-import.target" ];
path = [ packages.zfsUser ]; path = [ packages.zfsUser ];
startAt = cfgTrim.interval; startAt = cfgTrim.interval;
script = '' serviceConfig.ExecStart = "${pkgs.runtimeShell} -c 'zpool list -H -o name | xargs --no-run-if-empty -n1 zpool trim'";
zpool list -H -o name | xargs -n1 zpool trim
'';
}; };
}) })
]; ];