使用 apcupsd 监控您的 UPS

作者:Riccardo Facchetti

计算机,像任何其他类型的电子设备一样,对公用电源质量非常敏感。根据美国电力转换公司 (American Power Conversion) 的定义(见表 1),电源异常可以分为电压骤降(俗称电压降低)、停电、尖峰、浪涌和噪声。这些电源事件可能会损坏您的电子设备,或者如果允许通过电源供应到敏感设备,则可能导致数据丢失。

表 1. 电源异常

解决所有或部分这些电源异常的方案是将不间断电源 (UPS) 连接到敏感设备。UPS 功能的关键是电池,它像一个缓冲器一样使用,在公用电源正常时积累电力,并在低电压或停电事件期间释放电力。对于高电压事件,UPS 通常配备滤波电子设备,能够降低电压。UPS 输出功率保证为正弦交流电,并保持在公用电源规格范围内。

虽然 UPS 本身可以解决公用电源异常的直接问题,但当停电发生时,UPS 的电池会持续使用,并且其放电时间与施加在 UPS 输出端的负载成正比。显然,如果停电时间足够长,电池电量最终将完全耗尽,并停止向连接的设备供电。

如果计算机连接到电量耗尽的 UPS,它将因断电而遭受系统崩溃,就像公用电源遭受停电事件一样。为了克服这个问题,目前市场上大多数 UPS 都具有内置接口,用于与其计算机通信状态并接收来自计算机的命令。此接口传统上是串行端口,但现在的 UPS 正在配备 USB 接口。

UPS 警报

由于本文是关于 apcupsd 的,我们将重点关注美国电力转换公司 (APC) 品牌的 UPS。其他制造商的 UPS 具有相同的总体行为,但迄今为止,apcupsd 尚不与非 APC UPS 通信。

UPS 协议必须完成两个主要任务。第一个也是最重要的任务是异步通知电源事件何时发生。第二个任务,也许不太重要,是允许计算机查询 UPS 的状态信息。

表 2 列出了 APC UPS 通过串行线路发送到计算机的 UPS 事件。查看此表,我们发现其中一些事件对于公用电源异常期间的计算机完整性至关重要。

表 2. UPS 事件

现在让我们看看最重要的事件是如何工作的。在图 1 中,以简化的形式描述了 UPS 的状态机。当公用电源存在时,UPS 会监控其故障。如果检测到故障,UPS 会向计算机发送线路故障警报,并将自身切换到电池供电。此时,计算机由 UPS 的电池供电。UPS 开始监控电池电源故障。如果公用电源恢复,UPS 会发送从线路故障返回警报,并切换回公用电源。如果电池电量下降到低于安全水平,UPS 会发送即将关机警报,并在设定的时间后自行关闭。

Monitoring Your UPS With apcupsd

图 1. UPS 状态机

在计算机端,UPS 发送的警报非常重要,因为它们可以用于决定在公用电源异常期间要执行的操作。当 UPS 切换到电池供电时,拒绝用户登录可能是明智的。当 UPS 即将关闭时,关闭计算机操作系统非常重要。UPS 通常会在定义的延迟后关闭,在某些情况下,这个延迟甚至可以配置,并且这个延迟通常足够长,允许计算机自行关闭。

现在很清楚为什么仅仅拥有 UPS 本身并不意味着我们的计算机是安全的。为了真正安全,计算机必须不断监控 UPS,并且必须能够响应 UPS 警报采取行动。

监控软件:apcupsd

APC 在其目录中提供了许多不同的 UPS 监控软件包。不幸的是,在 1996 年和 1997 年我们需要它时,没有适用于 Linux 的 APC 软件。如今,至少有四种 Linux 产品可以从 APC ftp 服务器下载,包括此处描述的 apcupsd。

简史

1996 年末,Andre M. Hedrick 启动了一个名为 apcupsd 的 Linux 项目,这是一个守护进程,其目的是监控 APC UPS 的电源警报,并在需要时关闭计算机。该软件的开发之所以成为可能,是因为从互联网收集的信息,以及直接分析 APC 的协议。

在购买了 Smart UPS v/s 650 后,我于 1997 年 10 月加入了该项目,我仍然拥有该 UPS。但是,由于年事已高,它的电池现在已经没电了。(非常感谢 APC 给了我一个新的 Smart UPS 1400INET,让我能够继续开发 apcupsd。)

从一开始,apcupsd 就已获得 GNU 通用公共许可证 (GPL) 的许可。选择 GPL 许可证是因为 apcupsd 旨在成为适用于任何人的软件,完全源代码免费分发,并提供其开发人员能够提供的最佳支持。

1998 年年中,APC 提出的法律问题迫使 Andre 从其公共场所移除 apcupsd,并将其作为仅二进制软件包分发,从其源代码中删除了 GPL 许可证。这在接下来的一年中引起了互联网社区的许多讨论。

1999 年 4 月 7 日,APC 撤回了其法律异议,并开始积极帮助我们的团队。这使得 apcupsd 能够恢复其原始许可证。如今,APC 在我们的开发邮件列表中监控我们的项目,并在技术问题上提供帮助。

1999 年 9 月,Kern Sibbald 加入了该项目。作为一名经验丰富的软件开发人员,他很快成为 apcupsd 的主要开发人员之一。

操作理论

apcupsd的主要任务是持续监控 UPS 状态,并根据从中接收到的信息采取行动。当然,在现实生活中,这并没有那么简单。

apcupsd必须在操作系统服务加载的启动时运行:事实上,apcupsd 只是另一个 OS 服务。通常,apcupsd 作为守护进程(即在后台)以 root 权限运行,以便能够采取保持计算机健康所需的行动。通常,它在系统进入多用户模式时由系统启动脚本运行。

由于其与操作系统的紧密关系,源代码树包含启动和关闭脚本的自动安装。在编译阶段,apcupsd、初始化和控制脚本会针对本地操作系统进行自定义。让我们看看哪些系统文件被修改,以及 SuSE Linux 系统中 apcupsd 的安装过程安装了哪些新文件。

apcupsd 的主 init 脚本文件安装在

/sbin/init.d/apcupsd

此脚本负责在系统启动期间启动 apcupsd,并在系统关闭期间关闭 apcupsd。它还象征性地链接到以下路径

/sbin/init.d/rc2.d/K20apcupsd
/sbin/init.d/rc2.d/S20apcupsd
/sbin/init.d/rc3.d/K20apcupsd
/sbin/init.d/rc3.d/S20apcupsd
它们仅在运行级别 2 和 3 上存在,因为 apcupsd 仅在多用户运行级别中运行;这意味着 SuSE Linux OS 上的运行级别 2 或 3。

为了能够在电源故障时正确关闭计算机,apcupsd 依赖于其自己的服务脚本,该脚本位于

/etc/apcupsd/apccontrol

以及一个已修补的 halt 脚本。当 apcupsd 检测到需要紧急关机的情况时,它首先创建两个名为 /etc/nologin/etc/apcupsd/powerfail 的文件。

然后它启动系统关机。apcupsd 将在此阶段被系统杀死。紧急情况下需要 no login 文件来禁止用户登录,而系统关机期间需要 power-fail 文件。/sbin/init.d/halt.local 使用它,如清单 1 所示。此脚本将在主 halt 脚本运行后在系统关机期间运行。当关闭连接到故障 UPS 的计算机时,我们必须确保在所有进程都被杀死并且系统磁盘被卸载之后,UPS 电源才会被移除。为了做到这一点,apcupsd 安装修改了 halt.local 文件以执行所需的操作。如果在系统关机期间 power-fail 文件存在,则所有进程都会被杀死,然后所有本地磁盘都会重新挂载为只读,最后我们向 UPS 发送电源关机命令。最终效果是,首先,系统处于安全状态,然后才关闭 UPS 电源。

计算机也会因断电而关闭,但其主开关按钮仍保持在 ON 位置。当公用电源恢复时,UPS 将在延迟一段时间以确保电源稳定后,打开输出电源,计算机将自动重启。在这些操作期间,无需用户干预。

清单 1

运行 apcupsd

当 apcupsd 运行时,它首先初始化串行端口并尝试确定是否连接了 UPS。一旦找到 UPS,它就会派生出许多子进程,每个子进程执行特定的任务。这是一个设计决策,因为 apcupsd 必须同时执行许多事情。

主 apcupsd 进程创建一个 IPC 共享内存池和一个 IPC 信号量,然后派生 apcmain 任务,成为守护进程,然后退出。apcmain 的工作是派生所有其他异步任务,等待子进程终止,并侦听信号。它充当看门狗,以避免僵尸进程或丢失信号,它通过使用 wait() 系统调用来简单地做到这一点。

在成为守护进程后,apcmain 会派生更多进程,具体取决于配置文件中选择的配置。图 2 显示了 apcupsd 启动后的操作。让我们详细了解一下它们。

Monitoring Your UPS With apcupsd

图 2. 启动操作

如果 UPS 在运行 apcupsd 的计算机本地,则启动的第一个任务是 apcser。此任务侦听串行端口的 UPS 警报,并与 UPS 通信以收集了解 UPS 状态所需的所有信息。在此配置中,apcser 是系统上运行的最重要的进程,因为除了与 UPS 通信外,它还执行在电源故障期间安全运行和关闭计算机所需的所有操作。此外,此任务还会生成写入系统和私有日志文件的报告,以供历史记录之用。

此外,如果 apcupsd 被要求充当网络信息服务器,它将启动 apcnis。 apcnis 是一个任务,它接受来自网络上客户端的连接,并将从 UPS 收集的信息传递给它们。

如果保护本地计算机电源的 UPS 是从网络上的远程计算机管理的,则 apcmain 任务将启动 apcslv 任务,而不是启动 apcser。apcslv 是一个从属任务,它位于套接字上,等待来自 apcupsd 远程主机的连接。此进程是联网 apcupsd 从属的最重要任务。当网络主机将 UPS 的警报发送给从属时,apcslv 执行与 apcserial 执行的相同的操作例程。这意味着从其主机接收到电池耗尽警报的从属将关闭计算机,以确保数据和硬件安全。

最后,如果 UPS 是本地的,并且它为连接了其他从属计算机的公用线路供电,apcupsd 将启动 apcmst,即网络警报的主进程。apcmst 的任务是以定义的时间间隔将 UPS 的状态发送给每个配置的从属。对于从属来说,它也非常重要,因为如果 UPS 向计算机发送警报,apcmst 会绕过超时并立即将它们报告给从属。通过这种方式,我们可以确保从属几乎立即收到电源警报。

有趣的是,apcupsd 进程通过 IPC 共享内存区域和信号量相互通信。这意味着 apcupsd 将无法在没有 System V IPC 或某些等效项(例如内存映射文件)的计算机上运行。

Apupsd 配置

在运行 apcupsd 之前,有必要配置守护进程,使其能够根据本地硬件配置和所需行为进行工作。在标准安装中,配置文件位于

 /etc/apcupsd/apcupsd.conf

此文件是一个纯 ASCII 文件,其中包含 apcupsd 所需的所有配置指令。

必须先正确配置指令,apcupsd 才能正常运行。使用这些指令,您可以指定电缆类型、连接到计算机的 UPS 型号、UPS 连接的设备、电源故障时的操作方式、日志记录选项等等。

独立配置

典型的独立配置包括一台计算机和一个连接到其串行端口的 UPS。

清单 2

清单 2 显示了连接到计算机第一个串行端口的独立 SmartUPS 的配置文件。在电源故障时,当电池电量降至满电量的 5% 以下或 UPS 剩余运行时间降至三分钟以下时(以先发生者为准),apcupsd 将关闭计算机。apcupsd 将每五分钟向用户控制台发送消息,并在电源故障发生一分钟后发送第一条消息。apcupsd 不会在电源故障期间禁止用户登录。UPS 事件记录在 /etc/apcupsd/apcupsd.events 中。可以从我们的 CGI 接口或 /etc/apcupsd/apcupsd.status 读取 UPS 状态,该状态每分钟更新一次。

联网配置

当您拥有一个为多台计算机供电的 UPS,并且您希望保护每台计算机免受电源故障的影响时,您可以配置 apcupsd 作为网络主/从服务工作。清单 3 和 4 描述了如何将 apcupsd 配置为主机和从机,以便在发生电源故障时同时关闭它们。

清单 3

清单 4

主 apcupsd 的配置如上文独立配置中所述,但 NETACCESS 配置指令现在为 true,并且主机会使用端口 6666 与从机通信。apcupsd 主机将连接到 my.network.slave.com 上的从机,以便通信警报和电源事件。从 apcupsd 共享相同的配置,只是它将侦听 my.network.master.com 以获取正确运行所需的所有信息,而不是使用串行端口。

高级配置

apcupsd 配置非常灵活。但是,除了这种灵活性之外,您还可以配置您的控制脚本以执行自定义操作,甚至可以配置您的 UPS eeprom 以满足您的需求。

自定义 apcupsd 操作

当 apcupsd 检测到来自您的 UPS 设备的异常时,它将做出一些决策,这些决策通常会导致一次或多次调用位于 /etc/apcupsd/apccontrol 中的脚本。apccontrol 文件是一个 shell 脚本,它将 apcupsd 传递给它的第一个参数来执行操作。这些操作默认设置为所有 apcupsd 可能从 UPS 检测到的可能情况的合理行为。尽管如此,您可以更改每个操作的 apccontrol 行为。为此,只需创建一个与您要自定义的操作同名的文件,该操作作为第一个参数传递(argv[1],或 shell 脚本的 $1)。将您的脚本放在 /etc/apcupsd/ 目录中。apccontrol 可以识别的参数如表 3 所示。

表 3. apccontrol 识别的参数

清单 5

例如,如果您想为电池供电操作编写自己的例程,您可以编写自己的 shell 脚本,如清单 5 所示,名为 onbattery 并将其放在 /etc/apcupsd/ 目录中。这样做将在默认操作之前运行自定义脚本。如果您不希望执行默认操作,请使用退出代码 99 终止您的自定义脚本。如果您想编写自定义脚本来替换默认行为,我们鼓励您编辑 apccontrol 脚本,并在您自己的脚本中至少模仿其行为。请注意,编写错误的脚本可能会导致您的系统在电源故障期间崩溃。

配置 UPS eeprom

在 SmartUPS 中,eeprom 中至少存储了 12 个不同的值,这些值决定了 UPS 对各种条件的反应,例如高线路电压、低线路电压、断电宽限期等。

一般来说,目前不建议更改 eeprom 值,除非绝对必要。已经报告了几个关于设置低传输电压的问题案例。因此,如果可能,请不要尝试更改此值。

如果尽管有这些警告,仍然必须更改 eeprom 值,我们建议将您的 UPS 连接到运行 PowerChute 的 Windows 机器并进行更改。

在没有其他选择的情况下,也可以使用 apcupsd 更改 eeprom 值。在执行此操作之前,建议您制作 UPS 参数的打印副本,因为它们在任何 eeprom 更改之前都是如此,以便可以对照所做的更改进行检查。这可以通过打印 apcaccess status 的输出以及 apcaccess eprom 的输出来完成。

完成此操作后,选择您要更改的 eeprom 值。从 apcaccess eprom 提供的列表中选择新值。对于电池日期和 UPS 名称,您可以使用任意八个字符。

要使用 apcupsd 进行 eeprom 更改,您必须首先停止 apcupsd 守护进程。请参阅 apcupsd 手册相应章节中的“停止 Apcupsd”。然后编辑 /etc/apcupsd/apcupsd.conf 中的相应配置指令。

建议一次更改一个 eeprom 值,一次只定义一个配置指令。每次更改后,检查一切是否正常,然后再继续更改您希望更改的下一个值。

要实际更改 eeprom,请在 apcupsd 守护进程停止的情况下以 root 身份输入

apcupsd -c

当它完成 eeprom 的重新编程时,它将打印新的 STATUS 报告。在继续之前,检查您是否获得了预期的结果。

Apcupsd 安全问题

apcupsd 以 root 身份运行。安装软件时需要考虑这一点。它需要访问串行端口、System V IPC 服务和关机程序。

如果您在 apcupsd.conf 文件中启用了 NETSERVER 指令,请注意网络上的任何人都可以读取您的 UPS 状态。这可能是一个问题,也可能不是一个问题。如果您不认为此信息是特权的,则风险很小。此外,如果您在服务器和 Internet 之间有一个防火墙,入侵者将无法访问您的 UPS 信息。此外,您可以使用 INETD 服务并通过使用 TCP wrapper 的访问控制列表来限制对您的 apcupsd 服务器的访问。

如果您正在运行主/从联网,并且单个 UPS 为多台机器供电,请注意有人可能模拟主机并向您的所有从机发送关机请求。从机确实会检查声称是主机的机器的网络地址是否与 DNS 返回的与您的配置文件中指定的主机名称对应的地址相同。

apcupsd 的客户端

为了简化 UPS 监控,apcupsd 提供了相当多的客户端工具。我们已经看到了 apcaccess,其输出如清单 6 所示。apcaccess 是用于监控 UPS 状态的主要客户端工具。

清单 6

另一个基于控制台的客户端是 powerflute,它可以用于持续监控 UPS 状态,如图 3 所示。

图 4 中显示了另一个用于联网 apcupsd 的有用客户端。它是集成到 apcupse 并由 Kern 增强的 CGI 接口。如果您想能够从 Web 查看 UPS 状态,这是最佳选择。图 5 显示了连接到 Kern 主服务器 (www.sibbald.com/cgi-bin/multimon.cgi) 的 UPS 的状态。

Monitoring Your UPS With apcupsd

图 3. Powerflute

Monitoring Your UPS With apcupsd

图 4. CGI 接口:概述

Monitoring Your UPS With apcupsd

图 5. CGI 接口:一台主机的详细信息

apcupsd 正在由 Kern 移植到 Win32(9x 和 NT)。在撰写本文时,Kern 已经制作了适用于 Windows 的 apcupsd 的 beta 版本。图 6 和图 7 显示了适用于 Win32 状态客户端的 apcupsd。

Monitoring Your UPS With apcupsd

图 6. 适用于 Win32 的 apcuspd

Monitoring Your UPS With apcupsd

图 7. 适用于 Win32 的 acpuspd

下一步是什么

apcupsd 仍在发展。apcupsd 的下一个版本将是一个主要版本更改,它将包含以下新的主要功能

  • 多 UPS 控制 apcupsd 将能够控制连接到同一台计算机的多个 UPS。

  • 网络代码重写 apcupsd 将成为真正的网络守护进程,并将强大的安全功能集成到代码中。

  • 完整的 Win32 支持。

  • 能够从客户端程序执行 UPS 测试。

  • 如果时间允许,另一个功能,现在更多的是梦想而不是开发目标,是支持其他制造商的 UPS。

Monitoring Your UPS With apcupsd
Riccardo Facchetti (riccardo@master.oasi.gpa.it) 是意大利米兰一家科学仪器公司的研究工程师。当不坐在电脑前时,他会在世界各地旅行。
加载 Disqus 评论