一鱼多吃,通过NUTserver让多台机器同时使用同一个UPS:NUT主服务器配置篇
bilichu
编辑于 2024年04月09日 22:38
收录于文集
共6篇

前言:

因为之前折腾小主机+unraidAIO的时候已经boom了两次了,加上最近小区的供电不是特别稳定,就给家里的几台小主机上了UPS,但是一台UPS只有一个沟通口,三台主机莫不要用三台UPS?虽然两台PVE小主机都试过强制断电测试了,但是为了保险起见,也还是想给小主机装上UPS,奈何本人钱包不同意。

刚好网上看到了一个油管博主techno tim的NUTserver(Network ups tool)的配置指南,自己跟着做了一遍,最终实现用PVE作为主服务器,另一台PVE和Truenas作为从服务器,在断电时候可以顺序关机,并最终切段UPS电源的操作。(因为有出差需求,如果机器关机之后UPS没有切段电源,来电之后主机是不会来电自启的,所以需要在关机后切段UPS电源)

简单介绍一下我家的三台主机+ups的配置:

1台绿联DX4600pro刷的Truenas加1台EQ12和1台UM580,UPS是烂大街APC的BK650M,实测三台机器同时用电池供电的情况下,勉强可以撑18分钟,用来安全关机的时间还是比较充裕的。

为啥要折腾NUT server:

最简单的UPS配置一般就是一台UPS带一台主机,但是通过NUT的话,我们就可以用其中一台直接连接UPS的主机作为Master,并在断电的时候通过网络通知其从机进行安全关机。

类似这个样子

一般来说,主流的NAS系统都是可以兼任NUT的功能的,比如白裙和Truenas作为NUTserver的教程b站上都能搜到,但是Nas本身耗电量大,而且断电损坏风险更大,我个人认为还是不台适合用来作为NUT的主服务器的,所以我才想通过功耗更小,并且承担了主路由功能的EQ12小主机作为NUT的主服务器,让Truenas在断电之后立马关机,这样后续假设来电快的话,还可以再用Wake on lan来唤醒Truenas,将安全系数提高。

所以我们这次折腾的主要是用PVE作为主服务器的配置,如果你还是想用NAS作为主服务器的话,可以直接翻到后面去看客户端的配置方法。

本文虽然看起来很长,但是跟着走的话大概半小时就能搞定了,当时我折腾的时候也大概就花了半小时设置+半小时调试。

第一步:NUT主服务器的配置。

我们先将UPS通过USB线连接其中一台PVE主机,这个时候在控制台输入lsusb应该就可以看到UPS被列出来了。

APC的UPS

这个时候,我们可以开始安装nut,在控制台输入命令安装NUT server 和 NUT client

apt update && apt install nut -y

安装完成后,我们可以通过命令

nut-scanner -U

来查询UPS的具体信息,当然如果你有N台UPS连接同一个NUT server也是可以的,我家里只有一台UPS,扫描结果如下

接下来我们配置主服务器上的ups.conf,这个文件记录了连接主服务器的UPS的详细信息,在控制台输入

nano /etc/nut/ups.conf

进入配置文件后把刚才扫描到的信息全部填写进去。

pollinterval = 1 #可选信息,建议加入 maxretry = 3  #可选信息,建议加入 offdelay = 120  #可选信息,建议加入 ondelay = 240  #可选信息,建议加入 [ups] #这里的命名是自定义的,可以随便命名,下面的配置按照你的扫描结果填入。         driver = "usbhid-ups"         port = "auto"         vendorid = "051d"         productid = "0002"         product = "Back-UPS BK650M2-CH FW:294803G -292804G"         serial = "9B2323A24495"         vendor = "American Power Conversion"         bus = "001"

填写完成后类似这个样子,

然后我们可以按CTRL+x,然后y保存退出。

接下来我们修改nut.conf,这个文件定义了NUT的工作模式,在控制台输入

nano /etc/nut/nut.conf

进入配置文件,清空(或者不清空)并填写

MODE=netserver

这样这台PVE就成为主服务器了,如果是从服务器则可以改成MODE=netclient

类似这样

接下来我们配置upsd.conf,这个配置文件是配置主服务器的监听端口,输入

类似这样

这个时候我们在控制台输入 

接下来我们就可以配置NUT服务器的用户了,修改upsd.users

类似这个样子

然后配置upsmon.conf,这部分有点复杂,按标准文件配置即可

#指定NUT以什么身份运行,简单配置的话直接用root就可以了 RUN_AS_USER root  #这里的格式是 MONITOR {UPS的名称}@localhost {UPS数量} {账户名} {账户密码} {运行模式} #之前运行模式项有叫master的。但是最新版的NUT已经改成primary | secondary 了,估计是因为political correctness吧? MONITOR ups@localhost 1 upsmon ******* primary MINSUPPLIES 1 #这里按实际情况填写关机命令的地址,一般来说都在这个目录里面  SHUTDOWNCMD "/sbin/shutdown -h"  #这里有个小坑,因为这里配置的是NUT在接受到信号之后下一步指令的文件,需要配置upssched文件的实际路径,一般PVE环境下的路径是这个,如果后面你遇到坑,比如服务器没有按照实际指令运行的话可以回来检查一下这条命令是否配置正确。 NOTIFYCMD /usr/sbin/upssched  #下面配置照抄就可以了 POLLFREQ 4  POLLFREQALERT 2  HOSTSYNC 15  DEADTIME 24  MAXAGE 24  POWERDOWNFLAG /etc/killpower #以下部分是关于NUT在不同情况下需不需要通知你的配置,按实际需要增减即可。 #以下部分是关于NUT在不同情况下需不需要通知你的配置,按实际需要增减即可,SYSLOG+WALL+EXEC这个的意思是在主机和syslog上出现通知,并且执行 NOTIFYCMD /usr/sbin/upssched 这里配置的命令。

配置完成后保存并退出,这个时候输入命令

upsc ups@localhost

就可以查看到连接机器的ups的全部信息了

类似这样

接近尾声了,我们还需要配置两个文件,upssched.conf 和 upssched-cmd,这两个文件是NUTserver在UPS遇到不同情况下需要执行的命令的配置文件。

然后我们配置下一个文件

#!/bin/sh case $1 in         onbatt)                 logger -t upssched-cmd "UPS running on battery"                 ;;         earlyshutdown)                 logger -t upssched-cmd "UPS on battery too long, early shutdown"                  /usr/sbin/upsmon -c fsd                 ;;         #这条是电池电量低的时候自动关机,比如来电后如果电池还是低于警戒电量,系              统会重新关机,因为我有时候没办法重新开机,我只想确保主机能来电自启动,所            以我就删掉了下面这几行     shutdowncritical)                logger -t upssched-cmd "UPS on battery critical, forced shutdown"                                  /usr/sbin/upsmon -c fsd                 ;;         upsgone)                 logger -t upssched-cmd "UPS has been gone too long, can't reach"                 ;;         *)                 logger -t upssched-cmd "Unrecognized command: $1"                 ;; esac

类似这样

然后输入

这样主机就配置完成啦。然后重启主机或者依次运行下面命令来重新加载NUT服务。

当然你也可以通过

来查看可以修改的UPS参数,然后我们可以将低电量从默认的10%修改为30%

apt install apache2 nut-cgi -y

类似这样

到这里,我们的主服务器就配置完成啦。这个时候可以试试给UPS拔掉市电,PVE的控制台应该就会弹出相对应的信息。下一篇文章我们来看一下怎么配置接在同一个UPS上的其他主机的NUT客户端。