如果cfgadm状态断开,如何在Solaris中自动检测插入的SATA磁盘?

我的目标是在小型OpenSolaris NAS(在HP Microserver N54L上运行OmniOS + napp-it)与SATA磁盘相结合,实现自动备份例程。

背景:

我已经安装了其中一个5.25“ – > 3.5”无托盘HDD托盘,其中包含一个端口,一个电源button和一些LED(电源和硬盘活动)的简单SATA或SAS / SATA背板。 要备份多个硬盘(每周一个硬盘,存储在异地),我写了一个脚本,使用zfs send/recv来转储包括所有快照的所有快照(仅更新新块)。 这个脚本工作正常,当我手动启动它。

我想进一步实现这个过程的自动化,因为NAS没有连接直接的VGA或串口控制台,插入磁盘,返回到桌面系统,login到Web界面或SSH并手动启动脚本是很繁琐的。 通过cron作业定时启动不是一个选项,因为备份的日子可能会有所不同(忘记磁盘,假期等)。 因此,插入磁盘后应该立即开始备份。

问题:

在脚本中,我使用cfgadm连接+configuration,稍后取消configuration+断开磁盘。 如果我只插入磁盘,并且它旋转起来,我无法知道磁盘在那里。 我已经考虑过可能的解决scheme:

  1. 每隔x分钟使用cfgadm -f -c connect连续检测新磁盘和zpool,并检查错误结果。 不是很优雅。
  2. 每隔x分钟检查/var/adm/messages并为设备path或AHCI进行刷新。 不可能,因为只有手动连接设备时才会写入消息。
  3. 使用iostat -En 。 显示磁盘,但我不得不grep确切的序列号,因为它没有列出端口信息。 还需要每x分钟完成一次。
  4. 使用带有SELECT语法的cfgadm过滤sockets状态。 不起作用,因为插入不会触发任何东西(也许背板太便宜了)。
  5. 识别机箱的电源开/关。 会没事的,但我不知道如何做到这一点。
  6. 重新制作电源button或在机器上添加另一个button。 可以工作,但我也不知道如何做到这一点。

我想我会需要两件事情:

  • 一种可靠的方法来识别磁盘和端口状态的组合(所以只有在正确的插槽中正确的磁盘被检测到)
  • 一种方法来注册这个检测并触发一个事件(启动shell脚本)

这可能吗? 如果不是,你会build议作为替代scheme吗?

最终解决scheme(2015-01-26更新):

对于将来有类似问题的人:

  1. 在OmniOS中启用AHCI热插拔,详见gea 接受的答案 。
  2. 在我自己的回答中详细介绍syseventadm ,以便在磁盘联机时触发备份脚本。
  3. 确保您的电缆,控制器和磁盘没有故障,并且能够很好地协同工作(我遇到了WD SE 4TB磁盘和板载AHCI SATA控制器的问题,导致了随机的WARNING: ahci0: ahci_port_reset port 5 the device hardware has been initialized and the power-up diagnostics failed系统日志中的WARNING: ahci0: ahci_port_reset port 5 the device hardware has been initialized and the power-up diagnostics failed消息)。

板载Sata / AHCI支持热插拔,但在默认情况下,OmniOS将禁用此function:要启用将以下行添加到/ etc / system

设置sata:sata_auto_online = 1

有趣的问题…有点科学实验,因为我可能只是使用USB或远程发送或有这样的计划…

但在你的情况下,我不会尝试从cfgadm或日志parsing的方式来“查找”磁盘。 这不可扩展。

我只是简单地使用一个唯一的ZFS池名称和脚本逻辑命名可移动磁盘周围的zpool import 。 在Linux下的ZFS中,池导入过程是一个系统服务/守护程序。 但是定期运行它是没有成本的。 它会检测到驱动器和关联的池。

我希望你在完成备份的时候也可以导出池。 这将涵盖驱动器保留在服务器中多个备份周期的情况。 就像在其驱动器中留下备份磁带一样。

我将添加这个答案来logging我发现的有关监视事件(在其他情况下也可能有用):

在试图问一个关于unix / linux.SE的问题时,我注意到了一个关于在Linux上使用udev监视内核事件的有用线程 。 作为Solaris的等价工具,我偶然发现了使用syseventadm来监视sysevent并触发定义的动作/脚本的build议。


起初,除了手册页的副本以及关于Xen Hypervisor问题的一些讨论,我没有find太多的东西,但支持的事件列在/usr/include/sys/sysevent/eventdefs.h (或在/usr/src/uts/common/sys/sysevent/eventdefs.h在各种/usr/src/uts/common/sys/sysevent/eventdefs.h中)以及该目录中的其他文件。

使用manpage和syseventadm add -c EC_zfs -s ESC_ZFS_scrub_start /path/to/script.sh \$pool_name的第一个示例, syseventadm add -c EC_zfs -s ESC_ZFS_scrub_start /path/to/script.sh \$pool_name我成功testing了一个样例事件,每次启动一个syseventadm add -c EC_zfs -s ESC_ZFS_scrub_start /path/to/script.sh \$pool_name并触发池名称作为第一个参数。


经过一些试验和错误,我发现正确的方式来监视新添加的磁盘:

 syseventadm add -c EC_dev_add -s disk /path/to/script.sh \$version \$dev_name \$phys_path \$driver_name \$instance syseventadm restart 

disk之后的所有东西都是可选的,直接作为参数$1$5传递给脚本。

现在只要新添加的磁盘联机,脚本将被触发,脚本可以检查设备ID是否正确(可选),然后通过名称导入池。