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

目录

起因

安装NUT

NUT简介

配置

ups配置 (nut-driver)

nut-server配置

nut.conf

upsd.conf

upsd.users

nut-client配置

upsmon.conf

设置自动启动

释疑


起因

配置了一台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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

和鲸社区数据分析每周挑战【第九十三期:特斯拉充电桩分布分析】

和鲸社区数据分析每周挑战【第九十三期&#xff1a;特斯拉充电桩分布分析】 文章目录 和鲸社区数据分析每周挑战【第九十三期&#xff1a;特斯拉充电桩分布分析】一、前言二、数据读取和初步探索三、数据探索及可视化1、获取拥有最多充电站的 10 个国家2、一年中各月新开业数量…

微软wsl2 + ubantu + docker + 部署本地项目

windows 操作系统版本要达到要求 开启 wsl2 安装实用工具 Windows Terminal 和 Visual Studio Code 安装 Ubuntu 子系统 安装 Docker Desktop 并让 Docker Desktop 基于 wsl2 来运行 基础环境准备可以完全参照《搭建 Laravel Sail 开发环境 - Windows》来进行&#xff0c;我跟教…

微信小程序基础使用-请求数据并渲染

小程序基本使用-请求数据并渲染 小程序模板语法-数据绑定 在js中定义数据 Page({data: {isOpen: true,message: hello world!} })小程序的data是一个对象&#xff0c;不同于vue的data是一个函数 在模块中获取使用数据 小程序中使用 {{}} 实现数据与模板的绑定 内容绑定&a…

Spring Boot整合JPA

文章目录 一、Spring Boot整合JPA&#xff08;一&#xff09;创建Spring Boot项目JPADemo&#xff08;二&#xff09;创建ORM实体类1、创建评论实体类 - Comment2、创建文章实体类 - Article &#xff08;三&#xff09;创建自定义JpaRepository接口 - ArticleRepository&#…

1.数据库的基本操作

SQL句子中语法格式提示&#xff1a; 1.中括号&#xff08;[]&#xff09;中的内容为可选项&#xff1b; 2.[&#xff0c;...]表示&#xff0c;前面的内容可重复&#xff1b; 3.大括号&#xff08;{}&#xff09;和竖线&#xff08;|&#xff09;表示选择项&#xff0c;在选择…

【Axure 教程】中继器(基础篇)

一、初识中继器 中继器是 Axure 中一个比较高阶的应用&#xff0c;它可以让我们在纯静态网页中模拟出类似带有后台数据交互的增删改查的效果&#xff0c;虽然它没有真正意义上帮我们存储任何的数据&#xff0c;但是当我们在一次项目体验过程中&#xff0c;它却可以给我们带来更…

如何获取HTTP请求时间与响应时间【附源码】

文章目录 一、问题描述二、抓包观察三、查找文档四、思考尝试五、精益求精六、源码解说 一、问题描述 今日遇到了一个问题&#xff0c;要去获取HTTP报文在请求和响应的时间&#xff0c;因为没有原生的API可以调用&#xff0c;所以需要一定的技巧~ 下面主体的框架和代码&#xf…

Vue中如何进行样式绑定?

Vue中如何进行样式绑定&#xff1f; 在Vue中&#xff0c;我们可以很方便地进行样式绑定。样式绑定是将CSS样式与Vue组件中的数据进行关联的一种技术。通过样式绑定&#xff0c;我们可以根据组件的状态动态地修改其外观。本文将介绍Vue中的样式绑定&#xff0c;包括类绑定、内联…

软件外包开发项目原型图工具

项目原型图工具有非常重要的作用&#xff0c;尤其是在APP项目开发中&#xff0c;对于整体需求的表达是必不可少的工具。相比于传统的文档需求&#xff0c;图形文字的表达可以更清楚的表达需求&#xff0c;让客户清楚的明白软件功能有哪些&#xff0c;最后的界面是怎样的&#x…

Haproxy搭建Web群集

Haproxy搭建Web群集 1.Haproxy相关概念1.1 Haproxy的概述1.2 Haproxy的主要特性1.3 常见的Web集群调度器 2.常见的应用分析2.1 LVS 应用2.2 Haproxy 应用2.3 LVS、Nginx、Haproxy的区别2.4 Haproxy调度算法原理 3. Haproxy命令行详解3.1 HAProxy服务的5个域3.2 Haproxy服务器配…

【无功优化】基于改进教与学算法的配电网无功优化【IEEE33节点】(Matlab代码时候)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

苹果新专利曝光:AirTags可以快速找到Apple Pencil

近日&#xff0c;据外媒报道&#xff0c;苹果一项新专利提出&#xff0c;苹果手写笔可以通过“声学谐振器”来帮助用户找出手写笔的位置。根据这项专利&#xff0c;苹果试图在手写笔的笔盖上加入一个被动元件&#xff0c;以响应特定的声波频率。iPhone、iPad或Apple Watch会发出…

插入排序代码

时间复杂度O&#xff08;n&#xff09;

Nik Color Efex 滤镜详解(2/5)

交叉冲印 Cross Processing 提供多种选项来处理 C41 - E6&#xff08;用幻灯片显影液处理彩色底片&#xff09;和 E6 - C41&#xff08;用彩色底片显影液处理幻灯片&#xff09;。 方法 Method 选择预设。 强度 Strength 控制滤镜效果程度。 黑暗对比度 Dark Contrasts 使用新…

六一,用前端做个小游戏回味童年

#【六一】让代码创造童话&#xff0c;共建快乐世界# 文章目录 &#x1f4cb;前言&#x1f3af;简简单单的弹球游戏&#x1f3af;代码实现&#x1f4dd;最后 &#x1f4cb;前言 六一儿童节。这是属于孩子们的节日&#xff0c;也是属于我们大人的节日&#xff08;过期儿童&…

Intellij IDEA设置“选中变量或方法”的背景颜色、字体颜色(Mark Occurrences)

背景 IDEA 中选中一个变量就会将所有的变量相关变量标出来&#xff0c;这样就很方便知道这个变量出现的地方。Eclipse里头把这个功能叫做 Mark Occurrences&#xff0c;IDEA 里不知道怎么称呼。 我们要解决的痛点就是提示不明显&#xff0c;如下图所示&#xff0c;Macbook这么…

LVS负载均衡群集

文章目录 LVS负载均衡群集1 企业群集1.1 群集cluster的定义1.2 解决办法1.3 企业群集分类1.4 概念1.4.1 负载均衡群集1.4.2 高可用群集1.4.3 高性能运算 群集 2 负载均衡2.1 负载均衡结构2.2 负载均衡群集工作模式2.2.1 NAT模式2.2.2 TUN模式2.2.3 DR模式 3 LVS虚拟服务器3.1 负…

LeetCode 892. Surface Area of 3D Shapes【数组,数学】简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

大数据基础平台实施及运维

一、大数据介绍 1、为什么使用大数据技术 数据量越来越大&#xff0c;数据分析的实时性越来越强&#xff0c;数据结果应用范围越来越广。&#xff08;从用户的访问量、量、访问时间、访问频率&#xff0c;市场可以得到很多信息&#xff09; 2、大数据的定义 数据收集、数据…

使用python制作一个批量查询搜索排名的SEO免费工具

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 搭建背景 最近工作中需要用…