Nut-ups

来自 Alpine Linux
Todo: 此处提供的 udev 配置不能稳定工作。最近的一次更新和/或重启导致 libusb 在所有内容上权限不足 的消息再次出现。即使显式设置组所有权和权限也无法解决问题。


安装和配置 Network UPS Tools (NUT)

本 Wiki 页面展示了如何安装和配置 NUT 软件包,以监控和报告 USB 连接的不间断电源 (UPS) 的统计信息。示例中使用的 UPS 型号是 APC SmartUPS 1000,但 兼容型号列表 上的任何 UPS 都应该可以工作。

最终目标是使 UPS 状态在网络上可用,以便可以对其进行监控,并用于触发家庭自动化系统(如 Home Assistant)中的操作。

确定您的 UPS USB 参数

第一步是将 UPS 和 Alpine 主机之间的 USB 电缆插入,以查看系统如何识别它。可以使用 dmesg 命令查看有关 UPS 的信息。请参见下面的示例。

 alpine:/# dmesg
 [400269.428612] usb 1-3: new low-speed USB device number 3 using xhci_hcd
 [400269.580728] usb 1-3: New USB device found, idVendor=051d, idProduct=0002, bcdDevice= 0.06
 [400269.580751] usb 1-3: New USB device strings: Mfr=3, Product=1, SerialNumber=2
 [400269.580759] usb 1-3: Product: Smart-UPS 1000 FW:600.3.D USB FW:1.4
 [400269.580765] usb 1-3: Manufacturer: American Power Conversion
 [400269.580771] usb 1-3: SerialNumber: AS0123456789
 [400269.687883] usbcore: registered new interface driver usbhid
 [400269.687894] usbhid: USB HID core driver
 [400269.698356] hid-generic 0003:051D:0002.0001: hiddev96,hidraw0: USB HID v1.10 Device [American Power Conversion Smart-UPS 1000 FW:600.3.D USB FW:1.4] on usb-0000:00:15.0-3/input0

从该输出中,我们可以看到已检测到 Smart-UPS 1000。我们还可以看到两个重要参数:idVendor=051didProduct=0002

这些参数稍后将在 udev 规则中使用,因此请将其放在手边。

安装和配置 NUT

第一步是添加 Alpine 软件包。之后,我们将重命名三个默认配置文件,并将其替换为我们的示例 USB 连接的 APC Smart-UPS 所需的参数。

 alpine:/# apk update && apk add nut
 
 alpine:/# mv /etc/nut/nut.conf /etc/nut/nut.conf~
 
 alpine:/# cat <<EOF >/etc/nut/nut.conf
 MODE=netserver
 EOF
 
 alpine:/# mv /etc/nut/ups.conf /etc/nut/ups.conf~
 
 alpine:/# cat <<EOF >/etc/nut/ups.conf
 [SmartUPS_1000]
     driver = usbhid-ups
     port = auto
 EOF
 
 alpine:/# mv upsd.conf upsd.conf~
 alpine:/# cat <<EOF >upsd.conf
 LISTEN 0.0.0.0 3493
 EOF

第一个命令应该很熟悉。它更新 Alpine 软件包管理器数据库并安装 nut 软件包。软件包附带的所有配置文件都将在 /etc/nut 子目录中。

接下来的几个命令将重命名原始配置文件,然后写入一个仅包含所需配置参数的新文件。

  • 写入 nut.conf 的行指示 NUT 使 UPS 状态在网络上可用。
  • ups.conf 中的行定义了名称(在方括号内)、用于与 UPS 通信的驱动程序以及端口。对于 USB 连接的 UPS,它几乎总是 usbhid-ups 驱动程序和 auto 端口。只要是 USB 连接的 UPS,制造商和型号在此处应该没有任何区别。
  • 最后,upsd.conf 中的行用于告诉 NUT 它应该在所有网络接口上提供 UPS 信息。默认值仅为 localhost,这不是很有用。如果并非所有接口都适合您的情况,则可以将 0.0.0.0 替换为特定接口的网络地址。

配置 udev 规则

如果在此时尝试启动 nut-upsd 服务,它会大声抱怨权限问题。请参见下面的示例。

 libusb1: Could not open any HID devices: insufficient permissions on everything
 No matching HID UPS found
 upsnotify: failed to notify about state 4: no notification tech defined, will not spam more about it
 Driver failed to start (exit status=1)

这是由于 USB 设备的所有权和权限不正确。

下面是如何配置 udev 以使 NUT 能够访问 USB 连接的 Smart-UPS 1000 的示例。

 alpine:/# cd /etc/udev/rules.d
 
 cat <<EOF >62-nut-usbups.rules
 ATTR{idVendor}=="051d", ATTR{idProduct}=="0002", MODE="664", GROUP="nut"
 EOF
 
 alpine:/# udevadm control --reload-rules

查看以 ATTR{idVendor}=="051d", ATTR{idProduct}=="0002" 开头的行

这些是在上面的 dmesg 输出中找到的供应商 ID 和产品 ID。该行的其余部分告诉 udev 要使用的权限和组所有权。无论 UPS 的制造商和型号如何,它都应该是相同的,但 idVendoridProduct 对于您的 UPS 而言是唯一的。

注意:还有一个文件 /lib/udev/rules.d/62-nut-usbups.rules,其中包含 NUT 知道的所有 UPS 型号的信息。您也许可以直接复制它,而不是从 dmesg 输出中的信息构建自己的规则。

最后,udevadm control 命令告诉 udev 读取更改。

测试到目前为止的配置

从主机上拔下 UPS USB 电缆,稍等片刻,然后重新插入。再次检查 dmesg 以确保已检测到它,并且 idVendor 和 idProduct 正确。

检查 /dev/bus/usb 子目录中文件的权限。其中一个代表您的 UPS。如果 udev 规则工作正常,则它应该是组所有者为 nut 且权限为 0664 的文件。下面显示了一个示例。

alpine:/# ls -l /dev/bus/usb/001/003
crw-rw-r-- 1 root nut 189, 2 Oct 10 00:53 /dev/bus/usb/001/003

您的目录和文件名可能不同,但至少其中一个文件应具有如示例中所示的组所有权和权限。

dmesg 的输出应该提示您它是哪个目录和文件。查看下面 dmesg 中的行,并将 usb 1-3/dev/bus/usb/001/003 的目录条目进行比较。

usb 1-3: Manufacturer: American Power Conversion

启动 NUT

该服务名为 nut-upsd,可以如下所示启动。

alpine:/# rc-service nut-upsd start
 * /run/nut: creating directory
 * /run/nut: correcting owner
Using subdriver: APC HID 0.100
 * Starting UPS Server ...

请注意,目录 /run/nut 是第一次自动创建的。

验证运行状态

几个快速命令将确保 NUT 服务实际上按预期运行。这些在下面的示例中显示。

alpine:/# rc-service nut-upsd status
* status: started
alpine:/# netstat -tln | grep 3493
tcp        0      0 0.0.0.0:3493            0.0.0.0:*               LISTEN

这显示该服务正在运行,并通过 NUT 的默认 TCP 端口 (3493) 在所有网络接口 (0.0.0.0) 上提供 UPS 状态。

配置自动启动

如果一切看起来良好,请继续将该服务设置为在系统启动时自动启动。

alpine:/# rc-update add nut-upsd
 * service nut-upsd added to runlevel default

下一步

NUT 可以配置为执行有用的操作,例如在主电源丢失时发送电子邮件或启动优雅关机。NUT 主页 是您获取有关如何执行此操作的文档的来源。

还有一个 用于 Home Assistant 的 NUT 集成 可以安装,以随时关注您的 UPS。