From 015a8fa5d4c9e1a144b71e12a932227d545fbb17 Mon Sep 17 00:00:00 2001 From: Benoit S Date: Sat, 6 Feb 2021 17:03:07 +0900 Subject: [PATCH] Add zfs-scrub --- files/zfs-scrub.service | 11 +++++++++ files/zfs-scrub.timer | 10 +++++++++ group_data/all.py | 4 ++++ setup-zfs-and-lxd.py | 47 ++++++++++++++++++++++++++++++++++++++- templates/zfs-scrub.sh.j2 | 18 +++++++++++++++ 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 files/zfs-scrub.service create mode 100644 files/zfs-scrub.timer create mode 100644 templates/zfs-scrub.sh.j2 diff --git a/files/zfs-scrub.service b/files/zfs-scrub.service new file mode 100644 index 0000000..858574d --- /dev/null +++ b/files/zfs-scrub.service @@ -0,0 +1,11 @@ +[Unit] +Description=zpool scrub + +[Service] +Nice=19 +IOSchedulingClass=idle +KillSignal=SIGINT +ExecStart=/usr/local/bin/zfs-scrub.sh + +[Install] +WantedBy=multi-user.target diff --git a/files/zfs-scrub.timer b/files/zfs-scrub.timer new file mode 100644 index 0000000..a21a252 --- /dev/null +++ b/files/zfs-scrub.timer @@ -0,0 +1,10 @@ +[Unit] +Description=Monthly zpool scrub + +[Timer] +OnCalendar=monthly +RandomizedDelaySec=86400 +Persistent=true + +[Install] +WantedBy=multi-user.target diff --git a/group_data/all.py b/group_data/all.py index 656a154..14f96a0 100644 --- a/group_data/all.py +++ b/group_data/all.py @@ -11,3 +11,7 @@ borg_passphrase = b_borg_passphrase.decode('utf-8') b_borg_healthchecks = get_secret(b'1$2$AbHQ2WFelnJfIi5SjEtgAugd3xHSJDfikh0RBV3QY80=$Z0FBQUFBQmdGOWdKZnp1d3B0YUJUck9kOVNBVWxTRjJZZnpubUZmNmV0cmlCUm9kLUhYNndqWkhMOG5WQU44ZUVMQ2lEdW1jLUhSOTJub0VMZWFWdHBBb0JKdVptanNCQ2xyQXQ2cEdfMjBaUy00Y2dlcnJzc1ViaE5sQ0RUUS1idkViQ0hOOWdRWUlqZElQSlAzYmpjSUl5bjNuTDhDLTNBPT0=') borg_healthchecks = b_borg_healthchecks.decode('utf-8') + +b_zfs_healthchecks = get_secret(b'1$2$dsh3T6POjU9RvOqr_Itg1paAckP4K2cIRN8L22OsGVo=$Z0FBQUFBQmdIa21UYUtGeVdmLWNvbGhYUDNfNzdTd0gwN21ISHRTV3B6SDBrTFA4aTRCaF84bWY5UlhYV3RSOUxsekRyTVd4REhqczZTTW00WHhzSjJSV2JuNjZ5NXdGWmtrQjFkWjNNdmZYTm4xMXUxOHlYNlpJb0pGQmoyb0JTajRjanQwMHlEUzhUSTNjRFlXenBwdDRTMzA5c2NzeFJBPT0=') +zfs_healthchecks = b_zfs_healthchecks.decode('utf-8') + diff --git a/setup-zfs-and-lxd.py b/setup-zfs-and-lxd.py index 057083b..86e14cd 100644 --- a/setup-zfs-and-lxd.py +++ b/setup-zfs-and-lxd.py @@ -1,5 +1,5 @@ from pyinfra import host -from pyinfra.operations import server, files, systemd +from pyinfra.operations import server, files, systemd, apt SUDO = True @@ -19,6 +19,12 @@ SUDO = True # sdc 8:32 0 223.6G 0 disk # └─sdc1 8:33 0 24G 0 part +apt.packages( + name='Install packages', + packages=['zfsutils-linux'], + update=True, +) + if not host.fact.command('lsblk | grep sda4 || true'): server.shell( name='Create sda4 for zpool', @@ -92,3 +98,42 @@ if not host.fact.command('lxc storage volume list default | grep images || true' commands=['lxc storage volume create default images', 'lxc config set storage.images_volume default/images'] ) +files.template( + name='Push zfs-scrub script', + src='templates/zfs-scrub.sh.j2', + dest='/usr/local/bin/zfs-scrub.sh', + mode='700', + user='root', + group='root', +) + +files.put( + name='Push zfs-scrub timer', + src='files/zfs-scrub.timer', + dest='/etc/systemd/system/zfs-scrub.timer', + user='root', + group='root', + mode='644', +) + +files.put( + name='Push zfs-scrub service', + src='files/zfs-scrub.service', + dest='/etc/systemd/system/zfs-scrub.service', + user='root', + group='root', + mode='644', +) + +systemd.daemon_reload( + name='Reload systemd', + user_mode=False, +) + +systemd.service( + name='Enable zfs-scrub timer', + service='zfs-scrub.timer', + running=True, + enabled=True, +) + diff --git a/templates/zfs-scrub.sh.j2 b/templates/zfs-scrub.sh.j2 new file mode 100644 index 0000000..b91fb65 --- /dev/null +++ b/templates/zfs-scrub.sh.j2 @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# https://serverfault.com/questions/538978/how-to-run-a-command-once-a-zfs-scrub-completes +set -euo pipefail + +curl -m 10 --retry 5 {{ host.data.zfs_healthchecks }}/start +zpool scrub local +# wait until scrub is finished +while zpool status local | grep -q 'scan: *scrub in progress'; do + zpool status local + sleep 600 +done + +zpool status local + +# Get stdout from journalctl +LOG=$(journalctl -o cat -r -u zfs-scrub.service -n 100) +curl -fsS -m 10 --retry 5 --data-raw "$LOG" {{ host.data.zfs_healthchecks }} +exit 0