前言

最近给 PVE 加了一个 UPS(由于是 APC 家的 BK650M2-CH,所以使用 APCUPSD 服务,详见 使用 APCUPSD 让 PVE 接入 UPS 获得断电保护 - 光昭)但是后来发现 APCUPSD 服务总是会频繁报告 UPS 为 NOBATT 状态。后来在网上看见一篇文章(详见 PVE 上使用 Nut 代替 Apcupsd (BK650M2-CH: ONBATT) - 企鹅大大的博客,Reference[1]),也是 BK650M2-CH 的 NOBATT 问题,文中提到这是 APCUPSD 服务引起的,遂尝试换 NUT 服务,顺手记录一篇文章。

相关概念

老传统。

NUT 简介

NUT(Network UPS Tools)是一个开源的跨平台软件套件,用于管理不同品牌和型号的不间断电源(UPS)。它通过监控UPS状态,在断电时安全关闭连接的设备(如服务器、网络设备等),防止数据丢失或硬件损坏。

NUT 架构

NUT 分为三层:

  • nut-driver:驱动层, 用于与 UPS 通信并获取 UPS 信息。
  • nut-server:服务层,用于对外提供 UPS 信息。
  • nut-monitor:监控层,可实现监控 UPS 电量并实现自动关机。

配置教程

安装 NUT

apt update -y && apt install nut

扫描 NUT 设备

nut-scanner

输出类似如下内容:

[nutdev1]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "****"
        productid = "****"
        product = "Back-UPS BK650M2_CH"
        ......

配置 NUT

NUT 需要设置一个 UPS 名与密码,本文中以

  • UPS 名:myups
  • ups 用户:upsuser

编辑 ups.conf

编辑 ups.conf 文件:

nano /etc/nut/ups.conf

修改 upsname 并注释 maxretry:

#maxretry = 3
[myups]
  driver = usbhid-ups
  port = auto
  desc = "My UPS"

启动及自启动 nut-driver

/sbin/upsdrvctl start

这里我遇到过 libusb1: Could not open any HID devices...Driver failed to start (exit status=1) 之类的报错,兜兜转转一圈后在 Github Issues 中找到了与我一样的问题,部分用户给出的解决办法是“full reboot”,我尝试重启 PVE 节点以及我的 UPS 后,一切正常了。

真玄学。

配置用户文件

nano /etc/nut/upsd.users

最下方加入如下内容:

[upsuser]
     password = PASSWD
     upsmon primary
     actions = SET
     instcmds = ALL
# 将 PASSWD 替换成你自己想要的密码

配置运行模式

nano /etc/nut/nut.conf

将 Mode 修改为 standalone(此外 NUT 还有 netserver 运行模式,可以了解一下)

MODE=standalone

启动及自启动 nut-server

systemctl start nut-server.service && systemctl enable nut-server.service

查看配置

# upsc upsname
# upsname 即你设置的 UPS 名,本文中为 myups
# 所以最终需要执行
upsc myups

输出如下:

设置自动关机

即配置 nut-monitor。

编辑 upsmon.conf

nano /etc/nut/upsmon.conf

在 MONITOR 块添加,格式如下或见文件内注释:

MONITOR myups@localhost 1 upsuser PASSWD primary
# PASSWD 即为你前面设置的密码

部分配置项:

  • DEADTIME:UPS 掉线阈值,默认为 15s
  • FINALDELAY:等待多久后,shutdown 宿主机

启动及自启动 nut-monitor

systemctl start nut-monitor.service && systemctl enable nut-monitor.service

启动 NUT

systemctl start nut.target && systemctl enable nut.target && systemctl enable nut-driver.target && systemctl start nut-driver.target

电力故障模拟测试

拔掉 UPS 连接市电的电源,观察其是否会按预期自动关机。

Reference

[1] PVE 上使用 Nut 代替 Apcupsd (BK650M2-CH: ONBATT) - 企鹅大大的博客

[2] Network UPS Tools - ArchWiki

版权申明

  • 本文作者:光昭
  • 本文链接:https://www.pyrzo.com/posts/nut-configuration
  • 封面出处:画师 コーラ (id=37855635)
  • 版权声明:所有文章除特别声明外均系本人自主创作,转载及引用请联系作者,并注明出处(作者、原文链接等)。
  • 部分图片、文字搜集于网络,若构成侵权请联系我,会尽快删除。
  • reward_image1
此作者没有提供个人介绍。
最后更新于 2026-01-17