我以前(在这里)写过关于我们当前的Linux ZFS文件服务器是如何工作的,就像我们以前的OmniOS文件服务器一样。然而,Linux上的ZFS和传统的Solaris/OmniOS ZFS之间并不是所有的东西都是完全一样的。对我们来说,最受欢迎的区别之一是ZED,即ZFS事件守护进程。ZED所做的非常棒的是,它提供了一种非常简单的方式来在ZFS事件发生时采取行动。
当ZFS事件发生时,ZED查看目录(通常为/etc/zfs/zed.d)以查找应该运行以响应该事件的脚本(或程序)。每个脚本运行时都设置了一组环境变量来描述正在发生的事情,并且它可以使用这些环境变量来确定事件是什么。ZED根据它们的名称来决定要运行的内容;通常您最终得到的脚本名称是all-cslab.sh(在所有事件上运行)和reSilver_Finish-cslab.sh(在areSilver完成时运行)。
因为这些只是单个文件的集合,所以您可以自由添加自己的文件,而不会与Linux上的ZFS提供的标准ZEDLETS冲突或更改它们。您添加的内容可以做任何您想做的事情,从简单到复杂。例如,我们最简单的ZEDLET只需syslog所有ZED环境变量:
PATH=/usr/bin:/usr/sbin:/bin:/sbin:$PATHexport PATHIF[";$ZEVENT_SUBCLASS";=";HISTORY_EVENT";];然后退出0fiunset ZEVENT_TIME_STRINGprintenv|fgrep';ZEVENT_';|SORT|fmt-999|LOGER-p daemon.info-t';CSLAB-zevents';退出0。
(有一个标准的all-syslog.sh&39;ZEDLET,但它不会将zevents中的所有信息syslogt。如果您想要编写额外的ZEDLET和ZEDLET,捕获所有信息尤其有用。)我不太确定它们应该查找什么,或者哪些环境变量包含有用的信息。)。
可能需要一些时间和实验来整理哪些ZFS事件(以及使用哪些信息可用)来响应您的ZFS池中发生的各种事情。但是,一旦您弄清楚了这一点,ZED为您提供了一种触发和驱动各种系统管理活动的方法。这些可以是主动的(比如在设备发生故障时采取措施),也可以是被动的(比如在您的指标系统或性能仪表板中添加标记,以确定ZFS洗涤器resilver何时启动和结束,以便您可以将此与发生的其他事情关联起来)。
来自Solaris和OmniOS,那里没有这样简单的系统来应对ZFS池中发生的事情,ZED对我们来说是一股新鲜空气。最重要的是,它感觉到从一开始就应该如何处理ZFS事件,这样系统管理员就可以灵活地满足他们自己的本地需求,而不必接受Solaris故障管理系统想要给他们的任何东西。
PS:因为Linux上的ZFS现在是OpenZFS,我相信ZED最终可能会出现在FreeBSD中(如果它还没有出现在FreeBSD中),甚至有一天它会被移植回Illumos。