前言
UPS全称叫做不间断电源(Uninterruptible Power Supply),旨在在市电突然断开后继续为设备提供电力支持,一方面可以保持机器正常工作而不受电力变化的影响,另一方也是为了避免磁盘和设备因突然断电而造成不可逆的伤害。特别是在打雷的时候,因为电压不稳而导致的跳电,现在的UPS除了能够提供电力输出以外还有对防雷电和电浪涌的侵袭,做到稳压的效果。特别是在家用电网中,电压不是非常稳定的,对于一些通信和资料敏感型的设备UPS就显得尤为重要。
因此购入了山特的UPS:SANTAK TGBOX-600。它还有个850的版本,只是电容量的区别而已,就没必要购入,600版本就已经完全可以胜任离市电后续保存关机工作了。
详细的参数和内容这里就不过多赘述了,有兴趣可以自行了解,推荐阅读顶部的参考文章
一、软件安装
LInux下可以使用NUT(Network UPS Tools)来实现管理UPS设备
在PVE下输入apt install nut
即可安装
二、软件配置
NUT的配置文件存放/etc/nut下面,一共有5个文件nut.conf、ups.conf、upsd.conf、upsd.users 、upsmon.conf、upssched.conf。
1、工作关系
nut其实是有多个工具的:nut-driver、nut-server、nut-monitor、nut-client、nut-cgi
第一个是用来连接UPS的;第二个是用来控制和管理UPS的;第三个是用来显示UPS的各类信息,包括型号,电量,负载等;第四个是客户端管理工具;第五个是图形化管理工具。
NUT是基于C/S的结构部署的,需要部署服务端和管理配置的客户端 。只要部署了一个服务端,就可以给多个客户端连接和显示UPS的信息,从而达到了多个设备共用一个UPS的效果,这对于有多个设备来说是非常方便的
2、配置文件
这里有一份官方的配置文件详解,有兴趣的可以去看看点我打开
nut.conf
nut.conf是负责配置nut的工作模式,一共有4个工作模式:none、standalone、netserver、netclient,默认、nut里面填写的是未配置的none,需要将其改为其他模式才可以工作,如果只是本设备一台使用的话,可以选择standalone;netserver是广播模式,可以允许多个设备检测和管理UPS;netclient是客户端模式,要与服务端做搭配使用。为了方便远程管理,这里我选择使用netserver模式
#其他配置全部删除
MODE=netserver
INIups.conf
ups.conf是负责管理UPS设备的,与nut-driver相适应,配置这里来添加UPS设备
添加UPS设备
输入nut-scanner
来显示你的UPS配置文件,将nutdev1整个配置复制到ups.conf里面,设备名字可以修改
#其他配置全部删除
#设置最大重试次数3
maxretry = 3
#重试间隔1s
pollinterval = 1
#你的UPS设备
[ups]
driver = "usbhid-ups"
port = "auto"
vendorid = "0463"
productid = "FFFF"
product = "SANTAK TG-BOX"
serial = "Blank"
vendor = "EATON"
bus = "001"
INInut-scanner
无法查找到设备
如果没有显示你的设备的话可以手动添加
输入lsusb | grep UPS
来找到你的UPS设备
记住它的设备ID号:0463:ffff,接下来和上面一样,添加设备
#配置同上
[ups]
driver = "usbhid-ups"
port = "auto"
vendorid = "0463"
productid = "FFFF"
INI这样就完成了UPS的配置
upsd.conf
这个文件是用来配置网络服务端开放监听的打开的,用来给客户端连接使用的
LISTEN 0.0.0.0 3493
#如果是单设备使用的话可以选择监听localhost 3493
INIupsd.user
upsd.user是负责服务端用户管理的文件,有两种用户、master和slave,可以分别设置权限关系,包括查看、修改、UPS的功能和电力供给情况。因为只是个人使用,因此只需要添加一个master用户就可以了
[用户名]
password = 密码
upsmon master
actions = SET
instcmds = ALL
INIupsmon.conf
这个是用来监测UPS的各项情况的,包括一些设置的修改和定时任务,如断电操作,低电量操作等,可以为其设置断电启动通知脚本,低电量是执行关机命令等工作。
#与upsd.user对应,负责使用该账号进行控制
MONITOR ups@localhost 1 用户名 密码 master
#localhost可以换成ip地址
##其他工作后续添加
INI最后重启一下服务就可以了
systemctl restart nut-driver@ups.service nut-server nut-monitor
INI[拓展]
如果无法正常使用的话可能是nut无法使用nut-driver的问题,可以尝试下面方面修复参考文章
创建文件/etc/udev/rules.d/90-nut-ups.rules
,添加下列内容
# Rule for a Cyberpower UPS
# 0764:0501为你的UPS设备号,请修改
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0764", ATTR{idProduct}=="0501", MODE="0660", GROUP="nut"
INI重启设备service udev restart
三、客户端接入
1、命令行
在安装了nut的设备上使用upsc来查看ups的工作状态
- 服务端:upsc ups
- 其他设备:upsc ups@192.168.1.1
其他设备需要在自己的中配置nut.conf为MODE=netclient,并重启nut-monitor服务
iStreOS的应用商店里面有个UPS,可以直接使用cgi它来管理你的UPS
四、设置UPS事件任务
前面我们配置好了服务器的连接工作,接下来我可以设置事件任务。nut在检测到各类事件(如断电、来电、低电量、警告等)会产生一个事件标志(Flags),这个信息也会在系统日志中输出,我们可以利用这些事件从而在发生异常情况的时候执行一些脚本来保护和通知我们,接下来全部配置都是写在upsmon.conf中
1、低电量自动关机
# 设置低电量时关机
BATTERYLEVEL 30
SHUTDOWNCMD "/sbin/poweroff"
FINALDELAY 120
POWERDOWNFLAG /etc/nut/powerdown.flag
INI这里的BATTERYLEVEL 30为低电量大小,SHUTDOWNCMD
表示低电量后要执行的命令,并120s后产生一个关机信号,来通知UPS断电,避免UPS一直开机将电量耗尽
2、日志通知
官网有详细写了如何实现日志通知的格式和类型
# 通知设置
NOTIFYFLAG ONLINE SYSLOG+WALL
NOTIFYFLAG LOWBATT SYSLOG+WALL
NOTIFYFLAG FSD SYSLOG+WALL
NOTIFYFLAG SHUTDOWN SYSLOG+WALL
INI这会在来电、低电量、关机、UPS关机、电脑关机时候向系统日志和wall写入日志
3、断电通知
这里要借助smtp服务,来实现邮件通知的功能,这里使用qq邮箱,其他邮箱类似
(1)、获取QQ邮箱STMP授权码
在QQ邮箱的右上角点击->账号于安全->安全设置->生成授权码来获取授权码
(2)、安装邮件发送软件包swaks
apt install swaks
INI(3)、编写通知脚本
创建脚本文件/etc/nut/notify-script.sh
,在里面粘贴
#!/bin/bash
# 邮件接收地址
TO="接收的邮箱@163.com"
SUBJECT="UPS 警告:市电断电"
BODY="警告:UPS 已切换到电池供电模式,市电已断开。请尽快检查电力供应。"
# SMTP 服务器信息
SMTP_SERVER="smtp.qq.com"
SMTP_USER="授权码邮箱@qq.com"
SMTP_PASS="授权码"
# 使用 swaks 发送邮件
swaks \
--to "$TO" \
--from "$SMTP_USER" \
--server "$SMTP_SERVER" \
--auth LOGIN \
--auth-user "$SMTP_USER" \
--auth-password "$SMTP_PASS" \
--tls \
--header "Subject: $SUBJECT" \
--body "$BODY"
INI需要修改的地方有三处:
- TO=”接收的邮箱@163.com”
- SMTP_USER=”授权码邮箱@qq.com”
- SMTP_PASS=”授权码”
(4)、设置断电通知
# 断电时执行脚本
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYCMD "/etc/nut/notify-script.sh"
INI在断电的时候写入系统日志并且执行脚本
upsmon.conf完整配置如下:
MONITOR ups@localhost 1 用户名 密码 master
# 通知设置
NOTIFYFLAG ONLINE SYSLOG+WALL
NOTIFYFLAG LOWBATT SYSLOG+WALL
NOTIFYFLAG FSD SYSLOG+WALL
NOTIFYFLAG SHUTDOWN SYSLOG+WALL
# 断电时执行邮件通知脚本
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYCMD "/etc/nut/notify-script.sh"
# 设置低电量时关机
BATTERYLEVEL 30
SHUTDOWNCMD "/sbin/poweroff"
FINALDELAY 120
POWERDOWNFLAG /etc/nut/powerdown.flag
ShellScript这样就可以完成断电提醒和低电量关机的配置了