设为首页 | 加入收藏

配置多个网络连接的OR USB APC不间断电源设备

 正如任何真正的IT极客都会同意的,UPS设备不仅在数据中心是关键设备,在家里也是如此。然而,大多数家庭用户无法获得一个巨大的10+ 千伏安 UPS,能够保护我们各种“个人设备”所连接的所有电路;相反,大多数家庭/小型办公室的UPS安装通常是一些小的桌面设备,通常容量在3kVA以下。在这种情况下,这些较小的设备通常分配给单个设备/区域,并且通常仅负责向一个设备发送 incoming utility power 的状态信号。

使用多个UPS设备为同一“工作区”的不同组件供电怎么样?或者在多个位置(因此每个位置都有自己的电池备用)都有接入点和交换机的家庭网络?如何监控多个分布式的电池备用装置(假定每个UPS装置只有USB连接)?

APC不间断电源

输入 apcupsd: “一个用于控制APC不间断电源的守护进程。” 不幸的是,该工具标语的复数形式表明它支持广泛的设备种类,而不是多个同时连接的设备。 截至目前,我发现了一篇文章描述了如何配置 apcupsd 以支持 多个 USB连接的UPS设备,但这真的不是很好看。 这个过程的大致内容如下:

  1. 配置udev规则以确保通过UPS序列号一致地映射到命名挂载点
  2. 为每个连接的UPS创建多个apcupsd配置文件
  3. 为每个UPS创建新的“动作”和“控制”脚本
  4. 重新配置 apcupsd init.d/系统脚本以启动多个守护进程实例(每个UPS一个)

我通常不喜欢在难以找到的位置创建大型“自定义”配置文件,并且与分发的软件包有很大的差异,因此这个过程对我来说有点“ hackey ”;特别是因为所有这些配置文件的最终结果是为了为每个UPS监控创建“隔离进程”。

将APCUPSD容器化

到目前为止,我决定采取一种不同的方法来隔离每个apcupsd进程:一种具有更高可发现性、版本控制潜力和可扩展性的方法。Docker。

我决定按照Debian Wiki上apcupsd指南中的第一步来操作(创建udev规则以确保物理设备在启动/连接时获得持久路径)。UPS设备通常安装在/dev/usb/hiddev*,所以我们应该确认我们有几个设备:

# ls /dev/usb
hiddev0  hiddev1

# lsusb
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 002: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

太好了!我们得到了一些看起来像 UPS 设备的 在 /dev/usb/hiddev0 和 /dev/usb/hiddev1 上的东西。 现在来获取序列号:

# udevadm info --attribute-walk --name=/dev/usb/hiddev0 | egrep 'manufacturer|product|serial'
    ATTRS{manufacturer}=="American Power Conversion"
    ATTRS{product}=="Back-UPS BX1500G FW:866.L5 .D USB FW:L5 "
    ATTRS{serial}=="8975309"
    ATTRS{manufacturer}=="Linux 4.4.0-170-generic ohci_hcd"
    ATTRS{product}=="OHCI PCI host controller"
    ATTRS{serial}=="0000:00:02.0"
# udevadm info --attribute-walk --name=/dev/usb/hiddev1 | egrep 'manufacturer|product|serial'
    ATTRS{manufacturer}=="American Power Conversion"
    ATTRS{product}=="Back-UPS NS 1100M2 FW:953.e3 .D USB FW:e3     "
    ATTRS{serial}=="8675310"
    ATTRS{manufacturer}=="Linux 4.4.0-170-generic ohci_hcd"
    ATTRS{product}=="OHCI PCI host controller"
    ATTRS{serial}=="0000:00:04.0"

已知的序列号,我们创建udev规则,将这些设备持久化到已知的映射点:

## FILE AT /lib/udev/rules.d/ups.rules

# SCREEN UPS
KERNEL=="hiddev*", ATTRS{manufacturer}=="American Power Conversion", ATTRS{serial}=="8975309", OWNER="root", SYMLINK+="usb/ups-screen"

# ComputeAndNetwork UPS
KERNEL=="hiddev*", ATTRS{manufacturer}=="American Power Conversion", ATTRS{serial}=="8675310", OWNER="root", SYMLINK+="usb/ups-compute-and-network"

现在重新运行udev规则:

udevadm trigger --verbose --sysname-match=hiddev*

现在,我们应该有一些“命名优美”的UPS USB设备:

# ls -la /dev/usb
total 0
drwxr-xr-x  2 root root    120 Dec 18 19:55 .
drwxr-xr-x 22 root root   4280 Dec 18 19:55 ..
crwxrwxrwx  1 root root 180, 0 Dec 18 19:55 hiddev0
crwxrwxrwx  1 root root 180, 1 Dec 18 19:55 hiddev1
lrwxrwxrwx  1 root root      7 Dec 18 19:55 ups-compute-and-network -> hiddev1
lrwxrwxrwx  1 root root      7 Dec 18 19:55 ups-screen -> hiddev0

太棒了! 现在,每当这些设备被插入/拔出时,我们不需要再猜测哪个是 hiddev0,哪个是 hiddev1,因为 udev 会自动为我们提供 命名的挂载点 ,这对接下来的步骤至关重要

接下来,我创建了一个docker-compose文件,包含三个我决定为这个设置需要的“服务”:

  • APCUPSD 用于“屏幕”不间断电源
  • APCUPSD 用于“计算和网络”不间断电源
  • Apache/Multimon 提供基于HTTP的接口

这个docker-compose文件还包含指向特定Dockerfiles以实际上为每个服务构建图像(提示:两个apcupsd服务使用相同的容器但有不同的配置)。

apcupsd容器只是最新的Alpine linux镜像;apcupsd来自apk仓库和一个非常轻量级 的apcupsd配置文件(配置为仅监控 – 后面会详细说明)/dev/ups

这个multimon容器使用最新的Apache/alpine镜像,并添加了apcupsd-webif来自 apk 仓库以及一些配置文件用于multimon。 此外,我编写了一个entrypoint.sh脚本来解析环境变量并生成一个配置文件用于multimon,这样可以在docker-compose文件中设置显示在网页界面上的UPS。

现在我们已经介绍了构建过程,让我们把docker-compose 服务组合在一起:

  • APCUPSD 镜像作为一个容器,带有 设备映射 从 ups-compute-and-network 主机到 /dev/ups 容器中
  • APCUPSD 图像作为容器与 设备映射 用于 ups-screen 在主机上 /dev/ups 在容器中
  • Multimon 与环境变量中包含的两个 APCUPSD 实例的服务名称 (docker-compose 服务在组合网络中可通过 docker-composeDNS 名称发现)

完整的Docker设置在此:https://github.com/crossan007/APCUPSD-Multimon-Docker

现在,我不会尝试创建自定义init脚本、在systemd中复用进程,以及覆盖apcupsd的配置发现机制,而是有一个明确定义的接口来隔离apcupsd的实例,为我的两个APC UPS设备提供状态页面。

感谢您的阅读,希望这能以某种方式帮助您!

地址:北京市昌平区枫丹丽舍西路2号楼116 邮编:100096 邮箱:batteryltd@sina.com
手机:13146158791
©CopyRight 官网授权 APC UPS(中国)运营中心