我的目标是结合 SATA 磁盘在小型 OpenSolaris NAS(在 HP Microserver N54L 上运行 OmniOS + napp-it)上自动执行备份例程。
背景:
我安装了其中一个 5.25" -> 3.5" 无托架 HDD 托盘,其中包含一个简单的 SATA 或 SAS/SATA 背板,带有一个端口、一个电源按钮和一些 LED(电源和 HDD 活动)。zfs send/recv
当我手动启动它时,这个脚本工作正常。
我想进一步自动化该过程,因为 NAS 没有直接连接 VGA 或串行控制台,插入磁盘、返回桌面系统、登录 Web 界面或 SSH 并手动启动脚本很繁琐. 通过 cron 作业定时启动不是一个选项,因为备份的天数可能略有不同(忘记磁盘、假期等)。所以备份应该在插入磁盘后立即开始。
问题:
在我cfgadm
用来连接 + 配置和稍后取消配置 + 断开磁盘的脚本中。如果我只插入磁盘并且它旋转起来,我无法知道磁盘在那里。我已经考虑过的可能解决方案:
cfgadm -f -c connect
通过使用和检查错误结果,每 x 分钟连续探测一个新磁盘和 zpool 。不是很优雅。- 每 x 分钟检查
/var/adm/messages
一次并查找设备路径或 AHCI。不可能,因为只有在手动连接设备时才会写入消息。 - 使用
iostat -En
. 显示磁盘,但我必须使用 grep 获取确切的序列号,因为它没有列出端口信息。还需要每 x 分钟完成一次。 - 使用
cfgadm
with SELECT 语法过滤容器状态。不起作用,因为插入不会触发任何事情(也许背板太便宜了)。 - 识别机箱的电源开/关。没关系,但我不知道如何做到这一点。
- 重新映射电源按钮或向机器添加另一个按钮。可以工作,但我也不知道该怎么做。
我想我需要两件事:
- 结合识别磁盘和端口状态的可靠方法(因此仅检测到正确插槽中的正确磁盘)
- 一种注册此检测并触发事件的方法(启动 shell 脚本)
这可能吗?如果没有,您会建议什么替代方案?
最终解决方案(2015-01-26 更新):
对于将来遇到类似问题的任何人:
板载 Sata/AHCI 支持热插拔,但默认情况下在 OmniOS 中禁用此功能:要启用将以下行添加到 /etc/system
设置 sata:sata_auto_online=1
有趣的问题...有点科学实验,因为我可能只是使用 USB 或远程发送或按计划进行...
但是在您的情况下,我根本不会尝试通过
cfgadm
或日志解析方式“查找”磁盘。那是不可扩展的。我只是用一个独特的 ZFS 池名称和脚本逻辑来命名可移动磁盘
zpool import
。在 Linux 下的 ZFS 中,池导入进程是一个系统服务/守护进程。但是定期运行它是没有成本的。它将检测驱动器和关联的池。我希望您在完成备份后也导出池。这将涵盖驱动器在服务器中保留多个备份周期的情况。就像在其驱动器中留下备份磁带一样。
我将添加此答案以记录我发现的有关监视事件的内容(在其他情况下也可能有用):
在尝试在 unix/linux.SE 上提问时,我注意到一个关于在 Linux 上使用来监视内核事件的有用线程。
udev
作为 Solaris 的等效工具,我偶然发现了使用syseventadm
which watch for sysevents 和 triggers defined actions/scripts 的建议。起初,除了手册页的副本和一些关于 Xen Hypervisor 问题的讨论之外,我没有找到太多内容,但支持的事件列在
/usr/include/sys/sysevent/eventdefs.h
(或在线/usr/src/uts/common/sys/sysevent/eventdefs.h
的各种 repos)和该目录中的其他文件中。使用手册页中的第一个示例,
syseventadm add -c EC_zfs -s ESC_ZFS_scrub_start /path/to/script.sh \$pool_name
我成功地测试了一个示例事件,该事件在每次启动清理时触发并将池名称作为第一个参数返回。经过反复试验,我找到了监视新添加磁盘的正确方法:
之后的所有
disk
内容都是可选的,并直接$1
作为$5
.现在只要新添加的磁盘上线,就会触发脚本,脚本可以检查设备ID是否正确(可选),然后按名称导入池。