利用apcupsd自动开关电脑

家里有两台NAS,是用“惠普 HP MicroServer Gen8”搭建的,最近停电比较多,为了数据安全,入了一个APC的smart-ups,这个文就是介绍,在拥有USB的APC UPS上,通过APCUPSD软件实现停电自动关机。

  • NAS:MicroServer Gen8

[产品链接]1) [JD购买链接]2)

  • APC UPS:sua750ICH

[产品链接]3) [购买链接]4)

  • APC NMC2网络管理卡

[产品链接]5)

  • N16路由器

[产品链接]6)

  • TOMATO Shibby第三方固件

[固件链接]7)

  • openwrt第三方开源固件

[官网]8)

  • APCUPSD软件

[官网]9)



我这台SUA750ICH ups带有扩展口,可以插AP9631,也就是APC自家的网络管理卡,所以我就买了一张,这样直接提供了网络管理功能; 使用USB连接到运行openwrt的路由器,再将路由器接入网络,一样可以网络管理,只是要多一个路由器而已,仅此而已; 其实你甚至可以直接将UPS的USB连接到服务器,一样的;

这篇wiki基于利用USB接口 + openwrt做介绍;


UPS自动关机的软件最主流出名就是APCUPSD和NUT(network ups tool),前者是专门针对APC UPS的,后者是通用的,支持很多型号。我个人是APC UPS,NUT配置要麻烦些,所以就选择APCUPSD了。

APCUPSD 是开源软件,比PowerChute(官方自己的管理软件)更强大,可在Windows、Linux和MacOS等多个平台上运行(一些开源的路由器固件如 Tomato by Shibby 也集成了该软件),支持包括单机、局域网的内主/从机(可以让多台电脑接收到断电信息时自动关机)和多UPS等三种模式,借用官网的一张图片。

WDNR4300刷openwrt固件

下载固件进行刷机原厂固件刷到openwrt

将UPS和路由器用USB连接线相连(方口)

登录路由器web,设置密码 不然ssh登不上

  1. system > administration > 'ssh access'
    1. interface设置为LAN;
    2. 端口22;
    3. save & apply;

通过putty、ssh登录路由器安装apcupsd

配置好路由器的网络参数,让路由器能上网
opkg update #必须,负责不能安装软件
opkg install apcupsd #安装apcupsd
opkg info apcupsd #查看apcupsd信息

配置apcupsd

UPSNAME APC   #ups名字
UPSCABLE usb  #修为为usb
UPSTYPE usb   #修改为usb
DEVICE        #留空
MINUTES 3     #电池剩余为3分钟时关机
TIMEOUT 0
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 0.0.0.0  #监听ip
NISPORT 3551   #监听端口
EVENTSFILEMAX 10
UPSCLASS standalone
UPSMODE disable
STATTIME 0
LOGSTATS off
DATATIME 0

路由器开机配置

我使用的网络管理卡如果不开机重启下apcupsd,就获取不到信息,usb应该不会有这问题,但还是设置下吧

vim /etc/rc.local
/etc/init.d/apcupsd restart
exit 0

重启路由器再ssh登入路由器,通过apcaccess即可查看UPS当前的各种信息,这些信息是实现市电断开自动关机的关键。


3.1 Client上操作(linux)

#安装apcupsd
rpm -ivh http://mirrors.ustc.edu.cn/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum install apcupsd -y

3.1.1 配置apcupsd

vim /etc/apcupsd/apcupsd.conf

UPSCABLE ether
UPSTYPE net
DEVICE 10.1.1.75   //设置为server端,也就是openwrt路由器的IP
POLLTIME 10
ONBATTERYDELAY 6
BATTERYLEVEL 5   //剩余电量5%的时候自动关机
MINUTES 3       //剩余电量3分钟的时候自动关机
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 0.0.0.0
NISPORT 3551
EVENTSFILEMAX 10
UPSCLASS standalone
UPSMODE disable
STATTIME 0
LOGSTATS off
DATATIME 0
UPSNAME APC

3.1.2 修改/etc/apcupsd/apccontrol

这一步完全是个人自定义,不修改也就可以实现自动关机和自己开机了;

自动关机没问题,脚本就调用shutdown命令实现了,但是市电恢复后,服务器开机依赖于电脑BIOS里的一个设置,反正就是电源恢复后是否自动加电.

UPS使用电池供电时,没电了,就断电了,市电恢复,电脑检测到主板有+5V的电压了,就开机了。所以/etc/apcupsd/apccontrol脚本里都不是让linux主机关机之后并关闭电源,而已让系统halt,相当于只关机,不断电!

这样的设计是没问题的,但是我不喜欢,所以我就要改造一下了。

vim /etc/apcupsd/apccontrol

doshutdown)
echo "UPS ${2} initiated Shutdown Sequence" | ${WALL}
${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown"    //原来是-H,就是halt的意思,我要关机断电,所以-h。

3.1.3 改造后,另辟蹊径实现市电恢复自动开机

3.1.3.1 ssh登录openwrt路由器

  1. opkg update
  2. opkg install etherwake

3.1.3.2 创建shell脚本
vim /root/etherwake.sh

etherwake.sh
#!/bin/ash
##
apcaccess=/usr/sbin/apcaccess
UPS_LAST=/root/UPS_LAST
NOW=`$apcaccess |grep "STATUS"|cut -d: -f2|sed 's/ //g'`
server=10.1.1.100          #设置为你服务器的IP
MAC='aa:bb:cc:dd:ee:ff'    #设置为你服务器内网的MAC(可以唤醒的,提前测试下)
wol='/usr/bin/etherwake -i br-lan'
 
#Judgement the status of last utility power,if restored,wakeup servers.
if [[ -n "$NOW" ]] && [[ $NOW == ONLINE ]];then
        grep -q "ONBATT" $UPS_LAST
        if [[ $? == 0 ]];then
                ping -c 10 $server > /dev/null 2>&1
                if [[ $? != 0 ]];then
                        #WAKE UP server
                        sleep 10
                        $wol $MAC
                        #echo '666666666666666666666'
                fi
        fi
fi
#Record the status of the current utility power.
echo "$NOW" > $UPS_LAST
exit 0

3.1.3.3 设置定时任务

root@WNDR4300:~# cat /etc/crontabs/root
*/1 * * * * /root/etherwake.sh

3.1.4 重启apcupsd,设置开机启动

systemctl start apcupsd
systemctl enable apcupsd

3.1.5 在client上查看ups信息

运行apcaccess得到详细信息,如果不是这样,检查路由器的3551端口是否打开。

3.2 WINDOWS上安装APCUPSD

安装下面地址的APCUPSD WIN版本,然后参照上面的配置方法配置WIN版本,然后重启WINDOWS就可以看到效果
https://sourceforge.net/projects/apcupsd/files/win-binaries%20-%20Stable/



  • homelab/ups/利用apcupsd自动开关电脑.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)