Linux UPS配置详解 (山特SANTAK TGBOX-850 )

news2024/11/16 12:02:50

起因

配置了一台All in One主机,系统是装的PVE,一个linux的虚拟机。里面装了openwrt软路由,还有OMV这个NAS系统。为了防止数据丢失,最好是配置一台UPS来保护数据,毕竟数据无价。于是买了一台山特的TGBOX-850。由于山特官方的winpower不支持linux系统,只能用NUT来对接。

安装NUT

apt update
apt install nut

NUT简介

nut 主要包含三个核心服务:

  • nut-driver: 这个服务负责通过特定放驱动来与 UPS 进行通信
  • nut-server: 该服务利用 nut-dirver 沟通 UPS, 并将 UPS 状态通过网络服务发布
  • nut-monitor(nut-client): 该服务连接 nut-server, 根据 UPS 状态做出特定响应
               nut-client
             ┌─────────────┐                  ┌────────────┐ nut.conf 只配置运行模式
       ┌──── │ nut-monitor │ ───────────────► │ nut-server │ upsd.*
       │     └─────────────┘                  └────────────┘
       │
       │                                            │
       │                                            │
       ▼                                            ▼
 ┌─────────────┐                              ┌────────────┐
 │  upssched   │                              │ nut-driver │ ups.conf
 └─────────────┘                              └────────────┘

        │                                           │
        │                                           │
        │                                           │
        ▼                                           ▼
┌────────────────┐                            ┌─────────────┐
│  user scripts  │                            │   UPS(HW)   │
└────────────────┘                            └─────────────┘

从上图可以看出,nut是基于C/S的设计,可以有多个client,对应这ups供电的多个设备,不过我这里只有1个设备需要用保护,就是我的AIO主机,其它多设备的情况请以此类推。

nut的默认配置文件位于 /etc/nut 目录,后面提及的配置文件没有写完整路径的话,都在该目录下

配置

首先将ups上电,并把usb线连上被保护的设备,我这里是pve的机子。首先确认驱动是否正常:

root@VM:~# lsusb
Bus 004 Device 002: ID 8087:8002 Intel Corp. 8 channel internal hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:800a Intel Corp. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 18f8:0f99 [Maxxter] Optical gaming mouse
Bus 002 Device 004: ID 0463:ffff MGE UPS Systems UPS
Bus 002 Device 003: ID 24ae:4005 Shenzhen Rapoo Technology Co., Ltd. Rapoo Gaming Keyboard
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

使用 lsusb 命令可以看到,我这里已经有了ups的驱动程序

如果你也是tgbox-850,那么在debian linux里面应该是没有驱动问题的。如果是其它ups,则需要先解决驱动问题。

ups配置 (nut-driver)

ups.conf 是 nut-driver 沟通ups硬件的配置

可以先执行 nut-scanner 得到一些信息

 那我的 ups.conf 内容如下:

root@VM:~# grep -v '^#.*' /etc/nut/ups.conf

maxretry = 3


[tgbox850]
    driver=usbhid-ups
    port=auto
    vendorid=0463
    desc="SANTAK TGBOX-850 UPS"
    pollinterval = 1
    override.battery.charge.low = 60

最后[tbgox850] 是需要我们手动添加的内容,可以参考上面的输出进行配置

其中  “override.battery.charge.low = 60” 是改变 ups 电量降到 60%的时候报低电量,默认这个是20,我这里是修改了一下,按自己的设备负载来计算就好

 tbgox850 是我取的ups名字,后面client来查询的时候需要用到

nut-server配置

nut.conf

主要定义 nut 的运行模式, 只有一个配置字段 MODE=xxx, 该配置可选值及含义如下:

  • none: nut未配置
  • standalone: 独立模式, 一般在只有一个 UPS 且只负责本地系统(不提供网络服务)的情况下使用
  • netserver: 跟独立模式类似, 会启动 driver、upsd 和 upsmon 服务, 不同之处是可以提供网络服务, 其他机器上的 nut-monitor 可以通过网络来连接 Nut Server
  • netclient: 仅客户端模式, 只启动 nut-monitor, 用于连接远程的 nut服务

我这里的环境设置成  stanalone 

MODE=standalone

upsd.conf

设置监听的网络端口,我这里只给本机用,因此只监听在 127.0.0.1,如果你要给其它机子来连,则最好将ip改成 0.0.0.0

LISTEN 127.0.0.1 3493

upsd.users

用于定义通过网络连接到 nut-server 的用户名和密码,这里的用户名并不是本地linux的账户,是自己随意指定的。client来连的时候使用它们进行认证而已,如果没有,hacker连接过来也能操作你的ups,那多悲剧。我的配置如下:

[monuser]
    password  = secret
    upsmon master

其中,monuser是用户名,而secret 就是对应的密码,这里的用户名和密码自己设定好即可。后面client端使用同样的用户名和密码就行。

nut-client配置

upsmon.conf

主要用于配置 nut-monitor 如何监控 UPS, 同时定义 UPS 出现哪些事件要进行怎样的处理动作

主要设置以下一些字段: RUN_AS_USER、MONITOR、POWERDOWNFLAG、SHUTDOWNCMD、NOTIFYCMD、NOTIFYFLAG

RUN_AS_USER: 以什么用户执行,我这里为了权限问题,用的是root

MONITOR:定义如何和nut-server沟通的动作,语法如下

MONITOR <system> <powervalue> <username> <password> ("master"|"slave")
  • <system>: nut-server 链接地址, 格式为 “UPS 名称” + “@” + “nut-server 地址”, 例如 myups@192.168.1.2
  • <powervalue>: UPS 数量, 大多数情况你只有一个 UPS 电源, 所以写 1 就行
  • <username>/<password>: 在 upsd.users 中定义的用户名和密码
  • master/slave: master 表示该系统将最后关闭, 让从属系统先关闭; slave 表示该系统立即关闭

我这里的设置如下

MONITOR tgbox850@localhost 1 monuser secret master

localhost就是127.0.0.1   tgbox850 是前面取的ups名字

POWERDOWNFLAG:改变POWERDOWNFLAG /etc/killpower

官方的解释如下:

upsmon creates this file when running in primary mode when the UPS needs to be powered off. You should check for this file in your shutdown scripts and call upsdrvctl shutdown if it exists.

SHUTDOWNCMD: 需要关机的时候调用的程序,想直接关机,而不做其它事情的话,可以写成

SHUTDOWNCMD "/sbin/shutdown -h +0"

如果想执行自己的脚本关机,则将引号内的内容改成你脚本的完整路径即可,记得给脚本增加执行权限。我这里是

SHUTDOWNCMD "/root/shutdown/ups-shutdown.sh"

NOTIFYCMD:用于配置在发生特定事件(如市电中断、UPS 处于低电量等)时执行的程序,通常使用upssched来间接调用用户脚本来实现。如果自己写脚本,需要对接server的参数,比较麻烦。

NOTIFYCMD /sbin/upssched

NOTIFYFLAG:需要与 NOTIFYCMD 配合使用; NOTIFYFLAG 指令负责指定一系列的 UPS 事件应该触发何种操作。语法如下:

NOTIFYFLAG <notify type> <flag>[+<flag>][+<flag>] ...

 <notify type> 表示事件类型, 可选类型如下:

  • ONLINE: UPS 在线, 即市电恢复时会触发
  • ONBATT: UPS 使用电池供电, 即市电中断时会触发
  • LOWBATT: UPS 低电量时会触发
  • FSD: UPS 正在被关闭(Forced Shutdown)
  • COMMOK: 与 nut-server 成功建立连接时触发
  • COMMBAD: 与 nut-server 建立连接失败(连接丢失)时触发
  • SHUTDOWN: UPS 发出关机指令触发
  • REPLBATT: UPS 需要更换电池时触发
  • NOCOMM: 无法与 UPS 建立连接(UPS未就绪)时触发

 <flag> 标志通常有四种, 多种组合时用加号(+)连接:

  • SYSLOG: 只打印 syslog
  • WALL: 在终端上弹出消息(/bin/wall)
  • EXEC: 调用 NOTIFYCMD 指定的命令, 并传递相关事件
  • IGNORE: 啥也不干, 忽略该事件

通常把自己感兴趣的事件写进去,我的如下:

NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG LOWBATT SYSLOG+EXEC
NOTIFYFLAG FSD SYSLOG+EXEC
NOTIFYFLAG COMMOK SYSLOG+EXEC
NOTIFYFLAG COMMBAD SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+EXEC
NOTIFYFLAG REPLBATT SYSLOG+EXEC
NOTIFYFLAG NOPARENT SYSLOG+EXEC

前面提到使用 upssched 来进行事件的监控操作,实际上我们想自己来写脚本监控,通过 upssched中转的配置是  upssched.conf,其内容如下:

CMDSCRIPT /etc/nut/upssched-cmd.sh
PIPEFN /run/nut/upssched.pipe
LOCKFN /run/nut/upssched.lock
#AT ONBATT * START-TIMER onbattwarn 180
#AT ONLINE * CANCEL-TIMER onbattwarn
AT ONLINE * EXECUTE ups-back-on-line
AT LOWBATT * EXECUTE lowbatt
AT SHUTDOWN * EXECUTE shutdown
AT REPLBATT * EXECUTE replace

以上配置表示 会调用 我们自己写的 /etc/nut/upssched-cmd.sh,并且会按不同的事件传递不同的参数给这个脚本,比如低电量的时候传递的参数是 lowbatt

以上注释的两行  #AT  表示在断电用电池供电时,启动一个180s的timer,如果3分钟内电又来了,则会取消这个timer,但是我觉得用处不是很大。

upssched-cmd.sh 的示例内容如下:

#!/bin/bash

logfil=/root/shutdown/log.txt
echo $(date +%Y-%m-%d" "%H:%M:%S) >> $logfil

case $1 in
    onbattwarn)
        logger -t upssched-cmd 'UPS 已经切换到电池供电, 准备安全关闭系统...'
        echo 'UPS 已经切换到电池供电, 准备安全关闭系统...' >> $logfil
        ;;
    ups-back-on-line)
        logger -t upssched-cmd '市电已恢复...'
        echo '市电已恢复...' >> $logfil
        ;;
    lowbatt)
        logger -t upssched-cmd 'UPS 电量不足, 立即关闭系统...'
        echo 'UPS 电量不足, 立即关闭系统...' >> $logfil
        ;;
    shutdown)
        logger -t upssched-cmd 'UPS 发出关机指令...'
        echo 'UPS 发出关机指令...' >> $logfil
        ;;
    replace)
        logger -t upssched-cmd 'UPS 需要换电池了...'
        echo 'UPS 需要换电池了...' >> $logfil
        ;;
    *)
        logger -t upssched-cmd "Unrecognized command: $1"
        echo "Unrecognized command: $1" >> $logfil
        ;;
esac

设置自动启动

上面已经将配置设置好了,但是nut还不会自动启动,设置自动启动的命令很简单

systemctl enable nut-driver nut-server nut-monitor

手动启动

systemctl start nut-driver nut-server nut-monitor

释疑

1. 最开始测试的时候,一开始断电就进入了关机流程,最后发现是ups电还没充够,一断电就低于设置的低电量,就开始跑关机流程了。可以通过 upsc 这个程序来查询ups的信息,当前就包括电量信息了

2. upssched-cmd.sh 监控到的shutdown 和 SHUTDOWNCMD的先后问题

经过测试,SHUTDOWNCMD 指定的程序会是最后调用的程序

3. 附上我的SHUTDOWNCMD 脚本内容

#!/bin/bash

source /etc/profile

echo $(date +%Y-%m-%d" "%H:%M:%S) >> /root/shutdown/log.txt
echo "UPS detect shutdown " >> /root/shutdown/log.txt


echo $(date +%Y-%m-%d" "%H:%M:%S) >> /root/shutdown/log.txt

if [ -e  /etc/nut/killpower ]
then
  upsdrvctl shutdown
fi

echo "UPS start shutdown directly" >> /root/shutdown/log.txt

running="status: running"

#close 101

qmst=`qm status 101`
if [ "$qmst" = "$running" ]
then
  rm -f /run/lock/qemu-server/lock-101.conf
  qm unlock 101
  qm stop 101
  echo "force shutdown 101 now" >> /root/shutdown/log.txt
else
  echo "101 not running" >> /root/shutdown/log.txt
fi


#close 100

qmst=`qm status 100`
if [ "$qmst" = "$running" ]
then
  rm -f /run/lock/qemu-server/lock-100.conf
  qm unlock 100
  qm stop 100
  echo "force shutdown 100 now" >> /root/shutdown/log.txt
else
  echo "100 not running" >> /root/shutdown/log.txt
fi

sleep 19

sync

sync

halt -p

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【群智能算法改进】基于动态折射反向学习和自适应权重的改进麻雀搜索算法[4]【Matlab代码#39】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. SSA算法2. 改进SSA算法2.1 动态折射反向学习策略2.2 自适应权重策略 3. 部分代码展示4. 仿真结果展示5. 资源获取说明 【获取资源请见文章第5节&#xff1a;资源获取】 1. SSA算法 2. 改进SSA算法 2.1 动态折射反向…

局域网内不同网段的设备互相连接设置

目录 介绍1、打开网络连接&#xff0c;找到本地网络->属性->ipv4->属性->高级&#xff1a;2、在高级设置页面&#xff0c;我们添加一个IP&#xff0c;这个IP和板子在一个网段&#xff0c;我这里设置的是192.168.253.101&#xff1a;3、设置完成即可生效&#xff0c…

从0打1 用node express vite搭建一个博客系统系列(完结)

项目使用了Node后端、Express和Vite搭建的全栈博客系统系列&#xff0c;将Vue 2项目重构为Vue 3版本。该系统包含了以下主要模块和功能&#xff1a; 登录和注册功能&#xff1a;用户可以通过注册账号和登录来访问博客系统。 分类列表&#xff1a;展示不同分类的文章&#xff…

编译LeGo-LOAM,并且采用速腾聚创激光雷达与之相连

目录 一、LeGo-LOAM部署二、速腾聚创激光雷达调试三、将速腾聚创激光雷达连到LeGo-LOAM四、解决LeGo-LOAM不保存pcd地图的问题 一、LeGo-LOAM部署 参考链接&#xff1a;实车部署采用速腾聚创RS16激光雷达的LeGo-LOAM LeGO-LOAM初探&#xff1a;原理&#xff0c;安装和测试 1.g…

C语言基础--整型int,长整型long,浮点型double float

本文讲解常见的C语言变量,并举出一些实例 从微软的C语言文档把所有的C语言可定义(就是能用的)截图展示: 还有好几页,不放了,看着都头疼 但是,往往用的最多的,也就是下面的(本篇只讲整数和浮点数) int 整数 整数的定义不用说了吧QAQ int a = 10; //定义一个…

深度学习应用篇-计算机视觉-视频分类[8]:时间偏移模块(TSM)、TimeSformer无卷积视频分类方法、注意力机制

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

本周大新闻|Vision Pro头显重磅发布;苹果收购AR厂商Mira

本周XR大新闻&#xff0c;上周Quest 3发布之后&#xff0c;本周苹果MR头显Vision Pro正式发布&#xff0c;也是本周AR/VR新闻的重头戏。 ​AR方面&#xff0c;苹果发布VST头显Vision Pro&#xff08;虽然本质是台VR&#xff0c;但以AR场景为核心&#xff09;以及visionOS&…

Qt动态调用(外部调用)SDK库(dll动态库)

Qt动态调用SDK库&#xff08;dll动态库&#xff09; ​​​​​​​ 之前的文章&#xff0c;介绍了Qt调用sdk库的方式&#xff0c;大家可以点击查看&#xff08;Q调用SDK库(dll动态库)&#xff09;之前的文章&#xff0c;里面介绍的调用方式就是静态的调用方式。如下图所示&am…

NLP:BIG-bench基准任务的简介、安装、使用方法之详细攻略

NLP&#xff1a;BIG-bench基准任务的简介、安装、使用方法之详细攻略 目录 BIG-bench基准任务的简介 1、BIG-bench基准任务的概述 2、BBL BIG-bench基准任务的安装 BIG-bench基准任务的使用方法 1、使用SeqIO加载BIG-bench json任务的快速启动 BIG-bench基准任务的简介 …

Jmeter常用参数化技巧总结!

说起接口测试&#xff0c;相信大家在工作中用的最多的还是Jmeter。 JMeter是一个100&#xff05;的纯Java桌面应用&#xff0c;由Apache组织的开放源代码项目&#xff0c;它是功能和性能测试的工具。具有高可扩展性、支持Web(HTTP/HTTPS)、SOAP、FTP、JAVA 等多种协议。 在做…

libVLC 调节图像(亮度、对比度、色调、饱和度、伽玛)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 对于一个视频来说,色彩和画面效果的呈现非常重要。假如你的画面偏暗或偏亮,缺乏层次感,色彩不够丰富或不自然,则需要根据场景和氛围进行调整。 所涉及的重要参数有: 亮度: 是视频画面的明暗程度。调整…

静态通讯录

文章目录 前言&#x1f31f;一、明确通讯录信息/步骤&#x1f30f;1.1.通讯录信息&#x1f30f;1.2.通讯录多文件写法的好处&#x1f30f;1.3.通讯录多文件写法 &#x1f31f;二、通讯录的实现&#x1f30f;2.1.通讯录的菜单部分&#x1f30f;2.2.通讯录的框架部分&#x1f30f…

centos卸载mysql5.7安装mysql8.0

一、参考 CentOS7安装MySQL8的超级详细教程(无坑!)_Mysql_脚本之家 云服务器Centos7.9卸载 MySQL5.7.x 或 MySQL8.x 教程_centos 卸载mysql_大白有点菜的博客-CSDN博客 二、centos卸载mysql5.7 1、查看MySQL的依赖安装组件 rpm -qa|grep -i mysql 2、 依次移除&#xff08…

Canvas实现缩放+涂鸦改进

几个月以前&#xff0c;有人问了我一个canvass怎么实现缩放和涂鸦的问题&#xff0c;我基于当时的想法写了一篇博客&#xff0c;但是后来发现当时做的不完善&#xff0c;所以实现上其实还是有一些其他问题的。但是因为前段时间太忙了&#xff0c;也就一直没有机会去改进它。现在…

超详细:实现 Swift 与 汇编(Asm)代码混编并在真机或模拟器上运行

功能需求 虽然现在  开发的绝对主角是 Swift 语言&#xff0c;不过我们也希望有时 Swift 能够调用小段汇编代码以完成特殊功能。 在本篇博文中&#xff0c;您将学到如下内容&#xff1a; Swift 与 汇编语言混编的基本原理&#xff1b;如何在模拟器中使用 Swift x64 汇编指…

小黑带领阿黄中老黑一起跑步完成了小怪兽,晚上一起吃烤肠西瓜,买了帐篷准备一起露营的leetcode之旅:438. 找到字符串中所有字母异位词

小黑代码 class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:# 串p长度n_p len(p)# 串s长度n_s len(s)# 计数字典flags collections.Counter(p)# 统计字典map_ dict((k, 0) for k in p)# 匹配到的字符个数count 0# 头尾指针left right 0# 目标数…

Python给一个exe执行文件注册持续性的快捷键(热键)的代码实例

本篇文章主要讲解通过python给一个exe文件绑定一个快捷键、并取消快捷键(热键)的实操方法。 日期:2023年6月11日 作者:任聪聪 实现按下快捷键即可启动软件的效果说明 启动软件注册热键呼出其他软件或本体的效果说明: 演示材料说明:在download文件目录下存放一个可执行的…

数据结构与算法之美 | 栈

栈结构&#xff1a;后进者先出&#xff0c;先进者后出 栈是一种“操作受限”的线性表 当某个数据集合只涉及在一端插入和删除数据&#xff0c;并且满足后进先出、先进后出的特性&#xff0c;这时我们就应该首选“栈”这种数据结构 栈的实现 使用数组实现&#xff1a;顺序栈…

【数据结构】二叉树(一)

目录 一、树的概念及结构 1、树的概念 2、树的相关概念 3、树的表示 二、二叉树概念及结构 1、二叉树的概念 2、特殊二叉树 3、二叉树的性质 4、二叉树的存储结构 4.1 顺序存储结构 4.2 链式存储结构 三、二叉树顺序结构及实现 1、二叉树的顺序结构 2、堆的概念及结构 3、堆…

OMG--RTPS(Real Time Publish Subscribe Protocol)

OMG--RTPS&#xff08;Real Time Publish Subscribe Protocol&#xff09; 1 概述2 内容缩写DDS 有线协议的要求RTPS 有线协议The RTPS Platform Independent Model (PIM)The Structure ModuleThe Messages ModuleThe Behavior ModuleThe Discovery Module The RTPS Platform S…