找回密码
 加入我们
搜索
      
查看: 6172|回复: 13

[NAS] BK650M2-CH +NUT+ AIO NAS,摸索过的UPS停电自恢复方案分享

[复制链接]
发表于 2024-5-14 17:05 | 显示全部楼层 |阅读模式
本帖最后由 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安装:
  1. apt-get update
复制代码
针对PVE 7.x 8.x debian11/12:
手动安装2.7.4离线包:https://packages.debian.org/buster/nut
注意处理依赖和安装顺序
第2步:配置nut主要配置文件存在于/etc/nut目录下
贴个配置文件的关系图:
原图:

下面进行逐一配置(原文件内容建议全清空再编辑)
【nut.conf】设置nut运行模式
  1. MODE=netserver
复制代码

【ups.conf】配置ups驱动
可执行nut-scanner -U得到以下信息复制粘贴,其中[ups]可自定义,为设备标识
  1. [ups]
  2.         driver = "usbhid-ups"
  3.         port = "auto"
  4.         vendorid = "051D"
  5.         productid = "0002"
  6.         product = "Back-UPS BK650M2-CH FW:294803G -292804G"
  7.         serial = "9B232*******"
  8.         vendor = "American Power Conversion"
  9.         bus = "001"
复制代码
如果是离线安装的nut,可能会缺少nut-scanner命令,可以尝试最小代码
  1. [ups]
  2.         driver = "usbhid-ups"
  3.         port = "auto
复制代码
保存后可测试:upsdrvctl start ,得到的返回信息参考:
  1. Network UPS Tools - UPS driver controller 2.7.4
  2. Network UPS Tools - Generic HID driver 0.41 (2.7.4)
  3. USB communication driver 0.33
  4. Using subdriver: APC HID 0.96
复制代码
⚠️注意不能有其他报错信息


【upsd.conf】配置服务器监听地址
  1. LISTEN 0.0.0.0 3493
复制代码

【upsd.users】配置远程用户
[ ]内为用户名,可自定义,示例中配置了一个管理员主账号admin/admin用于PVE连接,一个monuser/secret从账号用于群晖连接
  1. [admin]
  2. password = admin
  3. actions = SET
  4. actions = FSD
  5. instcmds = ALL
  6. upsmon master

  7. [monuser]
  8. password = secret
  9. upsmon slave
复制代码


【upsmon.conf】配置ups状态动作
MONITOR行,配置nut-server连接信息,格式:设备标识@ip ups数量 账号 密码 master/slave
#SHUTDOWN 行已注释,改为下方配置/sbin/upssched为执行器
NOTIFYMSG 为状态消息通知
NOTIFYFLAG 为动作设定(系统日志+警告通知+执行器)
  1. RUN_AS_USER root
  2. MONITOR ups@localhost 1 admin admin master
  3. #SHUTDOWNCMD "/sbin/shutdown -h +0"
  4. NOTIFYCMD /sbin/upssched
  5. NOTIFYMSG ONLINE    "UPS %s on line power"
  6. NOTIFYMSG ONBATT    "UPS %s on battery"
  7. NOTIFYMSG LOWBATT    "UPS %s battery is low"
  8. NOTIFYMSG FSD        "UPS %s: forced shutdown in progress"
  9. NOTIFYFLAG ONLINE       SYSLOG+WALL+EXEC
  10. NOTIFYFLAG ONBATT       SYSLOG+WALL+EXEC
  11. NOTIFYFLAG LOWBATT      SYSLOG+WALL+EXEC
复制代码


【upssched.conf】配置任务计时器
CMDSCRIPT 行,配置脚本文件路径
PIPEFN LOCKFN 行,配置运行时产生文件的路径
⚠️3个路径最好相同,且该文件夹对nut用户可读写(不会就chmod -R 777)
计时器设置格式:
AT ups状态(ONBATT/ONLINE) * 开关计时器(START/CANCEL-TIMER) 任务名 秒数
  1. CMDSCRIPT /etc/nut/cmd/upssched-cmd
  2. PIPEFN /etc/nut/cmd/upssched.pipe
  3. LOCKFN /etc/nut/cmd/upssched.lock

  4. AT ONBATT * START-TIMER stop-vm 60
  5. AT ONBATT * START-TIMER power-off 180
  6. AT ONLINE * CANCEL-TIMER stop-vm
  7. AT ONLINE * CANCEL-TIMER power-off
  8. AT ONLINE * START-TIMER start-vm 10
复制代码


【upssched-cmd】配置计时器脚本
case选择语句,项名称对应upssched.conf中的任务名
建议使用nano等命令行编辑器编辑,避免格式问题导致运行报错
  1. #! /bin/sh

  2. case $1 in
  3.    stop-vm)
  4.       /usr/bin/pvesh --nooutput create /nodes/localhost/stopall
  5.       ;;
  6.    power-off)
  7.       /sbin/upsdrvctl shutdown
  8.       shutdown -h now
  9.      ;;
  10.    start-vm)
  11.        /usr/bin/pvesh --nooutput create /nodes/localhost/startall
  12.      ;;
  13.   *)
  14.     logger -t upssched "Unrecognized command: $1"
  15.     ;;
  16. esac
复制代码


第3步:验证配置
重启PVE主机

  1. systemctl status nut-monitor #查看日志是否有报错
  2. upsc ups@localhost #查看ups参数输出</div>
复制代码






ups运作图.png
不同系统安装nut组件.png

评分

参与人数 3邪恶指数 +30 收起 理由
witson + 20
kevinho86 + 5
Mufasa + 5 就是NB

查看全部评分

发表于 2024-5-14 17:06 | 显示全部楼层
看到这么长编大论有点眼花,还好群晖能即插即用。

点评

威联通都可以即插即用  发表于 2024-5-14 17:14
发表于 2024-5-14 17:13 | 显示全部楼层
看不懂,应该很厉害。

我编程技术差,只好用暴力方式来解决问题:

bbtte.jpg

可以预期的最长停电时间是24小时。

96V 55Ah 电池组的储能是5.2度电,UPS转换效率80%,也就是24小时内可以放出4.2度电。
计算出,网络设备和NAS全部加一起,功率小于176W,就没有问题。
发表于 2024-5-14 17:14 | 显示全部楼层
本帖最后由 kevinho86 于 2025-1-10 09:38 编辑

已解决编辑掉
发表于 2024-5-14 17:20 | 显示全部楼层
BK650M2-CH 这款UPS感觉质量不怎么好,有电流声音,还有一点味道。但机器正常使用中。
 楼主| 发表于 2024-5-14 17:22 | 显示全部楼层
xyz123456789zg 发表于 2024-5-14 17:20
BK650M2-CH 这款UPS感觉质量不怎么好,有电流声音,还有一点味道。但机器正常使用中。 ...

是的。我的就有过电流声,后面拆开来元件缝隙打胶解决了
 楼主| 发表于 2024-5-14 17:24 | 显示全部楼层
Mufasa 发表于 2024-5-14 17:13
看不懂,应该很厉害。

我编程技术差,只好用暴力方式来解决问题:

这种是力大砖飞了,我的电池老了就不行,中负载只能续10分钟,只能一顿折腾让它尽快安全下线
发表于 2024-5-15 06:30 | 显示全部楼层
mark一下
发表于 2024-11-30 12:49 | 显示全部楼层
本帖最后由 skylong 于 2024-11-30 16:35 编辑

大佬,按你的教程,搞定了,感谢!
Snipaste_2024-11-30_12-48-15.png
Snipaste_2024-11-30_12-48-28.png
发表于 2025-1-12 23:52 | 显示全部楼层
大佬,先收藏下,有时间再来测试
发表于 2025-1-13 13:00 | 显示全部楼层
本帖最后由 zhouhuan18 于 2025-1-13 13:03 编辑

我发现断电后执行命令会报错
  1. Jan 13 12:58:57 pve upssched[2698]: exec_cmd(/etc/nut/upssched-cmd power-off) returned 127
复制代码
  1. Jan 13 12:56:27 pve upssched[2698]: exec_cmd(/etc/nut/upssched-cmd stop-vm) returned 127
复制代码
 楼主| 发表于 2025-1-13 17:18 | 显示全部楼层
zhouhuan18 发表于 2025-1-13 13:00
我发现断电后执行命令会报错

这个我遇到过,我是用shell文件工具直接打开文件在windows编辑的,保存之后执行就报这个错,应该是编码问题,在shell里用nano直接编辑保存,再跑就没问题
发表于 2025-1-26 20:50 | 显示全部楼层
本帖最后由 myzfl 于 2025-1-26 21:44 编辑

刚搜到你的帖子,我是esxi8,按照您的配置稍微修改下已经测试成功,可以让esxi关机 ,另外, /sbin/upsdrvctl shutdown 这条指令执行后,ups是不是立即就断电了?没看太明白!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-2-2 17:20 , Processed in 0.013526 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表