Proxmox VE下配合UPS使用的断电关机脚本
date
Sep 19, 2020
slug
Proxmox-VE下配合UPS使用的断电关机脚本
status
Published
tags
summary
前段时间买了一个APC的BK650M2-CH 390W/650VA UPS,来保护我的PVE主机。一开始我是想使用Apcupsd这个软件来达到断电检测关机的,可惜我这个UPS是新型号,尝试之后并不兼容,所以只好另辟蹊径。
type
Post
前言
前段时间买了一个APC的BK650M2-CH 390W/650VA UPS,来保护我的PVE主机。一开始我是想使用Apcupsd这个软件来达到断电检测关机的,可惜我这个UPS是新型号,尝试之后并不兼容,所以只好另辟蹊径。
自制脚本
然后我想到了PVE本身也是一个Linux系统,所以可以写一个Shell脚本来替代前述的软件。具体思路也很简单,每隔一段时间就去ping一下同一个子网下的路由器,如果没停电,肯定能ping通;如果停电了,肯定就ping不通了,这时候我们只需要执行关机指令就可以了。但具体编写的时候,考虑到路由器有时可能会有抽风或者重启等因素,所以设置了一个最大失败次数,达到失败次数才会真正的关机,最大的阻止了“假停电”情况导致PVE主机意外关机。
脚本放到了GitHub上,具体如下:
#!/bin/bash
target_ip=192.168.2.66
failure_count=0
shutdown_failure_count_threshold=15
while :
do
ping -c 1 $target_ip &> /dev/null
if [ $? -eq 0 ]; then
((failure_count=0))
else
((failure_count++))
fi
sleep 10s
if [ $failure_count -eq $shutdown_failure_count_threshold ]; then
/sbin/shutdown -hP now
break
fi
done
exit 0
这里的
target_ip
是我要ping的路由IP。注意shutdown
命令这里使用了绝对路径,为什么会这么做稍后会讲到。开机启动脚本
脚本编写完成后,我们需要在开机的时候自动运行它。我是将脚本放在
/usr/local/bin
目录下,注意脚本编写完成后要使用chmod +x
来使得脚本可执行。一开始我采用的开机启动脚本的方法是在/etc/rc.local
写入脚本路径,一开始运行良好,但某一天突然就失效了,所以后来换了第二种方法,具体如下:首先使用
crontab -e
(非root下要使用sudo crontab -e
),在其中写入@reboot /usr/local/bin/ups-safe-shutdown.sh &
。这样每次开机时就会启动这个脚本了。但随之而来有一个问题,由于crontab
的一些限制(或者说特性),直接在脚本中执行shutdown
是不会关机的,所以关机命令要使用绝对路径。结语
至此,PVE主机就可以在停电的时候安全地自动关机了。至于来电后的开机,我采用的是远程开机的方法,大多数主板基本上都是支持的。需要稍微配置一下,来让PVE系统支持这个功能。新建一个脚本
wake-on-lan.sh
,具体如下:#!/bin/sh
/sbin/ethtool -s enp1s0 wol g
注:enp1s0这个名称在PVE面板中系统->网络中可以找到
由于每次开机都需要配置这个命令,最后我们也要使用
crontab
来配置一下这个脚本。