本帖最后由 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>
复制代码
|