BK650M2-CH +NUT+ AIO NAS,摸索过的UPS停电自恢复方案分享
本帖最后由 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秒重新开机上电
根据这些特性,结合不同的停电时长,情景逻辑大致可以是这样:
原图:https://img2.imgtp.com/2024/05/14/cf41W9or.png
达成的效果:小于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安装:apt-get update针对PVE 7.x 8.x debian11/12:手动安装2.7.4离线包:https://packages.debian.org/buster/nut注意处理依赖和安装顺序第2步:配置nut主要配置文件存在于/etc/nut目录下
贴个配置文件的关系图:
原图:https://img2.imgtp.com/2024/05/14/dQ8fXzj2.png
下面进行逐一配置(原文件内容建议全清空再编辑)
【nut.conf】设置nut运行模式MODE=netserver
【ups.conf】配置ups驱动可执行nut-scanner -U得到以下信息复制粘贴,其中可自定义,为设备标识
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命令,可以尝试最小代码
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】配置服务器监听地址LISTEN 0.0.0.0 3493
【upsd.users】配置远程用户[ ]内为用户名,可自定义,示例中配置了一个管理员主账号admin/admin用于PVE连接,一个monuser/secret从账号用于群晖连接
password = admin
actions = SET
actions = FSD
instcmds = ALL
upsmon master
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>
看到这么长编大论有点眼花,还好群晖能即插即用。 看不懂,应该很厉害。
我编程技术差,只好用暴力方式来解决问题:
可以预期的最长停电时间是24小时。
96V 55Ah 电池组的储能是5.2度电,UPS转换效率80%,也就是24小时内可以放出4.2度电。
计算出,网络设备和NAS全部加一起,功率小于176W,就没有问题。 本帖最后由 kevinho86 于 2025-1-10 09:38 编辑
已解决编辑掉 BK650M2-CH 这款UPS感觉质量不怎么好,有电流声音,还有一点味道。但机器正常使用中。 xyz123456789zg 发表于 2024-5-14 17:20
BK650M2-CH 这款UPS感觉质量不怎么好,有电流声音,还有一点味道。但机器正常使用中。 ...
是的。我的就有过电流声,后面拆开来元件缝隙打胶解决了 Mufasa 发表于 2024-5-14 17:13
看不懂,应该很厉害。
我编程技术差,只好用暴力方式来解决问题:
这种是力大砖飞了,我的电池老了就不行,中负载只能续10分钟,只能一顿折腾让它尽快安全下线 mark一下 本帖最后由 skylong 于 2024-11-30 16:35 编辑
大佬,按你的教程,搞定了,感谢! 大佬,先收藏下,有时间再来测试 本帖最后由 zhouhuan18 于 2025-1-13 13:03 编辑
我发现断电后执行命令会报错
Jan 13 12:58:57 pve upssched: exec_cmd(/etc/nut/upssched-cmd power-off) returned 127
Jan 13 12:56:27 pve upssched: exec_cmd(/etc/nut/upssched-cmd stop-vm) returned 127 zhouhuan18 发表于 2025-1-13 13:00
我发现断电后执行命令会报错
这个我遇到过,我是用shell文件工具直接打开文件在windows编辑的,保存之后执行就报这个错,应该是编码问题,在shell里用nano直接编辑保存,再跑就没问题 本帖最后由 myzfl 于 2025-1-26 21:44 编辑
刚搜到你的帖子,我是esxi8,按照您的配置稍微修改下已经测试成功,可以让esxi关机 ,另外, /sbin/upsdrvctl shutdown 这条指令执行后,ups是不是立即就断电了?没看太明白! myzfl 发表于 2025-1-26 20:50
刚搜到你的帖子,我是esxi8,按照您的配置稍微修改下已经测试成功,可以让esxi关机 ,另外, /sbin/upsdrvc ...
不会立刻断电,根据我的ups型号,大概是2分钟后断电,但是执行这条指令的时候,ups必须为无市电状态,如果在这2分钟内恢复市电,2分钟后会从断电转为重启 大佬,UPS运作图是用什么软件做的啊 我用了两个延时继电器实现bk650市电自动开机,原理就是引出ups开关键,延时继电器功能就是在市电恢复2分钟后,接通UPS开关1秒,实现开机。至于自动恢复虚拟机,这个我设置5分钟没有市电就全部关机,UPS不关机,直至电量低,使用树莓派检测UPS状态,关机,然后关闭自身。gen8设置上电自动开机,市电恢复就全部自动启动了
页:
[1]