在Linux系统中使用NUT配置UPS
为了保证机器在断电情况下的正常运转与自动关机,我购入了山特的TG-BOX600并连接到Ubuntu系统的主机。本文将介绍如何在Linux系统中使用NUT配置UPS。
硬件连接
首先你需要将UPS接入电源并将电脑接入UPS插座,你还需要将UPS的数据线与电脑的USB口相连接。
安装NUT
NUT在各类Linux系统中均可以使用默认的包管理工具进行安装。我使用的是Ubuntu 20.04,安装指令如下所示:
apt install nut
配置驱动
在安装完NUT后,我们将配置UPS的驱动。首先你可以使用lsusb
查看设备是否被正常接入。如果被正常识别则会包含类似于如下的内容:
Bus 001 Device 002: ID 0000:ffff MGE UPS Systems UPS
接下来使用vim /etc/nut/ups.conf
修改该文件,在其中添加如下内容:
maxretry = 3
[myupsname]
driver = usbhid-ups
port = auto
desc = "My UPS"
其中myupsname
为设备名。因为我们使用USB进行连接,驱动及端口为usbhid-ups
及auto
。desc
中为设备描述信息,该值不必须。
接下来我们可以通过以下命令启动UPS:
/sbin/upsdrvctl start
配置NUT服务
接下来,我们将设置操作UPS的用户信息。
新建用户
在连接UPS后,我们将配置用户信息。使用vim /etc/nut/upsd.users
编辑该文件:
[monuser]
password = mypass
upsmon master
其中monuser
为用户名,password
为密码。upsmon master
为运行模式,如果该设备为主节点则为该值,从节点则为upsmon slave
。
配置权限
需要注意的是我们不应使该文件对所有用户均可读,因为它包含密码等敏感信息。我们可以使用如下命令设置相关权限:
chown root:nut /etc/nut/upsd.conf /etc/nut/upsd.users
chmod 0640 /etc/nut/upsd.conf /etc/nut/upsd.users
启动服务
接下来我们可以启动服务器:
/sbin/upsd
如果在此步产生报错,可先设置NUT运行模式。使用vim /etc/nut/nut.conf
编辑该文件并选择模式:
MODE=standalone
我将其配置为standalone
模式
查看信息
你可以查看UPS的相关信息:
/bin/upsc myupsname@localhost
你也可以选取特定类别的信息进行查看:
/bin/upsc myupsname@localhost ups.status
设置自动关机
NUT默认会在UPS发送LOWBATT
时通知机器关机,我们需要通过vim /etc/nut/upsmon.conf
添加相关配置。
默认情况下我们只需在MONITOR
章节中添加信息即可:
MONITOR myupsname@localhost 1 monuser mypass master
需要注意的是myupsname
,monuser
,mypass
等值均需与前文的配置相对应。
如果仅添加该行不成功则可以将内容全部替换为:
POWERDOWNFLAG /etc/killpower
MONITOR myupsname@localhost 1 monuser mypass master
SHUTDOWNCMD "/sbin/shutdown -h +0"
由于该文件同样包含敏感信息,因此我们同样需要为其设置权限:
chown root:nut /etc/nut/upsmon.conf
chmod 0640 /etc/nut/upsmon.conf
最后我们只需启动服务即可:
/sbin/upsmon
至此我们就完成了Linux系统上NUT的配置。
自定义事件处理
除了默认的低电量关机功能,可能我们有时还需其他自定义的功能。例如停电一分钟后关机或者邮件通知等。NUT通过upssched
提供了该功能。
该功能的实现为通过在upsmon
中设置触发条件通知upssched
,并由upssched
完成后续工作。
修改upsmon设置
首先我们在/etc/nut/upsmon.conf
添加如下内容:
NOTIFYCMD /sbin/upssched
这可以使我们在发生事件时运行upssched
服务。
接下来我们将设置触发条件:
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
我们在此设置的是当主机使用UPS电池供电时写入日志并运行之前定义的upssched
服务。NUT除ONBATT
还提供了多种状态,具体内容可在upsmon.conf
文件的注释中查到。
配置upssched
接下来我们将在/etc/nut/upssched.conf
文件中设置具体的实现逻辑,我们只需将其内容替换为:
CMDSCRIPT /usr/local/bin/upssched
PIPEFN /var/run/nut/upssched/upssched.pipe
LOCKFN /var/run/nut/upssched/upssched.lock
AT ONBATT * START-TIMER power-off 60
AT ONLINE * CANCEL-TIMER power-off
AT ONLINE * EXECUTE power-on
首先我们通过CMDSCRIPT
定义了需要执行的脚本,路径可以自定义。接下来通过设置不同的触发条件触发脚本。例如我们在UPS进入ONBATT
状态时启动了一个60秒的计时器,之后将会执行自定义的power-off
事件。如UPS在60秒内恢复供电则取消该计时器。我们也设置了在UPS状态变为ONLINE
时立即执行power-on
事件。
需要注意的是AT
语句应处于前三项以后,且PIPEFN
及LOCKFN
中的文件NUT应有读取写入及操作的权限。
如果语句顺序错误则会产生如下报错:
PIPEFN must be set before any ATs in the config file!
如果PIPEFN
及LOCKFN
文件的权限不正确则会产生如下报错:
Failed to connect to parent and failed to create parent: No such file or directory
编写脚本
接下来我们就可以编写相应脚本,脚本应存储于upssched.conf
文件中CMDSCRIPT
的位置。另外要注意的是,NUT应拥有对该脚本的执行权限,否则会报以下错误:
exec_cmd(your-path your-event) returned 126
邮件通知
在UPS情况变化时我们可以设置邮件通知。
#! /bin/sh
case $1 in
...
power-on)
echo "The UPS is online now and the server has started." \
| mail -s "The server has started" [email protected]
;;
...
*)
logger -t upssched "Unrecognized command: $1"
;;
esac
该段脚本定义了power-on
时发邮件通知指定用户。power-on
为upssched.conf
文件AT
语句中定义的事件。
定时关机
NUT默认会在UPS提示低电量时关机。有时我们可能希望在断电一定时间后就关机,因此我们可以使用以下脚本:
#! /bin/sh
case $1 in
...
power-off)
echo "The UPS has been on battery for 60 seconds and foreman is about to shut down." \
| mail -s "Foreman is about to shut down" [email protected]
/sbin/upsmon -c fsd
;;
...
*)
logger -t upssched "Unrecognized command: $1"
;;
esac
该段脚本定义了power-off
时发邮件通知指定用户并关机的操作。power-off
为upssched.conf
文件AT
语句中定义的事件,该事件根据我们之前的设置会在使用电池供电60秒后发生。
类似的,我们还可以通过编写脚本的方式进行其他操作。
本文首发于我的个人博客wangchucheng.com。
原文链接:https://wangchucheng.com/zh/posts/setting-up-ups-with-nut-on-linux/
本博客文章除特别声明外均为原创,采用CC BY-NC-SA 4.0 许可协议进行许可。超出CC BY-NC-SA 4.0 许可协议的使用请联系作者获得授权。