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来配置一下这个脚本。

© ryougifujino 2021 - 2022