![一台服务器,两个 APC UPS 配备冗余电源:如何触发关机?](https://linux22.com/image/535836/%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E4%B8%A4%E4%B8%AA%20APC%20UPS%20%E9%85%8D%E5%A4%87%E5%86%97%E4%BD%99%E7%94%B5%E6%BA%90%EF%BC%9A%E5%A6%82%E4%BD%95%E8%A7%A6%E5%8F%91%E5%85%B3%E6%9C%BA%EF%BC%9F.png)
我有一台机架式服务器,其冗余电源插入两个 APC Smart-UPS 3000 XLM。每个 UPS 都连接到两个不同的主电源。
两个 apcupsd 实例正在运行,每个实例都连接到自己的 UPS。它们都可以检测 UPS 何时使用电池供电,然后每个 UPS 都可以触发服务器关机。
问题是:如果仅有一台 UPS 电池耗尽,如何不关机?
注意:Smart-UPS 3000 XLM 具有“电源同步”功能,可以连接到其对等设备并检测其状态。但是当我拔掉其中一个设备的插头时,关机命令还是发送了。我正在考虑修改关机脚本,使用“apcaccess”检查其他 UPS 是否已关闭。任何这方面的经验都将不胜感激!
答案1
目前,当两个 UPS 中的一个发生故障时,停止关机事件被触发,并通过执行默认脚本控制计算机。 这停止关机脚本忽略第二个 UPS,因为它们没有与事件连接,并且正常进行关机。
为了停止关机事件有些关联,apcupsd 的两个实例需要一个专门定制的配置文件。区别在于必须从哪个目录中执行事件脚本。
首次亮相的主要属性,/etc/apcupsd/apcupsd.ups0.conf
SCRIPTDIR /etc/apcupsd/ups0
UPSNAME ups0
DEVICE /dev/ups0
PWRFAILDIR /etc/apcupsd/ups0
NOLOGINDIR /etc/apcupsd/ups0
NISPORT 3551
EVENTSFILE /var/log/apcupsd.0.events
对于 ups1,在/etc/apcupsd/apcupsd.ups1.conf
SCRIPTDIR /etc/apcupsd/ups1
UPSNAME ups1
DEVICE /dev/ups1
PWRFAILDIR /etc/apcupsd/ups1
NOLOGINDIR /etc/apcupsd/ups1
NISPORT 3552
EVENTSFILE /var/log/apcupsd.1.events
每个脚本目录应该获得默认脚本的副本。
我们想要自定义停止关机脚本不会直接关闭机器,但必须检查另一台 UPS 是否仍处于开启状态,或者是否处于关机模式。
在顶部停止关机脚本,我们可以添加类似
对于 ups0
if [ ! -f /tmp/ups1.is.down ]
then
touch /tmp/ups0.is.down
exit 99
fi
适用于 ups1
if [ ! -f /tmp/ups0.is.down ]
then
touch /tmp/ups1.is.down
exit 99
fi
状态 99 具有特殊含义,它告诉控制计算机停止正在进行的操作。这五行检查其他 UPS-down-file 是否已创建;如果不,为停机的 ups 创建停机文件,并退出。如果是的,这意味着另一个 UPS 发生故障,这个 UPS 也发生故障,因此脚本应该继续并关闭机器。
该文件/tmp/usp[01].is.down
指示 ups[01] 当前是否处于故障状态。
重要提示:如果这些文件是在之前的会话中创建的,apcupsd 的 init.d 启动脚本应该删除它们:
rm -f /tmp/usp[01].is.down
最后,上面创建的目录 /etc/apcupsd/ups[01] 应该被授予访问apcupsd用户(或运行实例的任何相关用户)。
chown -R apcupsd /etc/apcupsd/ups[01]
请查看详细文档。
编辑修正了/tmp/ups[01].is.down
名称,.is
缺少了。
答案2
看看 NUT。它处理得很好。定义每个 UPS 的电源数量和所需电源数量。只要 UPS 上有足够的电源,就不会触发关机。