ZFS - Scrub periódico con notificación vía ntfy

Scrub semanal de ZFS con systemd + notificación ntfy

Para automatizar un scrub de todos los pools ZFS cada domingo de madrugada, se usa un script y un timer systemd.

Guardar el script

Guardar en ~/dotfiles/sbin/zfs-scrub-all y dar permisos de ejecución:

chmod +x ~/dotfiles/sbin/zfs-scrub-all

Crear symlink en /usr/local/sbin para que lo use systemd:

sudo ln -s /ruta/dotfiles/sbin/zfs-scrub-all /usr/local/sbin/zfs-scrub-all

Unidad systemd

Archivo /etc/systemd/system/zfs-scrub.service:

[Unit]
Description=Run ZFS scrub on all pools and notify via ntfy
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
Environment=NTFY_URL=https://ntfy.sh/canal
ExecStart=/usr/local/sbin/zfs-scrub-all
Nice=10
IOSchedulingClass=best-effort
IOSchedulingPriority=7

Temporizados

Archivo /etc/systemd/system/zfs-scrub.timer:

[Unit]
Description=Weekly ZFS scrub (Sundays 03:30) with jitter

[Timer]
OnCalendar=Sun 03:30
RandomizedDelaySec=45m
Persistent=true

[Install]
WantedBy=timers.target

Activar

sudo systemctl daemon-reload
sudo systemctl enable --now zfs-scrub.timer

Verificar

systemctl list-timers | grep zfs-scrub
sudo systemctl start zfs-scrub.service   # prueba manual
journalctl -u zfs-scrub.service -n 50 --no-pager

El script zfs-scrub-all lanza scrubs en todos los pools, espera a que terminen y envía notificación al canal omv en ntfy.

Ejecutar de forma puntual

sudo systemd-run --on-calendar="03:30" --unit=zfs-scrub-once /usr/local/sbin/zfs-scrub-all

Eliminar temporizador

sudo systemctl stop zfs-scrub-once.timer
sudo systemctl disable zfs-scrub-once.timer
sudo systemctl reset-failed zfs-scrub-once.timer

Editar y volver a habilitar

Editamos el fichero /etc/systemd/system/zfs-scrub.timer

[Timer]
OnCalendar=Sun 01:00
RandomizedDelaySec=45m
Persistent=true

Recargamos y reactivamos

sudo systemctl daemon-reload
sudo systemctl enable --now zfs-scrub.timer