UPS 可以在断电时立即切换到后备电池,然后通知 pve 执行关机指令。主要是防止硬盘在突然断电后损坏。

UPS 挑选 #

功率、后备时间一起决定了你的设备在停电后还能运行多久。一个经验是,功率尽量选择比主机电源功率大一点的。

通信协议常见的是USB,插上主机就能使用,另外也要考虑能和什么监控软件配合工作,比如常见的 apcupsdnut,建议购买前咨询客服支持什么软件,如果不确定建议选知名厂商的 UPS,这样对软件的兼容性最好。以下以apcupsd为例。

apcupsd 配置 #

安装 apcupsd

apt update && apt install apcupsd

编辑 apcupsd.conf

## apcupsd.conf v1.1 ##

UPSCABLE usb

## 对于usb将DEVICE留空实现自动检测
UPSTYPE usb
DEVICE

## 轮询UPS的时间
POLLTIME 30

## 当 apcupsd 检测到市电中断时,它会等待 x 秒后,才会触发 onbattery 事件。
ONBATTERYDELAY 6

## 剩余多少电量执行关机
BATTERYLEVEL 25

## 剩余多少分钟可用时执行关机
MINUTES 10

## 断电多少秒后直接关机,0=禁用,通常用于测试
## 此选项会覆盖BATTERYLEVEL/MINUTES
TIMEOUT 30

## 断电等事件日志文件
EVENTSFILE /var/log/apcupsd.events

KILLDELAY 0
LOCKFILE /var/lock
UPSCLASS standalone
UPSMODE disable

应用配置

systemctl restart apcupsd.service

执行 apcaccess 命令查看UPS状态:

APC      : 001,028,0653
DATE     : 2025-08-26 00:04:35 +0800
HOSTNAME : pve
VERSION  : 3.14.14 (31 May 2016) debian
UPSNAME  : pve
CABLE    : USB Cable
DRIVER   : USB UPS Driver
UPSMODE  : Stand Alone
STARTTIME: 2025-08-25 22:20:49 +0800
MODEL    : Offline UPS
STATUS   : ONLINE           ## 状态 
LOADPCT  : 11.0 Percent     ## 估计的已用负载百分比
BCHARGE  : 93.0 Percent     ## 当前电池容量百分比
TIMELEFT : 33.3 Minutes     ## 估计的电池剩余运行时间
MBATTCHG : 25 Percent       ## 系统关机所需的最低电池电量百分比
MINTIMEL : 10 Minutes       ## 系统关机所需的最短电池运行时间(分钟)
MAXTIME  : 30 Seconds
OUTPUTV  : 224.0 Volts
DWAKE    : -1 Seconds
ALARMDEL : 30 Seconds
LINEFREQ : 50.0 Hz
NUMXFERS : 0
TONBATT  : 0 Seconds
CUMONBATT: 0 Seconds
XOFFBATT : N/A
SELFTEST : NO
STATFLAG : 0x05000008
SERIALNO : 000000000
END APC  : 2025-08-26 00:04:41 +0800

阻止 UPS 关机 #

市电中断后,默认情况下 apcupsd 将在 pve 关机的最后一步通知 UPS 关机,如果你希望 UPS 继续运行为其他设备供电,可以覆盖这个行为。

编辑/etc/apcupsd/killpower

#!/bin/sh
## 由于此时文件系统为只读,任何日志操作将不起作用,所以我们什么都不做。
exit 99

赋予执行权限:

chmod +x /etc/apcupsd/killpower

行为解析:

  1. 市电中断,apcupsd创建一个/etc/apcupsd/powerfail文件(服务重启后由/lib/apcupsd/prestart删除)。
  2. 执行关机流程,在关机的最后一步触发/usr/lib/systemd/system-shutdown/apcupsd_shutdown
  3. 判断是否存在powerfail文件,触发/etc/apcupsd/apccontrol killpower
  4. 判断是否存在/etc/apcupsd/killpower文件并执行,如果返回值是99则不会执行/sbin/apcupsd --killpower

一些信息查看 #

## 查看apcupsd电源事件日志
root@pve:~# cat /var/log/apcupsd.events
2025-08-22 21:22:55 +0800  apcupsd 3.14.14 (31 May 2016) debian startup succeeded
2025-08-22 22:01:48 +0800  Communications with UPS restored.

## 查看上次关开机后的最后5条输出,如果是正常关机应该会显示以下信息
root@pve:~# journalctl -b -1 -n 5
Aug 22 20:35:36 pve systemd[1]: Shutting down.
Aug 22 20:35:36 pve systemd-shutdown[1]: Syncing filesystems and block devices.
Aug 22 20:35:36 pve systemd-shutdown[1]: Sending SIGTERM to remaining processes...
Aug 22 20:35:36 pve systemd-journald[545]: Received SIGTERM from PID 1 (systemd-shutdow).
Aug 22 20:35:36 pve systemd-journald[545]: Journal stopped