在 Arch 上设置 UPS

因为数据丢失恐惧症的缘故,还是买了 UPS 放在 NAS 旁,以防 NAS 突然断电导致硬盘数据损坏。

设置 NAS

QNAP 的 UPS 协议符合 Network UPS Tools (nut) 规范,作为 Master 或者 Slave 都可以正常使用,如果作为 Master 使用,连接上 UPS 并且确认 UPS 工作正常以后填入从机的 IP 地址即可使用。

不过由于 NAS 有一点点耗电,所以我想直接在 Arch 上监视 UPS ,让 NAS 作为 nut 的从机。于是我们走一些弯路,设置 UPS 过程并没有那么顺利。

回溯查找协议的心路历程

一开始我安装了 APC UPS 包,安装之后才发现好像实现有些不对劲。首先访问的端口不是 APC NAS 的网络预设端口,重新抓了包之后发现其访问的是另一个端口。其次就算配置了正确访问的端口, NAS 那边还是获得不了数据,所以我决定重新查询 QNAP 的文档。

经过了多个论坛的搜索,最后发现 QNAP 是利用 NUT 协议来和其他的 UPS 进行通信的。1

并且经过查询资料23得知,它的访问条件比较严格,用户名和密码都是硬编码的。其 NUT 会访问 qnapnas ,然后用户名密码分别是 qnapnas 和 123456 。很奇怪,我似乎没有在官方文档中找到这部分内容的说明,其只是告知网页上应该如何操作修改 NAS 的设置。4

在 Arch 上设置 UPS

直接打开 Arch Wiki 关于此工具的页面按照步骤操作,安装包后执行扫描功能 nut-scanner 查看是否能识别到 NAS 。如果可以识别到 NAS 则将扫描结果直接写入配置文件中。

[nutdev-usb1]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "MASKED"
        productid = "MASKED"
        product = "MASKED"
        serial = "MASKED"
        vendor = "American Power Conversion"
        # bus = "001"
        # device = "002"
        # busport = "003"

搜寻结果如上所示,直接把这一部分内容贴到 nut 的配置文件中即可。不过需要把 NAS 名称修改为 qnapnas 否则 NAS 上无法正确读取。

然后,我们还需要给这个设备设置 nut 的用户组,否则 nut 可能无法正确读取(会不停报错)。

SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", ATTR{idProduct}=="YYYY", GROUP="nut"

将以上内容添加到 /etc/udev/rules.d/50-ups.rules 中,然后执行以下指令。5

# udevadm control --reload
# udevadm trigger

完成以上操作后,先执行 sudo upsdrvctl start 来创建 UPS 的配置文件,如果没有其它错误的话,可以执行 sudo systemctl enable nut-driver-enumerator.service 让其在之后可以自动配置 UPS 相关的服务。

设置所有权之后,我们需要将 NAS 上用来请求的用户添加到 nut 的用户列表里。同时在 /etc/nut/upsd.conf 文件中指定 upsd 需要监听的网络地址(预设是设置为只监听 localhost) 6

[qnapups]
    password = 123456
    upsmon secondary

将以上内容添加到 /etc/nut/upsd.users 中,远程用户就有访问权限了。添加用户之后,我们可以执行 sudo systemctl enable nut-server.service 来让 upsd 服务在 nut.target 时自动启动。接着 sudo systemctl enable nut.target 来让以上提到的服务自动开机启动。

在 NAS 的 UPS 设置中,记得选择 Network slave 选项,并将 IP 地址设置为配置好 nut 的机子 IP。

重新启动/手动启动 nut 相关服务之后,在 NAS 配置上应该可以看到 UPS 已经在线,并且正常工作了。

本地设置 ups monitor

[upsuser]
     password = password
     upsmon primary
     actions = SET
     instcmds = ALL

首先创建一个用户添加到文件 upsd.users 中,接着配置 upsmon.conf ,将新建的用户添加进文件中。

MONITOR qnapups@localhost 1 $upsuser $password primary

重启 nut-server 服务,使用 upsc qnapups 来查询当前系统的 UPS 状态。也可以启用 nut-monitor 服务,使其可以自动执行关机操作。

battery.charge: 100
battery.charge.low: 96
battery.mfr.date: 2001/01/01
battery.runtime: 3618
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 13.6
battery.voltage.nominal: 12.0
device.mfr: American Power Conversion
device.model: MASKED
device.serial: MASKED
device.type: ups
driver.debug: 0
driver.flag.allow_killpower: 0
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.product: MASKED
driver.parameter.serial: MASKED
driver.parameter.synchronous: auto
driver.parameter.vendor: American Power Conversion
driver.state: quiet
driver.version: 2.8.2
driver.version.data: APC HID 0.100
driver.version.internal: 0.53
driver.version.usb: libusb-1.0.27 (API: 0x100010a)
input.sensitivity: low
input.transfer.high: 278
input.transfer.low: 160
input.transfer.reason: input voltage out of range
input.voltage: 220.0
input.voltage.nominal: 220
ups.beeper.status: disabled
ups.delay.shutdown: 20
ups.load: 0
ups.mfr: American Power Conversion
ups.mfr.date: 2024/06/05
ups.model: MASKED
ups.productid: MASKED
ups.realpower.nominal: 390
ups.serial: MASKED
ups.status: OL
ups.test.result: Done and passed
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: MASKED