| 本帖最后由 gasment 于 2024-5-14 17:09 编辑 
 UPS联动方案不得不提就是network ups tool(nut)了,我一直以来的方案都在围绕这个软件,踩过很多坑又爱又恨
 因为ESXI没有nut-server软件包,很久前就迁移到了PVE。
 得益于PVE的可玩性,nut联动的方案也一直在折腾。
 又因为蛋疼的PVE任务执行方式,要排队不止,但凡有一个虚拟机无法关机都会造成关机任务卡主,
 其中不得不提就是黑裙,直至到DSM的qemu-guset-agent套件诞生前,我都只能把关机任务分散到各个虚拟机内部的nut-client,
 由虚拟机内部各自关机避免卡主任务的情况,这样配置比较繁琐,虽然不太满意但也凑效。
 qemu-guset-agent套件的出现,实现了外部安全关闭虚拟黑裙的功能,解决了一大硬茬,我开始摸索新的更完美的nut方案。。。
 首先就是精简虚拟机,只保留了一个LXC,一个黑裙(集合万兆、硬解、Docker、NVR服务),一个主路由op,因为PVE关机时排队关虚拟机的特性,减少虚拟机能有效缩短关机耗时
 其次,既然能做到统一由PVE外部关机,那就去掉全部外部nut-client,由PVE自己操作一切,简化配置
 
 经过一轮摸索实践与验证,目前这套方案我心感满意,也未曾出岔子,应该是可以拿出来让大家见笑下
 方案针对的UPS为APC BK650M2-CH,因为不同机型之间功能不一,其他机型只具参考性
 
 成果展示:针对APC BK650M2-CH机型,下面是我摸索到特性:
 根据这些特性,结合不同的停电时长,情景逻辑大致可以是这样:机器本身不支持延迟上电机器本身支持自动重启机器支持自身关机断电的驱动指令,仅在电池模式下响应,响应后会无视市电状态坚持断电,断电倒计时约2min接上,在存在市电情况下关机断电,延迟约1秒重新开机上电
 原图:
  
 达成的效果:
 小于3分钟的停电,PVE无需关机可自恢复服务;大于3分钟的停电,PVE关机后可来电自恢复 群晖也接入了nut-server(只接入不安排任务),使用系统自带webhook推送停电消息达成的条件: 有几个要说明的点:所有虚拟机都支持qemu-guest-agent并启用(难搞的黑裙都已经有了,我遇到的只有爱快没有)所有虚拟机均能由PVE外部关闭(因此需要agent),虚拟机内部系统均不做联动,简化配置需要一个倒计时上电插座(我用的是普彩的PC-D20,非打广告,非常符合使用场景)
 60秒无动作时间可以延长,只是我的电池不太行150W负载只剩10分钟续航,需要尽量压缩时间为什么在60~180秒复电要重启虚拟机?
 应对市电恢复的策略:60秒时执行了关闭虚拟机,如果在180秒内复电,这样就要需要恢复服务,但是虚拟机关机任务不好打断,干脆让它关完,再重新拉起 注意控制PVE安全下线的耗时,不要超过ups断电的延迟时限(我设置从60s关虚拟机,到UPS在300s左右断电,其中有4分钟给PVE下线)PVE关机后要自恢复,关键条件是触发来电自启
 其一:要断电;其二:断电持续时间不低于30s(参考值) UPS关机指令其实即是upsdrvctl程序的shutdown指令,shutdown执行时若存在市电,机器会转为重启,断电间隔非常短,无法满足来电自启要求,因此需要串入一个倒计时上电器件(倒计时插座等)来弥补延迟上电功能这套方案目前已经历过几次停电(>10分钟),都可以按预期恢复;手动模拟3分钟内的断电也能按预期预期自恢复
 
 
 下面贴下我方案的配置参考,希望帮到你
 第1步:安装nut目前测试发现nut2.8版本的驱动报错无法控制BK650关机,因此使用2.7.4版
 针对PVE 7.x debian10(命令行使用cat /etc/os-release查看debian版本):
 可直接apt安装:针对PVE 7.x 8.x debian11/12: 注意处理依赖和安装顺序第2步:配置nut主要配置文件存在于/etc/nut目录下 贴个配置文件的关系图:
 原图:
  
 下面进行逐一配置(原文件内容建议全清空再编辑)
 【nut.conf】设置nut运行模式
 【ups.conf】配置ups驱动
 可执行nut-scanner -U得到以下信息复制粘贴,其中[ups]可自定义,为设备标识 复制代码[ups]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "051D"
        productid = "0002"
        product = "Back-UPS BK650M2-CH FW:294803G -292804G"
        serial = "9B232*******"
        vendor = "American Power Conversion"
        bus = "001"
如果是离线安装的nut,可能会缺少nut-scanner命令,可以尝试最小代码 复制代码[ups]
        driver = "usbhid-ups"
        port = "auto
保存后可测试:upsdrvctl start ,得到的返回信息参考: 复制代码Network UPS Tools - UPS driver controller 2.7.4
Network UPS Tools - Generic HID driver 0.41 (2.7.4)
USB communication driver 0.33
Using subdriver: APC HID 0.96
⚠️注意不能有其他报错信息 
 【upsd.conf】配置服务器监听地址
 【upsd.users】配置远程用户
 [ ]内为用户名,可自定义,示例中配置了一个管理员主账号admin/admin用于PVE连接,一个monuser/secret从账号用于群晖连接 复制代码[admin]
password = admin
actions = SET
actions = FSD
instcmds = ALL
upsmon master
[monuser]
password = secret
upsmon slave
 【upsmon.conf】配置ups状态动作
 MONITOR行,配置nut-server连接信息,格式:设备标识@ip ups数量 账号 密码 master/slave #SHUTDOWN 行已注释,改为下方配置/sbin/upssched为执行器 NOTIFYMSG 为状态消息通知 NOTIFYFLAG 为动作设定(系统日志+警告通知+执行器) 复制代码RUN_AS_USER root
MONITOR ups@localhost 1 admin admin master
#SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYCMD /sbin/upssched
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
 【upssched.conf】配置任务计时器
 CMDSCRIPT 行,配置脚本文件路径 PIPEFN LOCKFN 行,配置运行时产生文件的路径 ⚠️3个路径最好相同,且该文件夹对nut用户可读写(不会就chmod -R 777) 计时器设置格式: AT ups状态(ONBATT/ONLINE) * 开关计时器(START/CANCEL-TIMER) 任务名 秒数 复制代码CMDSCRIPT /etc/nut/cmd/upssched-cmd
PIPEFN /etc/nut/cmd/upssched.pipe
LOCKFN /etc/nut/cmd/upssched.lock
AT ONBATT * START-TIMER stop-vm 60
AT ONBATT * START-TIMER power-off 180
AT ONLINE * CANCEL-TIMER stop-vm
AT ONLINE * CANCEL-TIMER power-off
AT ONLINE * START-TIMER start-vm 10
 【upssched-cmd】配置计时器脚本
 case选择语句,项名称对应upssched.conf中的任务名 建议使用nano等命令行编辑器编辑,避免格式问题导致运行报错 复制代码#! /bin/sh
case $1 in
   stop-vm)
      /usr/bin/pvesh --nooutput create /nodes/localhost/stopall
      ;;
   power-off)
      /sbin/upsdrvctl shutdown
      shutdown -h now
     ;;
   start-vm)
       /usr/bin/pvesh --nooutput create /nodes/localhost/startall
     ;;
  *)
    logger -t upssched "Unrecognized command: $1"
    ;;
esac
 第3步:验证配置
 重启PVE主机 复制代码
systemctl status nut-monitor #查看日志是否有报错
upsc ups@localhost #查看ups参数输出</div>
 
 
 
 
 |