在Linux系统中使用NUT配置UPS

2021-01-30
5分钟阅读时长

为了保证机器在断电情况下的正常运转与自动关机,我购入了山特的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-upsautodesc中为设备描述信息,该值不必须。

接下来我们可以通过以下命令启动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

需要注意的是myupsnamemonusermypass等值均需与前文的配置相对应。

如果仅添加该行不成功则可以将内容全部替换为:

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语句应处于前三项以后,且PIPEFNLOCKFN中的文件NUT应有读取写入及操作的权限。

如果语句顺序错误则会产生如下报错:

PIPEFN must be set before any ATs in the config file!

如果PIPEFNLOCKFN文件的权限不正确则会产生如下报错:

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-onupssched.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-offupssched.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 许可协议的使用请联系作者获得授权。

Avatar

WANG Chucheng

说学逗唱样样不精的地道天津人。