如何设置家用威联通 NAS UPS 断电后自动关机并通知其他设备?

场景

📝备注:

求轻喷, 求放过. 😅

我真的是个理线方面的白痴. 这已经是我的极限了. 😂

我的家庭实验室 Homelab 服务器集群配置如下.

上半部分之前已经介绍过了, 这里就不再赘述了. 今天重点介绍介绍 UPS 和 NAS 部分.

  • 1台 UPS, 型号为 APC Back-UPS 650. 插座插着: NAS 和 插线板(插线板上连了4个 N100小主机和其他; 通过数据端口和 NAS 连接). 如下图: (求轻喷, 求放过. 😅)

  • 1 台威联通 QNAP TS-453Bmini NAS. 如下图: (求轻喷, 求放过. 😅)

现在的需求是:

  1. UPS 断电后一段时间(如 5min 后), NAS 自动断电;
  2. NAS 作为 UPS Server 运行, UPS 断电后, 通知其他 4 台 N100 小主机
  3. 4 台 N100 小主机收到通知后, 也过一段时间(如 5min 后)自动断电.

具体实现概述如下:

  1. 物理层面: UPS 通过数据线连接到 NAS USB
  2. 软件层面:
    1. NAS: 通过 UI 配置断电后操作;
    2. NAS: 通过 UI 启用 UPS Server 配置;
    3. N100 小主机: UPS Client 配置.

细节步骤如下:

实战

1. 物理层面: UPS 通过数据线连接到 NAS USB

这里我就不放图了, 因为就在上面那一堆线里面... 这个机柜在墙角, 我左跪右跪看了一圈也没找到能拍清楚的角度... 😅

APC UPS 自带一根数据线, 具体操作如下:

使用 USB 缆线将 Back-UPS 连接到 NAS。将一端插到 Back-UPS 后面板上的 POWERCHUTE 端口,另一端插到计算机上的 USB 端口。

就是下图的 ⑥:

完成.

验证

完成后, 我们可以访问 威联通 QNAP QTS 界面, 会看到 UPS 的相关信息, 具体如下:

接下来进入软件层面操作.

2. NAS: 通过 UI 配置断电后的操作

具体如下:

  1. 进入 威联通 QNAP QTS 界面;
  2. 访问 控制台 -> 系统 -> 外界设备 -> UPS
  3. 选择 USB 连接 -> 当电源失效时, 10 分钟后进入自动保护模式. (当然, 你可以选择另一选项, 即: 关闭 NAS)

如果你只需要 UPS 和 NAS 联动, 那么到这里就配置完成了.

3. NAS: 通过 UI 启用 UPS Server 配置

如果你还需要和其他主机/服务器联动, 那么需要通过 UI 启用 UPS Server 配置, 具体如上图 ⑥:

  1. 启用 网络不间断电源服务器(即 UPS Server)
  2. 并添加 4 台 N100 小主机的 IP 地址. 如: 192.168.3.154

完成.

额外说明

威联通 QNAP QTS 在后台, 实际上运行的是: upsd 服务, 监听了 3493 端口. 如下:

bash 复制代码
[admin@NAS33657A ups]# netstat -tuln | grep 3493
tcp        0      0 0.0.0.0:3493            0.0.0.0:*               LISTEN      
[admin@NAS33657A ups]# ps -ef|grep ups
 6960 admin       996 S   grep ups
14369 admin      1764 R   /usr/local/ups/bin/usbhid-ups -a qnapups -u admin
15999 admin      1536 S   /usr/sbin/upsd -u admin
23676 admin      8548 S   /usr/sbin/upsutil

这里我们需要知道的是:

  1. QNAP UPS Server 的 名称是:qnapups

威联通 QNAP QTS 的 UPS 配置, 具体位于 /etc/config/ups/ 目录下, 如下:

bash 复制代码
[admin@NAS33657A ups]# ls
ups.conf  upsd.conf  upsdrv.map  upsd.users  upsmon.conf

[admin@NAS33657A ups]# cat upsd.users
[admin]
                password = 123456
                allowfrom = localhost
		        actions = SET
		        instcmds = ALL
                upsmon master           # or upsmon slave

这里我们需要知道的是:

  1. QNAP UPS Server 的用户是:admin
  2. 密码是: 123456

总结一下, 威联通 QNAP QTS Server 信息:

  1. 实际上运行的是: upsd 服务
  2. 监听了 3493 端口
  3. UPS Server 的 名称是:qnapups (🐾 注意: 在威联通所有 NAS 上, 这个名字都是固定的)
  4. 用户是:admin
  5. 密码是: 123456

后面 N100 配置 UPS Client 需要用到这些信息.

4. N100 小主机: UPS Client 配置

我的 N100 小主机是 Ubuntu 24.04, 要在 Linux 系统上实现与 UPS(不间断电源)服务器的交互,并在断电 5 分钟后自动关机,通常需要使用 UPS 监控软件。常见的工具是 NUT(Network UPS Tools),它是一个开源的 UPS 监控和管理工具。

既然已经在 NAS 上运行了 upsd,并且 UPS 是 APC Back-UPS 650 通过 USB 连接到 NAS,那么在小主机上,可以通过配置 NUT 客户端(upsmon)来与 NAS 上的 upsd 交互,并实现断电 5 分钟后关机。

以下是详细的步骤:

4.1. 在 Linux 设备上安装 NUT 客户端

在需要监控 UPS 的 Linux 设备上,安装 NUT 客户端工具:

  • 对于基于 Debian/Ubuntu 的系统:

    bash 复制代码
    sudo apt-get update
    sudo apt-get install nut-client
  • 如果你是基于 Red Hat/CentOS 的系统:

    bash 复制代码
    sudo yum install nut-client

4.2. 配置 NUT 客户端

在 Linux 设备上,编辑 NUT 客户端的配置文件 /etc/nut/upsmon.conf,添加以下内容:

bash 复制代码
MONITOR qnapups@nas_ip 1 admin 123456 slave
  • qnapups:这是 QNAP NAS 上 UPS 的名称(🐾 注意: 在威联通所有 NAS 上, 这个名字都是固定的)。
  • nas_ip:NAS 的 IP 地址。
  • admin:NAS 上定义的用户名。
  • 123456:NAS 上定义的密码。
  • slave:表示这台设备是客户端,不是主控设备。

4.3. 设置断电后关机

/etc/nut/upsmon.conf 中,添加以下行以设置断电 5 分钟后关机:

bash 复制代码
SHUTDOWNCMD "/sbin/shutdown -h +5"

4.4. 设置 NUT 运行模式

/etc/nut/nut.conf 中, 有 4 种运行模式, 分别为:

  1. none: NUT 没有配置,或者使用集成电源管理,或者使用一些外部系统来启动 NUT 组件. 因此,不需要由 NUT 软件包捆绑的脚本或服务启动任何内容。
  2. standalone: 这种模式只针对本地配置,由 1 个 UPS 保护本地系统。这意味着要启动 3 个 NUT 层(驱动程序、upsdupsmon)及相应的配置文件。这种模式还可以处理 UPS 冗余。
  3. netserver: 与独立配置相同,但还需要一些额外的网络访问控制(防火墙、tcp包装器)以及在 upsd.conf 中可能需要一个特定的 LISTEN 指令。由于此模式对网络开放,因此应特别关注安全问题。 -- 很明显, NAS UPS Server 是这种模式.
  4. netclient: 这种模式只要求upsmon(以及它可能使用的工具,如upssched或自定义脚本)来监视远程NUT服务器,并可能关闭此系统(在这种情况下,upsmon的一部分必须以root身份运行)。-- 很明显, 我们需要设置 Linux 设备为此模式.

调整 mode 配置为:

ini 复制代码
MODE=netclient

4.4. 启动 NUT 客户端服务

启动 upsmon 服务并设置为开机自启:

  • 对于基于 systemd 的系统:

    bash 复制代码
    sudo systemctl start nut-client
    sudo systemctl enable nut-client
  • 对于基于 SysVinit 的系统:

    bash 复制代码
    sudo service nut-client start
    sudo update-rc.d nut-client defaults

查看启动状态:

4.4.1 报错修复

这里第一次启动后报了1个错误, 具体如下:

  1. Failed to open '/usr/lib/tmpfiles.d/nut-common-tmpfiles.conf': No such file or directory
bash 复制代码
❯ sudo systemctl status nut-client.service
○ nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller
     Loaded: loaded (/usr/lib/systemd/system/nut-monitor.service; enabled; preset: enabled)
     Active: inactive (dead) since Sat 2025-03-22 17:12:20 CST; 8s ago
   Duration: 5ms
    Process: 347996 ExecStartPre=/usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/nut-common-tmpfiles.conf (code=exited, status=1/FAILURE)
    Process: 347998 ExecStart=/sbin/upsmon -F (code=exited, status=0/SUCCESS)
   Main PID: 347998 (code=exited, status=0/SUCCESS)
        CPU: 15ms

Mar 22 17:12:20 n100-jumper-2 systemd[1]: Starting nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller...
Mar 22 17:12:20 n100-jumper-2 systemd-tmpfiles[347996]: Failed to open '/usr/lib/tmpfiles.d/nut-common-tmpfiles.conf': No such file or directory
Mar 22 17:12:20 n100-jumper-2 systemd[1]: Started nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller.
Mar 22 17:12:20 n100-jumper-2 nut-monitor[347998]: upsmon disabled, please adjust the configuration to your needs
Mar 22 17:12:20 n100-jumper-2 nut-monitor[347998]: Then set MODE to a suitable value in /etc/nut/nut.conf to enable it
Mar 22 17:12:20 n100-jumper-2 systemd[1]: nut-monitor.service: Deactivated successfully.

所以执行如下命令修复:

bash 复制代码
sudo touch /usr/lib/tmpfiles.d/nut-common-tmpfiles.conf

启动后再次运行, 没有报错:

bash 复制代码
❯ sudo systemctl status nut-client.service 
● nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller
     Loaded: loaded (/usr/lib/systemd/system/nut-monitor.service; enabled; preset: enabled)
     Active: active (running) since Sat 2025-03-22 17:15:21 CST; 2s ago
    Process: 350296 ExecStartPre=/usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/nut-common-tmpfiles.conf (code=exited, status=0/SUCCESS)
   Main PID: 350298 (upsmon)
      Tasks: 2 (limit: 18754)
     Memory: 3.6M (peak: 3.8M)
        CPU: 22ms
     CGroup: /system.slice/nut-monitor.service
             ├─350298 /lib/nut/upsmon -F
             └─350310 /lib/nut/upsmon -F

Mar 22 17:15:21 n100-jumper-2 systemd[1]: Starting nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller...
Mar 22 17:15:21 n100-jumper-2 systemd[1]: Started nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller.
Mar 22 17:15:21 n100-jumper-2 nut-monitor[350298]: fopen /run/nut/upsmon.pid: No such file or directory
Mar 22 17:15:21 n100-jumper-2 nut-monitor[350298]: Could not find PID file to see if previous upsmon instance is already running!
Mar 22 17:15:21 n100-jumper-2 nut-monitor[350298]: Using power down flag file /etc/killpower
Mar 22 17:15:21 n100-jumper-2 nut-monitor[350298]: UPS: qnapups@192.168.3.216 (secondary) (power value 1)
Mar 22 17:15:21 n100-jumper-2 nut-monitor[350310]: Init SSL without certificate database

4.5. 测试配置

4.5.1 检查 UPS 状态

在 Linux 设备上,使用以下命令检查是否能够正确获取 UPS 状态:

bash 复制代码
❯ upsc qnapups@192.168.3.216
Init SSL without certificate database
battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 50
battery.date: not set
battery.mfr.date: 2019/12/10
battery.runtime: 1140
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 13.7
battery.voltage.nominal: 12.0
device.mfr: APC
device.model: Back-UPS 650
device.serial: 3B1950X62634  
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ttyS1
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: APC HID 0.96
driver.version.internal: 0.41
input.sensitivity: low
input.transfer.high: 266
input.transfer.low: 165
input.transfer.reason: input voltage out of range
input.voltage: 226.0
input.voltage.nominal: 220
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.firmware: 822.A3.I
ups.firmware.aux: A3
ups.load: 38
ups.mfr: APC
ups.mfr.date: 2019/12/10
ups.model: Back-UPS 650
ups.productid: 0002
ups.serial: 3B1950X62634  
ups.status: OL
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: 051d

如果配置正确,你应该能够看到 UPS 的详细信息,例如电池状态、输入电压等。

4.5.2 模拟断电测试

你可以通过断开 UPS 的电源来测试配置是否正确。如果一切正常,Linux 设备应该在断电 5 分钟后自动关机。

全部完成! 🎉🎉🎉


5. 其他注意事项

  • 防火墙配置 :确保 NAS 的防火墙允许来自 Linux 设备的 3493 端口的连接。
  • 权限问题 :如果你是其他 NAS, 需要确保 NAS 上的 upsd.users 文件中定义的权限允许客户端设备访问 UPS 信息。
  • 时间同步:确保 NAS 和 Linux 设备的时间同步,以避免因时间差异导致的监控问题。

总结

通过以上步骤,你应该能够实现:

当 UPS 断电后:

  1. NAS 自动关机
  2. 其他 Linux 设备 自动关机

🎉🎉🎉

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

相关推荐
桥边驿语人2 小时前
Docker 容器无法访问外网的问题排查与解决指南
运维·docker·容器
清静诗意2 小时前
在 Ubuntu 上通过 Docker 与 Docker Compose 部署项目的完整指南
linux·ubuntu·docker
阿里云云原生2 小时前
阿里云发布《AI 原生应用架构白皮书》
云原生
阿里云云原生3 小时前
阿里云 AI 中间件重磅发布,打通 AI 应用落地“最后一公里”
云原生·rocketmq
阿里云云原生4 小时前
从“看得见”到“能决策”:Operation Intelligence 重构企业智能运维新范式
云原生
小Lu的开源日常5 小时前
如何使用 GitHub Action 发布 Docker 镜像
docker·开源·github
神秘人X7076 小时前
docker安装
docker·容器·eureka
zzz.106 小时前
Calico 网络插件在 K8s 集群的作用
网络·云原生·kubernetes
失因6 小时前
Docker 容器与镜像
java·运维·spring cloud·docker·容器
耳东哇6 小时前
sentinel docker gateway k8s 集群 主从
docker·gateway·sentinel