跳转至内容

Network UPS Tools

来自 ArchWiki

本文档描述了如何安装 Network UPS Tools (NUT)。Network UPS Tools 兼容数千种 UPS 型号。您可以查看 硬件兼容性列表 来查看您的 UPS 是否受支持。

安装

安装 nut 包。

配置

NUT 有 3 个相关的守护进程

  • 与 UPS 通信的驱动程序。
  • 一个服务器 (upsd),它使用驱动程序报告 UPS 的状态。
  • 一个监控守护进程 (upsmon),它监控 upsd 服务器并根据接收到的信息采取行动。

其理念是,如果您有多台系统连接到 UPS,其中一台可以通过网络传输 UPS 的状态,而其他系统可以通过运行自己的 upsmon 服务来监控该状态。NUT 拥有详尽的配置文档,但本文将介绍一个简单的设置,在一个系统(常见的桌面配置)中设置 USB UPS 以及相关的服务器和监控器。

驱动程序配置

这里的配置将取决于您的 UPS 类型。请查阅前面提到的硬件兼容性列表,以找到可能适用于您的 UPS 的驱动程序。您可以运行 nut-scanner(8) 工具,它将检测连接到您系统的 NUT 兼容设备。

对于许多通过 USB 连接的 UPS,请使用 usbhid-ups(8) 驱动程序。对于带串行端口的 UPS,请使用 port=/dev/ttySX,其中 X 是串行端口号(例如:/dev/ttyS1)。对于带 USB 端口的 UPS,请使用 port=auto

/etc/nut/ups.conf
...
[upsname]
    driver = usbhid-ups
    port = auto

您可以为 UPS 设备命名。请参阅 ups.conf(5)

使用 upsdrvctl start 以 root 权限启动驱动程序。如果没有错误,您应该会看到如下所示的 usbhid-ups 驱动程序的提示信息。

# upsdrvctl start
Network UPS Tools - Generic HID driver 0.34 (2.4.1)
USB communication driver 0.31
Using subdriver: MGE HID 1.12
Detected EATON - Ellipse MAX 1100 [ADKK22008]

如果驱动程序未正常启动,请确保您为硬件选择了正确的驱动程序。您可能需要通过更改 ups.conf 中的 driver= 值来尝试其他驱动程序。

此时,您应该能够 启动/启用 nut-driver-enumerator.service,它将自动创建 nut-driver@<ups name> systemd 服务实例并启动它。

无法声明 USB 设备错误

如果您收到类似的错误消息

Can't claim USB device [XXXX:YYYY]: could not detach kernel driver from
interface 0: Operation not permitted
Driver failed to start (exit status=1)

或者更笼统的错误消息

USB communication driver 0.33
No matching HID UPS found
Driver failed to start (exit status=1)

这很可能是设备访问权限问题。您可以通过指定一个 udev 规则来修复它,该规则将设置正确的组。

/etc/udev/rules.d/50-ups.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", ATTR{idProduct}=="YYYY", GROUP="nut"

其中 XXXXYYYY 是设备制造商和产品 ID。您可以在错误输出([XXXX:YYYY])中看到它们,或者使用 lsusb 命令查看。

注意 nut 组由 nut 包添加。如果您使用了其他安装方法,可能需要更正组。

完成此操作后,请运行以下命令重新加载和重新触发 udev 规则:

# udevadm control --reload
# udevadm trigger

upsd 配置

默认情况下,upsd 只监听本地主机 tcp/3493,这对于我们的目的来说已经足够了。虽然对于遵循本指南来说不是必需的,但您可以通过编辑 /etc/nut/upsd.conf 来配置 upsd 以超出默认设置。请参阅 upsd.conf(5)

您需要添加一个用户,以便监控器能够连接到服务器并发出命令。请参阅 upsd.users(5)

/etc/nut/upsd.users
...
[upsuser]
     password = password
     upsmon primary
     actions = SET
     instcmds = ALL

此时,您应该能够 启动/启用 nut-server.service

如果它已成功启动,您可以运行 upsc upsname 来获取 UPS 的信息。例如,该命令的输出如下:

battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 20
battery.mfr.date: CPS
battery.runtime: 5550
battery.runtime.low: 300
battery.type: PbAcid
battery.voltage: 13.5
battery.voltage.nominal: 12
device.mfr: CPS
device.model: UPS CP1000AVRLCD
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: CyberPower HID 0.4
driver.version.internal: 0.41
input.transfer.high: 140
input.transfer.low: 90
input.voltage: 122.0
input.voltage.nominal: 120
output.voltage: 122.0
ups.beeper.status: disabled
ups.delay.shutdown: 20
ups.delay.start: 30
ups.load: 0
ups.mfr: CPS
ups.model: UPS CP1000AVRLCD
ups.productid: 0501
ups.realpower.nominal: 600
ups.status: OL
ups.test.result: Done and passed
ups.timer.shutdown: -60
ups.timer.start: 0
ups.vendorid: 0764

upsmon 配置

最后一步是配置 upsmon 以监听 upsd 并对事件采取行动。

将以下行添加到 /etc/nut/upsmon.conf

MONITOR upsname@localhost 1 upsduser password primary

其中 upsname 是 UPS 的名称,upsduserpassword 是您在 /etc/nut/upsd.users 中设置的用户及其密码。

您还可以配置发送哪些警报、发送到何处、低电量时采取什么操作,以及更多。请参阅 upsmon.conf(5)

然后 启动/启用 nut-monitor.service

您的日志应显示 upsmon 已启动并正在监控 UPS。

systemd target

为了让 systemd 服务单元在启动时自动启动,您必须 启用 nut.targetnut-driver.target

NUT-Monitor

NUT-Monitor 是一个图形用户界面,用于监控和管理连接到 Network UPS Tools 服务器的设备。

您可以使用 nut-monitorAUR安装 nut-monitor。

故障排除

CyberPower UPS 持续断开/重连

一些 CyberPower UPS 产品被发现会持续断开/重连,直到驱动程序成功连接到它 [1]。一旦断开/重连循环开始,upsd 就很难使用默认配置建立与 UPS 的连接(这似乎也影响了专有驱动程序)。

为缓解此问题,请 编辑 nut-driver@.service,添加以下配置,然后 启动/启用 nut-driver@cyberpower.service

/etc/systemd/system/nut-driver@.service.d/override.conf
[Unit]
StopWhenUnneeded=no

[Service]
PIDFile=/run/nut/usbhid-ups-%i.pid
Group=nut
User=nut
RestartSec=10s

此外,请考虑在 UPS 配置中使用 maxretry

/etc/nut/ups.conf
maxretry = 5

[cyberpower]
        driver = "usbhid-ups"
        port = "auto"
        ...

EATON 5E650iUSB 驱动程序启动失败

根据 GitHub 上的一个 issue,内核存在一个 bug,可以使用以下 内核参数 作为临时解决方案:

usbhid.quirks=0x0463:0xffff:0x08

无法声明 USB 设备:实体未找到

当从 nut-driver 收到以下错误时:

Can't claim USB device [XXXX:XXXX]@0/0/0: Entity not found

几位用户报告(例如 [2])重启(断电后再通电)UPS 可以解决此问题。

或者,您可以尝试在 启动 nut-driver@ups_name systemd 服务之前运行 upsdrvctl stop

参见