From facdd63fe173b51c6d9de29ccc2167b0d7a45b6f Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 21 Jan 2023 23:03:00 +0100 Subject: syncoid/autosuspend: implement disk spindown mode --- roles/storage/zfs/syncoid/defaults/main.yml | 8 ++++- roles/storage/zfs/syncoid/tasks/main.yml | 10 ++++++- .../zfs/syncoid/templates/autosuspend.py.j2 | 34 +++++++++++++++++++--- .../zfs/syncoid/templates/autosuspend.service.j2 | 2 +- roles/storage/zfs/syncoid/templates/pull.timer.j2 | 2 +- .../zfs/syncoid/templates/syncoid_finalize.j2 | 2 +- 6 files changed, 49 insertions(+), 9 deletions(-) (limited to 'roles') diff --git a/roles/storage/zfs/syncoid/defaults/main.yml b/roles/storage/zfs/syncoid/defaults/main.yml index 1161423b..b0a9b5c1 100644 --- a/roles/storage/zfs/syncoid/defaults/main.yml +++ b/roles/storage/zfs/syncoid/defaults/main.yml @@ -1,5 +1,11 @@ --- -zfs_syncoid_autosuspend: no +# zfs_syncoid_autosuspend: system + +# zfs_syncoid_autosuspend: disks +# zfs_syncoid_autosuspend_disks: +# - /dev/sda +# - /dev/sdb + # zfs_syncoid_target_pool: target diff --git a/roles/storage/zfs/syncoid/tasks/main.yml b/roles/storage/zfs/syncoid/tasks/main.yml index 6b3e227e..939dc110 100644 --- a/roles/storage/zfs/syncoid/tasks/main.yml +++ b/roles/storage/zfs/syncoid/tasks/main.yml @@ -71,14 +71,22 @@ enabled: yes - name: enable autosuspend - when: zfs_syncoid_autosuspend + when: zfs_syncoid_autosuspend is defined block: + - name: install hdparm package + when: zfs_syncoid_autosuspend == 'disks' + apt: + name: hdparm + state: present + - name: create systemd override directory for sanoid timer + when: zfs_syncoid_autosuspend == 'system' file: path: /etc/systemd/system/sanoid.timer.d state: directory - name: disable persistence of sanoid timer + when: zfs_syncoid_autosuspend == 'system' copy: content: | [Timer] diff --git a/roles/storage/zfs/syncoid/templates/autosuspend.py.j2 b/roles/storage/zfs/syncoid/templates/autosuspend.py.j2 index a6217ca0..9dc9bc52 100644 --- a/roles/storage/zfs/syncoid/templates/autosuspend.py.j2 +++ b/roles/storage/zfs/syncoid/templates/autosuspend.py.j2 @@ -119,12 +119,38 @@ class AutoSuspender(object): except dbus.exceptions.DBusException as error: print("ERR: %s" % error) + def spindown_disks(self, disks): + subprocess.run(["hdparm", "-y"] + disks) + + +def print_usage(): + print("usage: %s (system|disks) [ /dev/sda [ /dev/sdb [ ... ]]] " % sys.argv[0]) + if __name__ == "__main__": + if len(sys.argv) < 2: + print_usage() + sys.exit(1) + mode = sys.argv[1] + disks = [] + if mode not in ["system", "disks"]: + print_usage() + sys.exit(1) + if mode == "disks": + if len(sys.argv) < 3: + print_usage() + sys.exit(1) + else: + disks = sys.argv[2:] + s = AutoSuspender() - print("checking if the system can be suspended:") + print("checking for suspend inhibitors:") if s.check(): - print("trying to suspend system") - s.suspend() + if mode == "system": + print("trying to suspend system") + s.suspend() + elif mode == "disks": + print("trying to spindown disks") + s.spindown_disks(disks) else: - print("not suspending system because at least one check failed.") + print("not suspending because at least one check failed.") diff --git a/roles/storage/zfs/syncoid/templates/autosuspend.service.j2 b/roles/storage/zfs/syncoid/templates/autosuspend.service.j2 index 28cff913..f88823ca 100644 --- a/roles/storage/zfs/syncoid/templates/autosuspend.service.j2 +++ b/roles/storage/zfs/syncoid/templates/autosuspend.service.j2 @@ -3,7 +3,7 @@ Description=automatic system suspender for syncoid-based backups [Service] Type=oneshot -ExecStart=/usr/local/bin/syncoid-autosuspend.py +ExecStart=/usr/local/bin/syncoid-autosuspend.py {{ zfs_syncoid_autosuspend }}{% if zfs_syncoid_autosuspend == 'disks' %} {{ zfs_syncoid_autosuspend_disks | join(' ') }}{% endif %}{{ '' }} NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict diff --git a/roles/storage/zfs/syncoid/templates/pull.timer.j2 b/roles/storage/zfs/syncoid/templates/pull.timer.j2 index bcbb1a28..c43c5b28 100644 --- a/roles/storage/zfs/syncoid/templates/pull.timer.j2 +++ b/roles/storage/zfs/syncoid/templates/pull.timer.j2 @@ -4,7 +4,7 @@ Description=syncoid-based backup for {{ item.key }} [Timer] OnCalendar={{ item.value.periodic.schedule }} AccuracySec=10s -WakeSystem={{ zfs_syncoid_autosuspend | ternary('true', 'false') }} +WakeSystem={{ (zfs_syncoid_autosuspend is defined and zfs_syncoid_autosuspend == 'system') | ternary('true', 'false') }} [Install] WantedBy=timers.target diff --git a/roles/storage/zfs/syncoid/templates/syncoid_finalize.j2 b/roles/storage/zfs/syncoid/templates/syncoid_finalize.j2 index 638781ac..05423880 100644 --- a/roles/storage/zfs/syncoid/templates/syncoid_finalize.j2 +++ b/roles/storage/zfs/syncoid/templates/syncoid_finalize.j2 @@ -1,5 +1,5 @@ #!/bin/bash -{% if zfs_syncoid_autosuspend %} +{% if zfs_syncoid_autosuspend is defined %} echo "running sanoid --prune to cleanup old snapshots" sleep 5 -- cgit v1.2.3