From 482505fd4219a4c3a91f2857199436df27ad687e Mon Sep 17 00:00:00 2001 From: Julian Brunner Date: Sat, 11 Jun 2022 03:22:14 +0200 Subject: [PATCH] Add weekly and monthly systemd timers for trimming On machines using systemd, trim timers can be enabled on a per-pool basis. Weekly and monthly timer units are provided. Timers can be enabled as follows: systemctl enable zfs-trim-weekly@rpool.timer --now systemctl enable zfs-trim-monthly@datapool.timer --now Each timer will pull in zfs-trim@${poolname}.service, which is not schedule-specific. The manpage zpool-trim has been updated accordingly. Reviewed-by: Brian Behlendorf Signed-off-by: Julian Brunner Closes #13544 --- etc/Makefile.am | 3 +++ etc/systemd/system/zfs-trim-monthly@.timer.in | 12 +++++++++++ etc/systemd/system/zfs-trim-weekly@.timer.in | 12 +++++++++++ etc/systemd/system/zfs-trim@.service.in | 15 +++++++++++++ man/man8/zpool-trim.8 | 21 +++++++++++++++++++ 5 files changed, 63 insertions(+) create mode 100644 etc/systemd/system/zfs-trim-monthly@.timer.in create mode 100644 etc/systemd/system/zfs-trim-weekly@.timer.in create mode 100644 etc/systemd/system/zfs-trim@.service.in diff --git a/etc/Makefile.am b/etc/Makefile.am index 53064eb6f6..b4b3ae1f57 100644 --- a/etc/Makefile.am +++ b/etc/Makefile.am @@ -59,6 +59,9 @@ systemdunit_DATA = \ %D%/systemd/system/zfs-scrub-monthly@.timer \ %D%/systemd/system/zfs-scrub-weekly@.timer \ %D%/systemd/system/zfs-scrub@.service \ + %D%/systemd/system/zfs-trim-monthly@.timer \ + %D%/systemd/system/zfs-trim-weekly@.timer \ + %D%/systemd/system/zfs-trim@.service \ %D%/systemd/system/zfs-share.service \ %D%/systemd/system/zfs-volume-wait.service \ %D%/systemd/system/zfs-volumes.target \ diff --git a/etc/systemd/system/zfs-trim-monthly@.timer.in b/etc/systemd/system/zfs-trim-monthly@.timer.in new file mode 100644 index 0000000000..8c13ffb304 --- /dev/null +++ b/etc/systemd/system/zfs-trim-monthly@.timer.in @@ -0,0 +1,12 @@ +[Unit] +Description=Monthly zpool trim timer for %i +Documentation=man:zpool-trim(8) + +[Timer] +OnCalendar=monthly +Persistent=true +RandomizedDelaySec=1h +Unit=zfs-trim@%i.service + +[Install] +WantedBy=timers.target diff --git a/etc/systemd/system/zfs-trim-weekly@.timer.in b/etc/systemd/system/zfs-trim-weekly@.timer.in new file mode 100644 index 0000000000..dced3d88b5 --- /dev/null +++ b/etc/systemd/system/zfs-trim-weekly@.timer.in @@ -0,0 +1,12 @@ +[Unit] +Description=Weekly zpool trim timer for %i +Documentation=man:zpool-trim(8) + +[Timer] +OnCalendar=weekly +Persistent=true +RandomizedDelaySec=1h +Unit=zfs-trim@%i.service + +[Install] +WantedBy=timers.target diff --git a/etc/systemd/system/zfs-trim@.service.in b/etc/systemd/system/zfs-trim@.service.in new file mode 100644 index 0000000000..423fb448c1 --- /dev/null +++ b/etc/systemd/system/zfs-trim@.service.in @@ -0,0 +1,15 @@ +[Unit] +Description=zpool trim on %i +Documentation=man:zpool-trim(8) +Requires=zfs.target +After=zfs.target +ConditionACPower=true +ConditionPathIsDirectory=/sys/module/zfs + +[Service] +EnvironmentFile=-@initconfdir@/zfs +ExecStart=/bin/sh -c '\ +if @sbindir@/zpool status %i | grep -q "(trimming)"; then\ +exec @sbindir@/zpool wait -t trim %i;\ +else exec @sbindir@/zpool trim -w %i; fi' +ExecStop=-/bin/sh -c '@sbindir@/zpool trim -s %i 2>/dev/null || true' diff --git a/man/man8/zpool-trim.8 b/man/man8/zpool-trim.8 index d9a7b44003..ad0909a3b0 100644 --- a/man/man8/zpool-trim.8 +++ b/man/man8/zpool-trim.8 @@ -84,8 +84,29 @@ with no flags on the relevant target devices. .It Fl w , -wait Wait until the devices are done being trimmed before returning. .El +.Sh PERIODIC TRIM +On machines using systemd, trim timers can be enabled on a per-pool basis. +.Nm weekly +and +.Nm monthly +timer units are provided. +.Bl -tag -width Ds +.It Xo +.Xc +.Nm systemctl +.Cm enable +.Cm zfs-trim-\fIweekly\fB@\fIrpool\fB.timer +.Cm --now +.It Xo +.Xc +.Nm systemctl +.Cm enable +.Cm zfs-trim-\fImonthly\fB@\fIotherpool\fB.timer +.Cm --now +.El . .Sh SEE ALSO +.Xr systemd.timer 5 , .Xr zpoolprops 7 , .Xr zpool-initialize 8 , .Xr zpool-wait 8