住宅主机UPS断电自动备份关机:零基础配置教程
为什么需要UPS自动关机?
住宅主机(比如NAS、家庭服务器)在断电时,如果只靠UPS供电,电池耗尽后系统会直接掉电——轻则损坏文件系统,重则导致硬盘坏道或数据丢失。
配置UPS断电自动备份+关机,可以在电池耗尽前完成数据保存并安全关闭系统,避免一切风险。
准备工作
- 一台支持USB/串口通信的UPS:多数家用UPS(如APC、CyberPower、山特)都带USB数据线,没有的话需要额外购买。
- 一台运行Linux的住宅主机(本文以Ubuntu 20.04为例,其他发行版命令大同小异)或者Windows主机(后文会提替代方案)。
- UPS与主机用USB线连接,并确认主机已识别设备(通常显示为
/dev/usb/hiddev0或/dev/ttyUSB0)。
如果使用群晖/威联通NAS,它们自带UPS管理功能,直接在控制面板配置即可,不需要手动安装NUT。本文面向自行搭建Linux主机的用户。
安装与配置NUT
NUT(Network UPS Tools)是通用的UPS管理软件,免费开源。
1. 安装NUT
sudo apt update
sudo apt install nut nut-client nut-server
2. 检测UPS连接
插入USB线后,运行 lsusb 查看UPS是否识别。
再执行:
sudo nut-scanner -U
它会输出类似:
[ups]
driver = "usbhid-ups"
port = "auto"
vendorid = "051d"
productid = "0002"
记下 vendorid 和 productid,后面配置需要。
3. 配置NUT
编辑 /etc/nut/ups.conf,添加UPS定义:
[myups]
driver = usbhid-ups
port = auto
vendorid = 051d
productid = 0002
desc = "Home UPS"
编辑 /etc/nut/upsd.conf,监听本地连接:
LISTEN 127.0.0.1 3493
LISTEN ::1 3493
编辑 /etc/nut/upsmon.conf,设置用户和关机条件:
MONITOR myups@localhost 1 nutuser secret master
SHUTDOWNCMD "/sbin/shutdown -h +0" # 当电池低电量时立即关机
NOTIFYCMD /sbin/upsmon
NOTIFYFLAG ONBATT SYSLOG+EXEC
创建用户 nutuser,设置密码(这里的 secret 要改为你自己设的密码):
sudo useradd nutuser
sudo passwd nutuser
然后将用户加入 nut 组:
sudo usermod -aG nut nutuser
编辑 /etc/nut/upsd.users:
[nutuser]
password = secret
upsmon master
4. 设置备份与关机脚本
在断电且电池低电量时,upsmon 会执行 SHUTDOWNCMD,但我们还希望在关机前先执行备份操作。
修改 SHUTDOWNCMD 为自定义脚本:
SHUTDOWNCMD "/usr/local/bin/ups-safe-shutdown.sh"
创建脚本 /usr/local/bin/ups-safe-shutdown.sh:
#!/bin/bash
# 备份重要数据(示例:打包 /home/user/important 到 /backup)
tar -czf /backup/emergency_backup_$(date +%Y%m%d%H%M).tar.gz /home/user/important
# 然后关机
/sbin/shutdown -h +0
赋予执行权限:
sudo chmod +x /usr/local/bin/ups-safe-shutdown.sh
5. 启动NUT服务
sudo systemctl enable nut-server nut-monitor
sudo systemctl start nut-server nut-monitor
检查服务状态:
sudo systemctl status nut-monitor
测试模拟断电
- 拔掉UPS的市电输入(注意:不要拔主机电源线),只让UPS通过电池供电。
- 观察主机是否收到断电通知(可在
/var/log/syslog中看到类似UPS on battery)。 - 等待电池电量下降到设定阈值(默认约30%),应该触发关机脚本,执行备份并关机。
- 也可以手动模拟低电量:用NUT命令强制设置电池电量为临界值。
# 查看UPS状态
upsc myups@localhost
# 强制模拟低电量(危险,仅在测试时用)
upsrw -s battery.charge=10 myups@localhost -u nutuser -p secret
测试完成后,重新接通市电,开机检查备份文件是否生成。
常见问题与避坑
- Q: 执行
nut-scanner没发现UPS?
检查USB线是否数据线(有些充电线不通数据),换一个USB口,或重启主机。
- Q: 关机脚本没有执行?
查看 /var/log/syslog 中 upsmon 的日志,确认是否触发了低电量事件。
如果阈值过高,修改 /etc/nut/upsmon.conf 中的 BATTERYLEVEL 和 MINSUPPLIES。
- Q: Windows用户怎么办?
Windows下可以使用UPS厂商自带的软件(如APC PowerChute、CyberPower PowerPanel)或开源软件 WinNUT(Windows版NUT客户端)。
配置思路类似:设置USB通信、定义脚本。
- Q: 电池老化后容量不准怎么办?
定期校准UPS(按说明书操作),并在upsmon中设置保守的关机电量(如剩余20%)。
- Q: 多个主机共享一个UPS?
NUT支持网络监控,将master主机配置为服务器,其他主机作为slave。
本文仅介绍单机场景。
结语
通过NUT软件,你可以在断电时让住宅主机自动备份重要数据并安全关机,不用再担心数据丢失或硬件损坏。
建议首次设置后,找一个周末实际断电测试一次,确保脚本和配置都正确。
如果遇到问题,先查看系统日志(journalctl -u nut-monitor),再对照本文指南排查。
如果你使用的是群晖或威联通NAS,它们的UPS管理功能更简单——直接用配套软件即可。
本教程适用于自行搭建Linux主机的场景,也适用于部分支持NUT的Windows环境。