[PVE]配置UPS自动关机教程

/etc/nut/nut.conf前言

本文采用PVE7.4系统和山特TG-BOX800作为演示使用,其他设备配置可能略有差异,请提前将PVE换好国内源。

连接UPS

将数据线两端分别连接PVE主机和UPS,在PVE的shell中执行

lsusb

返回的结果中应有“UPS”字样

 

安装NUT

apt install -y nut

 配置NUT

查看UPS设备硬件信息

nut-scanner -U

复制下方的UPS信息

[nutdev1]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "0463"
        productid = "FFFF"
        product = "SANTAK TG-BOX"
        serial = "Blank"
        vendor = "EATON"
        bus = "001"

如果有port = "auto",则删去bus = "001",然后在最后追加三行

    ignorelb
    override.battery.charge.low = 80
    override.battery.runtime.low = -1

ignorelb表示忽略UPS传来的低电量状态值,默认的低电量值为20,这里设置成倒数第二行的80,最后一行表示不启用电池估算运行剩余时间,因为这个可能不太准。

最后修改完应该像下图这样

[nutdev1]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "0463"
        productid = "FFFF"
        product = "SANTAK TG-BOX"
        serial = "Blank"
        vendor = "EATON"
        bus = "001"
        ignorelb
        override.battery.charge.low = 80
        override.battery.runtime.low = -1

打开/etc/nut/ups.conf,将上述内容添加到末尾,然后Ctrl+X,Y保存

nano /etc/nut/ups.conf

然后运行下述命令,正常的话不应该报错

upsdrvctl start

打开/etc/nut/nut.conf

nano /etc/nut/nut.conf

将最后一行改为或添加为下述来设置成主机模式

MODE=netserver

然后Ctrl+X,Y保存。

打开/etc/nut/upsd.conf

nano /etc/nut/upsd.conf

将最后一行改为或添加为下述,来配置监听地址和端口(NUT默认主从通信端口是3493)

LISTEN 0.0.0.0 3493

然后Ctrl+X,Y保存

打开/etc/nut/upsd.users

nano /etc/nut/upsd.users

将最后一行改为或添加为下述,来配置用户名(示例中为root)和密码(示例中为123321),设置成什么都可以,只要记住就行。另外如果想和威联通NAS做主从联动的话,用户名改为admin,密码改为123456

[root]
password = 123321
upsmon master

然后Ctrl+X,Y保存

启动NUT

systemctl restart nut-server 

然后查看UPS状态

upsc nutdev1@localhost

返回一大串内容:

root@pve:~# upsc nutdev1@localhost
Init SSL without certificate database
battery.charge: 100
battery.charge.low: 80
battery.runtime: 3072
battery.runtime.low: -1
battery.type: PbAc
device.mfr: EATON
device.model: SANTAK TG-BOX 850 
device.serial: Blank
device.type: ups
driver.flag.ignorelb: enabled
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.product: SANTAK TG-BOX
driver.parameter.productid: FFFF
driver.parameter.serial: Blank
driver.parameter.synchronous: no
driver.parameter.vendor: EATON
driver.parameter.vendorid: 0463
driver.version: 2.7.4
driver.version.data: MGE HID 1.40
driver.version.internal: 0.41
input.transfer.high: 264
input.transfer.low: 184
outlet.1.desc: PowerShare Outlet 1
outlet.1.id: 1
outlet.1.status: on
outlet.1.switchable: no
outlet.desc: Main Outlet
outlet.id: 0
outlet.switchable: yes
output.frequency.nominal: 50
output.voltage: 230.0
output.voltage.nominal: 220
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.delay.start: 30
ups.firmware: 02.08.0010
ups.load: 7
ups.mfr: EATON
ups.model: SANTAK TG-BOX 850 
ups.power.nominal: 850
ups.productid: ffff
ups.serial: Blank
ups.status: OL
ups.timer.shutdown: 0
ups.timer.start: 0
ups.type: offline / line interactive
ups.vendorid: 0463

主要看battery.charge表示当前电量,battery.charge.low表示低电量阀值,battery.type表示电池类型

自动关机

upsmon是NUT的监控程序,通过upsmon.conf配置upsmon。

打开/etc/nut/upsmon.conf

nano /etc/nut/upsmon.conf

将内容改为

RUN_AS_USER root
MONITOR nutdev1@127.0.0.1 1 root 123321 master
SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYMSG ONLINE    "UPS %s on line power"
NOTIFYMSG ONBATT    "UPS %s on battery"
NOTIFYMSG LOWBATT    "UPS %s battery is low"
NOTIFYMSG FSD        "UPS %s: forced shutdown in progress"
NOTIFYFLAG ONLINE       SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT       SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT      SYSLOG+WALL+EXEC

然后Ctrl+X,Y保存

MONITOR后面按序分别是:UPS标识,NUT主机地址,1表示UPS数量,之前设计的NUT用户名和密码(master表示最后执行动作)

SHUTDOWNCMD定义当UPS监测到严重事件(如电池电量低)且需要立即关闭系统时,应该执行的关机命令。优先级比下面的NOTIFYCMD低,默认执行的命令是/sbin/shutdown -h +0

NOTIFYCMD指定一个脚本的路径,该脚本在UPS状态发生变化时(如从在线状态变为电池供电状态,或电池电量达到某个阈值)被调用,可以执行各种操作,比如记录日志、关闭虚拟机等。

NOTIFYCMD的触发条件比SHUTDOWNCMD更广泛,它可以在UPS的多种状态变化时被调用,这些变化可能并不需要关闭系统,比如电池电量低到某个程度就关闭某个虚拟机之类的。这里通常指定为upsmon的辅助程序upssched

NOTIFYMSG表示事件消息,当发生事件时,upsmon会发出相应文本信息。ONLINE是正常市电状态,ONBATT是市电断电电池供电状态,LOWBATT是市电断电电池供电且电量低状态,FSD是“forced shutdown in progress”强制关机状态,%s代表UPS标识+地址。
NOTIFYFLAG表示当事件发生时,upsmon做出相应的处理,后面SYSLOG表示写入syslog日志,WALL指的是发送消息给系统上所有用户,EXEC表示会执行第四行的NOTIFYCMD。

打开/etc/nut/upssched.conf

nano /etc/nut/upssched.conf

修改内容为

CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /etc/nut/upssched.pipe
LOCKFN /etc/nut/upssched.lock
AT ONBATT * START-TIMER power-off 30
AT ONLINE * CANCEL-TIMER power-off

然后Ctrl+X,Y保存

当upsmon.conf相应位置有EXEC关键词时,upsmon会调用upssched,去执行另一个脚本文件upssched-cmd。

CMDSCRIPT规定upssched-cmd脚本的路径和文件名。PIPEFN是计时器文件,LOCKFN是临时文件,这两个文件要放在一个文件夹。

AT命令是事件执行的动作,AT后面是状态词,START-TIMER/CANCEL-TIMER分别是开始和终止计时器,power-off是upssched-cmd中定义的动作,30表示延时30秒执行动作。

AT ONBATT * START-TIMER power-off 30这句表示当断电电池供电开始后30秒,执行power-off动作。

AT ONLINE * CANCEL-TIMER power-off这句表示断电后计时器未完成的这段时间内如果市电恢复则停止计时器不再执行power-off动作。

打开/etc/nut/upssched-cmd

nano /etc/nut/upssched-cmd
如果/etc/nut/upssched-cmd这个文件不存在,那么就手动创建一个。

写入内容:

#!/bin/sh
case $1 in
    power-off)
    logger -t upssched-cmd "UPS running on battery"
    /usr/sbin/upsmon -c fsd
    ;;
    *)
    logger -t upssched "Unrecognized command: $1"
    ;;
esac

然后Ctrl+X,Y保存

power-off是事件定义,名称可以自定,要跟upssched.conf对应。

/usr/sbin/upsmon -c fsd是关机命令,可以关闭本机,并通知UPS关机,也可以定义各种事件执行的动作,除了关机,还可以用PVE的qm命令操作虚拟机开关机之类的。

给予权限并启动upsmon

chown root:nut /etc/nut/upssched-cmd
chmod 750 /etc/nut/upssched-cmd
systemctl restart nut-monitor
systemctl status nut-monitor

应当返回以下信息:

● nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller
     Loaded: loaded (/lib/systemd/system/nut-monitor.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-08-12 14:02:36 CST; 46min ago
    Process: 1154 ExecStart=/sbin/upsmon (code=exited, status=0/SUCCESS)
   Main PID: 1156 (upsmon)
      Tasks: 2 (limit: 38170)
     Memory: 1.9M
        CPU: 63ms
     CGroup: /system.slice/nut-monitor.service
             ├─1155 /lib/nut/upsmon
             └─1156 /lib/nut/upsmon

NUT主机配置完成!断电测试一下能否自动关机吧。

阅读剩余
THE END