use*_*ser 11 linux monitoring zfs
我想使用 cron 来安排我的 ZFS 池的定期清理,并在清理完成后的相当短的时间内,通过电子邮件将状态报告发送给我自己。这样做的目的是发现任何问题,而无需手动查找它们(推而不是拉)。
第一部分很简单:只需设置一个 cron 作业,以zpool scrub $POOL在我的特定情况下合理的时间间隔以 root身份运行。
第二部分,我不太确定该怎么做。zpool scrub立即返回,然后系统在后台运行清理(如果清理是由管理员从终端启动的,这当然是理想的行为)。zpool status给我一个状态报告并退出(在擦洗运行时退出代码为 0;它还没有完成,所以我不知道退出状态在完成后是否会改变,但我对此表示怀疑)。为 zpool-s清理记录的唯一参数是“停止清理”。
主要问题是检测从刷洗到完成刷洗的状态变化。鉴于此,其余的应该就位。
理想情况下,我想告诉zpool scrub在擦洗完成之前不要返回,但我看不出有任何方法可以做到这一点。(这会使简单的 cron 变得几乎太容易了zpool scrub --wait-until-done $POOL; zpool status $POOL。)
如果做不到这一点,我想询问系统当前是否正在进行清理,最好以不会因升级或配置更改而中断的方式冒太大风险,以便我可以根据之前是否正在运行擦洗已完成(通过在擦洗状态从擦洗变为未擦洗时执行 zpool 状态)。
这个特殊的设置是针对工作站系统的,所以虽然像 Nagios 这样的监控工具可能有可以解决这个问题的插件,但是仅仅为这个任务安装这样一个工具感觉有点过头了。有人可以建议解决该问题的技术含量较低的解决方案吗?
use*_*ser 13
在ZFS 在 Linux 上,从0.6.3 版开始,可以使用ZFS 事件守护程序 (zed)非常优雅地处理此问题。事件守护进程通过直接监视内核事件,几乎可以立即对发生的任何事件做出反应,并且不依赖于对其他命令输出的连续轮询和解析。
使用以/etc/zfs/zed.d/scrub.finish(例如,scrub.finish-custom.sh)开头的任何文件名创建一个 shell 脚本。该脚本可以执行任何适当的操作,例如发送电子邮件、在某处写入日志条目或让系统唱歌跳舞(好吧,也许不是那样)。提供的示例可以提供一个起点。
如果您只想在清理完成时收到一封电子邮件,那么提供的scrub.finish-email.sh脚本就可以很好地做到这一点。只需编辑 /etc/zfs/zed.d/zed.rc 以指示应将电子邮件发送到何处以及是否应在池未遇到任何问题的情况下发送电子邮件,请确保命名scrub.finish后跟 /etc 中的任何内容/zfs/zed.d 指向它,并确保 zed 在启动时启动。
虽然这个问题是特定于Linux的,但它是搜索“等待清理完成”时的第一个谷歌结果,因此我想为运行OpenSolaris的人添加一些有用的信息(在OmniOS上测试过,但在SmartOS、illumos等上测试过) .应该类似)而不是Linux(普通的Solaris也应该可以工作,但我没有在那里测试)。
您可以用来syseventadm注册内核事件。/usr/include/sys/sysevent/eventdefs.h完整列表可以在(只需在此文件中搜索“ZFS”)中找到。添加事件后,必须重新启动服务,例如:
syseventadm add -c EC_zfs -s ESC_ZFS_scrub_finish /path/to/script.sh \$pool_name
syseventadm restart
Run Code Online (Sandbox Code Playgroud)
这样,当任何池的清理完成时,脚本就会启动 - 您必须检查脚本内部是否$1等于您所需的池名称。尽管如此,它的开销比轮询要少得多。
| 归档时间: |
|
| 查看次数: |
9381 次 |
| 最近记录: |