【问题标题】:Managing ZFS scrub via systemd通过 systemd 管理 ZFS 清理
【发布时间】:2017-05-08 01:27:26
【问题描述】:

我想在我的 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`'

还有一个计时器(如/etc/system.d/system/zfs-scrub.timer):

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

[Timer]
OnCalendar=Sat *-*-* 22:00:00

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

好像没有ExecStatus,所以systemd不知道服务完成了。

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

【问题讨论】:

    标签: ubuntu-16.04 systemd zfs


    【解决方案1】:

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

    OnCalendar=Sun *-*-01..07 00:01:00
    

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

    编辑:这应该对你有用,尽管你需要为每个池启动/启用:

    为你的 zfs-scrub@.service 文件试试这个:

    [Unit]
    Description=Scrub ZFS tank pool
    
    [Service]
    Type=oneshot
    ExecStart=/bin/zpool scrub %i
    

    然后为您的 zfs-scrub@.timer 文件:

    [Unit]
    Description=Run zpool scrub every 1st Saturday
    
    [Timer]
    OnCalendar=Sun *-*-01..07 00:01:00 
    

    然后您将通过计时器启动服务:

    systemctl start zfs-scrub@[pool name].timer
    systemctl enable zfs-scrub@[pool name].timer
    

    【讨论】:

    • 我选择了simple 而不是oneshot,因为 zpool scrub 不会留下来(它只会触发清理并退出)。问题是当您触发清理时没有文本报告(可能是退出代码,但我没有检查过),除了不时获取 zpool 状态以获取状态/进度,而且我不想编写包装器.
    • 我明白你的意思。对于它的价值,我上面显示的几乎就是我在服务器和主工作站上使用的东西(尽管我修改了计时器以满足您的要求)。我没有遇到任何问题,虽然我不知道如何通过zpool status 以外的方式获得磨砂的进度。
    猜你喜欢
    • 2019-02-22
    • 2021-08-19
    • 2012-08-21
    • 2011-09-11
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多