飞牛和群晖 共享 UPS(NUT)完整教程与故障修复
适用:飞牛 fnOS 作 NUT 主服务器(USB 直连 UPS)+ 群晖 Synology 作网络 UPS 客户端。 本教程基于真实排障过程写成,解决了"改 UPS 名字后飞牛一断电就误关机"的问题。 核心就一句话:只需改飞牛的 UPS 名字,账号密码、群晖全都不用动。
1. 架构
市电 ── UPS(Voltronic QS,USB)── 飞牛 192.168.1.12 (NUT master,USB 直连)
│ NUT 协议,3493 端口
└── 群晖 192.168.1.10 (NUT slave,网络客户端)
飞牛:通过 USB 连 UPS,运行 nutdrv_qx 驱动 + upsd(服务器)+ upsmon(master)。
群晖:通过局域网连飞牛的 upsd,作为网络 UPS 客户端(slave)。

2. 故障现象与根因
现象
按网上教程把飞牛的 UPS 设备名从 2159221 改成 ups 之后,只要一断电、UPS 转电池供电,飞牛立刻提示"电量低于 15%"并关机,但实际电量还很充足。UI 上电量显示却正常。
根因(实测确认)
改名字时只改了
/etc/nut/ups.conf和/etc/nut/upsmon.conf,漏了第三处。飞牛自己的 UI/关机逻辑(trim_sac)是通过
/etc/nut/device.conf里的last-device.name去查 UPS 的,而这个文件还停留在旧名字2159221。名字对不上 → 断电瞬间飞牛 UI 查询 UPS 得到空数据 → 触发兜底策略(电量低于 15% 即关机) → 直接关机。
实测:断电时用
upsc直接轮询驱动数据,电池电量 100→81%、电压 13.60→13.10→12.50V,驱动从未报过低电量。坐实了是"UI 查空"而非真低电量。
一句话结论
device.conf里的名字没跟着改,导致 UI 断电时查空误关机。 修法就是把device.conf的last-device.name改成和ups.conf一致的名字。
3. 为什么名字必须是 ups
群晖作为网络 UPS 客户端时,DSM 界面只让你填服务器 IP,UPS 名写死为 ups(界面没有名称字段)。账号密码实测完全不用动——群晖直接用飞牛现有的 NUT 用户连上。
因此被连接的 NUT 服务器(飞牛)上必须有一个名为 ups 的 UPS,群晖才连得上。这也是网上教程让你把飞牛设备名改成 ups 的原因——不是随便改的,是为了迁就群晖。
结论:飞牛的 UPS 名必须保持
ups,不能改回2159221,否则群晖连不上(群晖界面无法改名字)。
4. 修复步骤:只改飞牛这 3 处名字
以下命令在飞牛终端(需 sudo)执行。全部完成后再重启。
4.1 /etc/nut/ups.conf —— 设备段名
段名必须是 ups:
sudo sed -i 's/^[2159221]$/[ups]/' /etc/nut/ups.conf
对应段内容(驱动参数不动):
[ups]
driver = "nutdrv_qx"
port = "auto"
vendorid = "0665"
productid = "5161"
bus = "003"
override.x.additional.lowbatt = "15"
override.x.additional.devicetype = "USB"
4.2 /etc/nut/upsmon.conf —— MONITOR 行
sudo sed -i 's/^MONITOR 2159221 /MONITOR ups /' /etc/nut/upsmon.conf
改后(账号密码保持现状,不动):
MONITOR ups 1 monuser trim-secret master
4.3 /etc/nut/device.conf —— 关键,最容易漏
sudo sed -i 's/^last-device.name = 2159221/last-device.name = ups/' /etc/nut/device.conf
改后:
last-device.name = ups
4.4 确认三处一致
grep -n '^[' /etc/nut/ups.conf
grep -n '^MONITOR' /etc/nut/upsmon.conf
grep -n 'last-device.name' /etc/nut/device.conf
期望输出:[ups] / MONITOR ups 1 ... / last-device.name = ups。
4.5 按顺序重启并验证
sudo systemctl daemon-reload
sudo systemctl restart nut-driver@ups
sleep 1
sudo systemctl restart nut-server
sleep 2
sudo systemctl restart nut-monitor
sleep 2
upsc -l # 应显示 ups
upsc ups battery.charge # 应显示数字(如 100)
systemctl is-active nut-driver@ups nut-server nut-monitor # 三个 active
5. 群晖侧:什么都不用改
控制面板 → 硬件和电源 → UPS。
勾选 启用 UPS 支持。
模式选 "网络 UPS 服务器"(客户端/从机,不是 USB 直连)。
服务器地址填
192.168.1.12。其他什么都不填、什么都不改,保存。
保存后页面应显示 UPS 已连接、有电量,即配置完成。
6. 最终断电实测(验收)
拔掉 UPS 市电插头。
期望:两台 NAS 都继续运行,不再一断电就关机。
飞牛/群晖均显示电量缓慢下降(如 100→90→80…)。
到达关机策略(飞牛 15% 或 900 秒;群晖按自己设置)才关机。
全程无"一断电就关机"即修复成功。
7. 故障排查思路(备查)
如果以后再次出现"断电即关机/低电量误报",按此顺序查:
# 1) 名字三处是否一致(最常错)
grep -n '^[' /etc/nut/ups.conf
grep -n '^MONITOR' /etc/nut/upsmon.conf
grep -n 'last-device.name' /etc/nut/device.conf
# 2) 驱动是否真的上报低电量(直接问驱动,绕过 UI)
upsc ups battery.charge
upsc ups battery.voltage
upsc ups ups.status
# 3) 谁在连 upsd、有没有认证失败
sudo ss -tnp | grep 3493
sudo journalctl -u nut-server --no-pager -n 40 | grep -iE 'login|denied|error'
实测结论:这类"断电就关机但电量充足"的误报,绝大多数不是驱动问题,也不是账号密码问题,而是 UI 拿旧名字查 UPS 得到空数据导致的兜底关机。先对名字,再查数据。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
