通过 systemd 管理 ZFS 清理

tie*_*nou 6 zfs systemd ubuntu-16.04

我想在我的 ZFS 服务器上自动进行 zpool 清理。我已将以下 systemd 服务编写为/etc/systemd/system/zfs-scrub.service

[Unit]
Description=Scrub ZFS tank pool

[Service]
Type=simple
ExecStart=/bin/sh -c 'zpool scrub `zpool list -H -o name`'
RemainAfterExit=yes
ExecStop=/bin/sh -c 'zpool scrub -s `zpool list -H -o name`'
Run Code Online (Sandbox Code Playgroud)

以及计时器(如/etc/system.d/system/zfs-scrub.timer):

[Unit]
Description=Run zpool scrub every 1st Saturday

[Timer]
OnCalendar=Sat *-*-* 22:00:00
Run Code Online (Sandbox Code Playgroud)

几周前开始使用后,我检查了它是否正常运行。看来systemd仍然认为服务正在运行,所以计时器没有运行。

似乎没有ExecStatus,所以 systemd 不知道服务已完成。

  • 我错过了什么吗?我是否应该编写一个脚本来启动清理、greps zpool 状态行并捕获信号以在 systemd 发出信号时停止清理?
  • 是否可以写OnCalendar一行意思是“每月一次,仅在周末”?

air*_*uff 2

为了回答你的第二个问题,以下内容可以理解为在午夜过后一分钟运行每个月的前 7 天,但前提是当天也是星期日。因此,它应该在每个月的第一个星期日运行。

OnCalendar=Sun *-*-01..07 00:01:00
Run Code Online (Sandbox Code Playgroud)

关于您的第一个问题,查看期刊的内容会很有帮助,而不仅仅是通过 zpool status 命令确认它已运行。我注意到您的服务单元不需要 zfs.target。另外,我会将服务类型设置为“一次性”而不是“简单”。

编辑:这应该适合您,尽管您需要为每个池启动/启用:

对您的 zfs-scrub@.service 文件尝试以下操作:

[Unit]
Description=Scrub ZFS tank pool

[Service]
Type=oneshot
ExecStart=/bin/zpool scrub %i
Run Code Online (Sandbox Code Playgroud)

然后这对于您的 zfs-scrub@.timer 文件:

[Unit]
Description=Run zpool scrub every 1st Saturday

[Timer]
OnCalendar=Sun *-*-01..07 00:01:00 
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过计时器启动服务:

systemctl start zfs-scrub@[pool name].timer
systemctl enable zfs-scrub@[pool name].timer
Run Code Online (Sandbox Code Playgroud)

  • OpenZFS 2.0 引入了一个参数“-w”来使“zpool scrap”在前台运行。 (3认同)