飞牛 NAS 更新后 UPS 无法识别的解决记录:NUT 权限与配置异常
一、问题现象
我的飞牛 NAS 之前可以正常识别 UPS,后来系统更新之后,后台 UPS 页面突然识别不到了。
期间出现过比较迷惑的情况:
- 刚开始重启 NAS 后偶尔能恢复;
- 用一段时间后又识别不到;
- 后面重新拔插 UPS USB 线也不行;
- 再次重启 NAS 也不恢复。
我的 UPS 是 APC,NUT 配置里显示类似:
vendorid = "051D"
productid = "0002"
product = "Back-UPS BK650M2-CH"
二、排查过程
SSH 登录飞牛后,先查看 NUT 服务状态:
systemctl list-units | grep -i nut
当时看到的问题是:
nut-driver@1025241.service loaded activating start
nut-monitor.service loaded failed failed
nut-server.service loaded active running
说明不是整个 NUT 都没了,而是 UPS 驱动服务一直启动失败,监控服务也跟着失败。
继续查看日志:
sudo journalctl -u nut-driver@1025241.service -n 80 --no-pager
关键报错是:
libusb1: Could not open any HID devices: insufficient permissions on everything
No matching HID UPS found
Driver failed to start
同时 nut-monitor 也报错:
Fatal error: insufficient power configured!
Sum of power values: 0
Minimum value (MINSUPPLIES): 1
这里基本可以判断:
- UPS 本身不一定坏;
- 飞牛系统还能加载 NUT;
- 主要问题是 NUT 的
usbhid-ups 驱动没有权限访问 USB HID 设备;
- 同时
/etc/nut/ups.conf 里自动生成的配置有异常。
三、发现的配置异常
查看配置:
sudo cat /etc/nut/ups.conf
里面有一行很奇怪:
serial = """
这个明显不正常,日志里也一直出现:
addchar: discarding invalid character (0x0a)!
所以我怀疑是更新后,飞牛/NUT 自动生成的 UPS 配置写坏了。
四、解决方法
1. 停止 NUT 相关服务
sudo systemctl stop nut-monitor.service
sudo systemctl stop nut-server.service
sudo systemctl stop 'nut-driver@1025241.service'
注意:你自己的服务名可能不是 1025241,可以通过下面命令查看:
systemctl list-units | grep -i nut
2. 备份原配置
sudo cp /etc/nut/ups.conf /etc/nut/ups.conf.bak.$(date +%F_%H%M%S)
3. 重写 /etc/nut/ups.conf
我的 UPS 是 APC,vendorid = 051d,productid = 0002。
执行:
sudo tee /etc/nut/ups.conf > /dev/null <<'EOF'
maxretry = 3
[1025241]
driver = usbhid-ups
port = auto
vendorid = 051d
productid = 0002
desc = "APC Back-UPS BK650M2-CH"
override.battery.charge.low = 15
EOF
这里重点是:
不要写异常的 serial = """,也尽量不要把 bus = "002" 写死。
4. 添加 USB 权限规则
创建 udev 规则:
sudo tee /etc/udev/rules.d/99-nut-apc-ups.rules > /dev/null <<'EOF'
SUBSYSTEM=="usb", ATTR{idVendor}=="051d", ATTR{idProduct}=="0002", MODE="0666"
SUBSYSTEM=="usb_device", ATTR{idVendor}=="051d", ATTR{idProduct}=="0002", MODE="0666"
SUBSYSTEM=="hidraw", MODE="0666"
EOF
然后重载规则:
sudo udevadm control --reload-rules
sudo udevadm trigger
拔掉 UPS 的 USB 线,等 10 秒,再插上。
5. 清理失败状态并重启 NUT
sudo systemctl reset-failed nut-monitor.service
sudo systemctl reset-failed 'nut-driver@1025241.service'
然后重启服务:
sudo systemctl restart nut-driver-enumerator.service
sudo systemctl restart nut-server.service
sudo systemctl restart nut-monitor.service
五、验证是否恢复
查看服务状态:
systemctl list-units | grep -i nut
我这边恢复后,服务变成了:
nut-driver@2323021.service loaded active running
nut-server.service loaded active running
nut-monitor.service loaded active running
注意:修复后 UPS 名称可能会变化。
比如我一开始是:
1025241
修复后变成了:
2323021
所以不要继续死查旧名字。
先列出当前 UPS 名称:
upsc -l
然后按实际名称查询:
upsc 2323021@localhost
如果能看到类似下面字段,说明恢复成功:
battery.charge
battery.runtime
input.voltage
ups.status
六、防止再次掉线
如果遇到 UPS 识别一段时间后又消失,可以临时关闭 USB 自动省电:
sudo sh -c 'for i in /sys/bus/usb/devices/*/power/control; do echo on > "$i" 2>/dev/null; done'
这个命令执行后,建议再观察一段时间。
七、总结
这次问题不是 UPS 坏了,也不是 USB 线一定有问题。
我的情况主要是:
- 系统更新后 NUT 的 UPS 配置异常;
/etc/nut/ups.conf 里出现了异常的 serial = """;
usbhid-ups 驱动没有权限访问 HID USB 设备;
- 导致
nut-driver 一直启动失败;
- 最后
nut-monitor 也跟着失败,飞牛后台就显示识别不到 UPS。
最终通过:
- 修正
/etc/nut/ups.conf
- 添加 udev USB 权限规则
- 重启 NUT 相关服务
成功恢复 UPS 识别。
希望能帮到遇到同样问题的朋友。