From 2300621dc7450adccf86ddbf397c72f8e5e2d76c Mon Sep 17 00:00:00 2001 From: Georgy Yakovlev <168902+gyakovlev@users.noreply.github.com> Date: Thu, 16 Dec 2021 11:47:22 -0800 Subject: [PATCH] systemd: add weekly and monthly scrub timers Timers can be enabled as follows: systemctl enable zfs-scrub-weekly@rpool.timer --now systemctl enable zfs-scrub-monthly@datapool.timer --now Each timer will pull in zfs-scrub@${poolname}.service, which is not schedule-specific. Added PERIODIC SCRUB section to zpool-scrub.8. Reviewed-by: Richard Laager Reviewed-by: Brian Behlendorf Signed-off-by: Georgy Yakovlev Closes #12193 --- etc/systemd/system/.gitignore | 1 + etc/systemd/system/Makefile.am | 5 ++++- .../system/zfs-scrub-monthly@.timer.in | 12 +++++++++++ etc/systemd/system/zfs-scrub-weekly@.timer.in | 12 +++++++++++ etc/systemd/system/zfs-scrub@.service.in | 14 +++++++++++++ man/man8/zpool-scrub.8 | 21 +++++++++++++++++++ 6 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 etc/systemd/system/zfs-scrub-monthly@.timer.in create mode 100644 etc/systemd/system/zfs-scrub-weekly@.timer.in create mode 100644 etc/systemd/system/zfs-scrub@.service.in diff --git a/etc/systemd/system/.gitignore b/etc/systemd/system/.gitignore index efada54ad932..4813c65a25a8 100644 --- a/etc/systemd/system/.gitignore +++ b/etc/systemd/system/.gitignore @@ -1,3 +1,4 @@ *.service *.target *.preset +*.timer diff --git a/etc/systemd/system/Makefile.am b/etc/systemd/system/Makefile.am index c374a52ac7db..5e65e1db420c 100644 --- a/etc/systemd/system/Makefile.am +++ b/etc/systemd/system/Makefile.am @@ -12,7 +12,10 @@ systemdunit_DATA = \ zfs-volume-wait.service \ zfs-import.target \ zfs-volumes.target \ - zfs.target + zfs.target \ + zfs-scrub-monthly@.timer \ + zfs-scrub-weekly@.timer \ + zfs-scrub@.service SUBSTFILES += $(systemdpreset_DATA) $(systemdunit_DATA) diff --git a/etc/systemd/system/zfs-scrub-monthly@.timer.in b/etc/systemd/system/zfs-scrub-monthly@.timer.in new file mode 100644 index 000000000000..903068468278 --- /dev/null +++ b/etc/systemd/system/zfs-scrub-monthly@.timer.in @@ -0,0 +1,12 @@ +[Unit] +Description=Monthly zpool scrub timer for %i +Documentation=man:zpool-scrub(8) + +[Timer] +OnCalendar=monthly +Persistent=true +RandomizedDelaySec=1h +Unit=zfs-scrub@%i.service + +[Install] +WantedBy=timers.target diff --git a/etc/systemd/system/zfs-scrub-weekly@.timer.in b/etc/systemd/system/zfs-scrub-weekly@.timer.in new file mode 100644 index 000000000000..ede699500599 --- /dev/null +++ b/etc/systemd/system/zfs-scrub-weekly@.timer.in @@ -0,0 +1,12 @@ +[Unit] +Description=Weekly zpool scrub timer for %i +Documentation=man:zpool-scrub(8) + +[Timer] +OnCalendar=weekly +Persistent=true +RandomizedDelaySec=1h +Unit=zfs-scrub@%i.service + +[Install] +WantedBy=timers.target diff --git a/etc/systemd/system/zfs-scrub@.service.in b/etc/systemd/system/zfs-scrub@.service.in new file mode 100644 index 000000000000..bebe91d746ae --- /dev/null +++ b/etc/systemd/system/zfs-scrub@.service.in @@ -0,0 +1,14 @@ +[Unit] +Description=zpool scrub on %i +Documentation=man:zpool-scrub(8) +Requires=zfs.target +After=zfs.target +ConditionACPower=true +ConditionPathIsDirectory=/sys/module/zfs + +[Service] +ExecStart=/bin/sh -c '\ +if @sbindir@/zpool status %i | grep "scrub in progress"; then\ +exec @sbindir@/zpool wait -t scrub %i;\ +else exec @sbindir@/zpool scrub -w %i; fi' +ExecStop=-/bin/sh -c '@sbindir@/zpool scrub -p %i 2>/dev/null || true' diff --git a/man/man8/zpool-scrub.8 b/man/man8/zpool-scrub.8 index 768f71539290..69ae825b6158 100644 --- a/man/man8/zpool-scrub.8 +++ b/man/man8/zpool-scrub.8 @@ -116,8 +116,29 @@ scanned at 100M/s, and 68.4M of that file data has been scrubbed sequentially at 10.0M/s. .El .El +.Sh PERIODIC SCRUB +On machines using systemd, scrub timers can be enabled on 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-scrub-\fIweekly\fB@\fIrpool\fB.timer +.Cm --now +.It Xo +.Xc +.Nm systemctl +.Cm enable +.Cm zfs-scrub-\fImonthly\fB@\fIotherpool\fB.timer +.Cm --now +.El . .Sh SEE ALSO +.Xr systemd.timer 5 , .Xr zpool-iostat 8 , .Xr zpool-resilver 8 , .Xr zpool-status 8