背景:

背景:

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

背景:

我安装了一个 5.25 英寸 -> 3.5 英寸无托架 HDD 托盘,其中包含一个带一个端口的简单 SATA 或 SAS/SATA 背板、一个电源按钮和一些 LED(电源和 HDD 活动)。为了备份多个 HDD(每周轮换一个,存储在异地),我编写了一个脚本,用于zfs send/recv转储完整的主池,包括所有快照(仅更新新块)。当我手动启动它时,此脚本运行良好。

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

问题:

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

  1. 每 x 分钟连续使用并检查错误结果来探测新磁盘和 zpool cfgadm -f -c connect。不太优雅。
  2. 每 x 分钟检查一次/var/adm/messages并查找设备路径或 AHCI。不可能,因为只有手动连接设备时才会写入消息。
  3. 使用iostat -En。显示磁盘,但我必须 grep 确切的序列号,因为它没有列出端口信息。还需要每 x 分钟执行一次。
  4. 使用cfgadmSELECT 语法来过滤插座状态。不起作用,因为插入不会触发任何操作(也许背板太便宜了)。
  5. 识别机箱的电源开/关。应该可以,但我不知道如何实现。
  6. 重新映射电源按钮或为机器添加另一个按钮。可以,但我也不知道该怎么做。

我认为我需要两样东西:

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

这可能吗?如果不可能,您建议采取什么替代方案?

最终解决方案(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系统日志中出现随机消息)。

答案1

板载 Sata/AHCI 具有热插拔功能,但默认情况下 OmniOS 禁用此功能:要启用,请将以下行添加到 /etc/system

设置 sata:sata_auto_online=1

答案2

有趣的问题......有点像科学实验,因为我可能只使用 USB 或远程发送或按计划进行......

cfgadm但就你的情况而言,我根本不会尝试通过日志解析方式“查找”磁盘。这是不可扩展的。

我只需使用唯一的 ZFS 池名称和围绕周期的脚本逻辑来命名可移动磁盘即可zpool import。在 Linux 下的 ZFS 中,池导入过程是系统服务/守护进程。但定期运行它没有任何成本。它会检测驱动器和相关池。

我希望你出口备份完成后,也可以将数据放入池中。这将涵盖驱动器在服务器中保留多个备份周期的情况。例如将备份磁带留在驱动器中。

答案3

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

当我尝试在 unix/linux.SE 上提问时,我注意到有用的线程关于udev在 Linux 上使用来监控内核事件。作为 Solaris 的等效工具,我偶然发现建议使用syseventadm它监视系统事件并触发定义的操作/脚本。


起初,除了手册页的副本和一些关于 Xen Hypervisor 问题讨论之外,我没有找到太多内容,但支持的事件在该目录中/usr/include/sys/sysevent/eventdefs.h(或在线在/usr/src/uts/common/sys/sysevent/eventdefs.h各种存储库中)和其他文件中列出。

使用手册页中的第一个示例,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 是否正确(可选),然后按名称导入池。

相关内容