diff --git a/etc/Makefile.am b/etc/Makefile.am index 53064eb6f6ea..b4b3ae1f5798 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 000000000000..8c13ffb304b3 --- /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 000000000000..dced3d88b5c9 --- /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 000000000000..423fb448c16f --- /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 d9a7b4400301..ad0909a3b08d 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