我的目标是在小型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:
cfgadm -f -c connect连续检测新磁盘和zpool,并检查错误结果。 不是很优雅。 /var/adm/messages并为设备path或AHCI进行刷新。 不可能,因为只有手动连接设备时才会写入消息。 iostat -En 。 显示磁盘,但我不得不grep确切的序列号,因为它没有列出端口信息。 还需要每x分钟完成一次。 cfgadm过滤sockets状态。 不起作用,因为插入不会触发任何东西(也许背板太便宜了)。 我想我会需要两件事情:
这可能吗? 如果不是,你会build议作为替代scheme吗?
对于将来有类似问题的人:
syseventadm ,以便在磁盘联机时触发备份脚本。 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是否正确(可选),然后通过名称导入池。