UPS 仪表盘即使显示电池状态健康,到了真正要紧的时刻,也无法保证整架设备能够妥善关机。读取电量走的是最容易的一段。市电消失后,艰难的一段才开始:适配具体硬件的驱动必须识别状态,服务必须保存并共享状态,每台受保护主机必须判断何时停止,UPS 则要等文件系统和工作负载全部关闭后才能切断插座输出。Network UPS Tools(NUT)的核心就是这条链,漂亮的电池电量表只占其中一小段。[2][3]
Techno Tim 这份 49 分钟的 NUT 指南值得观看,因为它把抽象概念重新放回线缆旁。视频从 UPS 和一台小型 Linux 主机讲起,依次走过驱动、配置文件、远程客户端、仪表盘、告警,最后做了一次真实的停电测试。NUT 项目还在自己的文档页中链接了这份指南;对于第三方操作讲解,这是一项少见且很有用的认可。[1][3]
观看时可以始终追问:每一步由哪个组件掌握权限? 驱动负责报告电源设备给出的信息,数据库何时能够安全停止则由别处决定。upsd 负责发布状态,主机停机要交给监控进程和操作系统。upsmon 能够让主机进入已确定的关机流程,然而干净地停止操作系统,与命令 UPS 切断输出电源,仍是两件事。看清这些职责后,视频中的命令会更容易理解。
继续照着视频操作之前,需要先划清一道日期界线。视频发布于 2021 年,使用旧称 master 和 slave;NUT 当前文档采用 primary 和 secondary。这段录像适合作为硬件与运行行为的具体导览,名称、权限、服务集成和网络暴露方式则应以现行手册为准。[1][3][6]
5:50 左右,驱动成为一份硬件契约
视频里第一项真正影响后续的配置,是选择 UPS 驱动。从这里开始很合适,因为 NUT 把不同电源设备的差异收进驱动层。
ups.conf 中的一条配置会命名设备、选择驱动,并指定端口或网络端点。驱动使用厂商或协议自己的方言,再把取得的信息映射成 NUT 的通用变量:OL 表示市电供电、OB 表示电池供电、LB 表示低电量;硬件若能提供,还会有 battery.charge、battery.runtime、ups.load 等读数。标准化后的状态经本地套接字送出。upsd 接收并缓存这些状态,再提供给客户端;USB 线缆的轮询留在驱动一侧。[2][3]
这层分工也让每类故障留下不同的特征。设备节点或权限出错时,驱动无法与硬件建立通信。驱动运行正常,而 upsc myups@localhost 读不到状态时,应检查 upsd、状态文件路径或访问控制。两者都正常,主机却在临界状态下继续运行时,排查范围便落到 upsmon 和操作系统集成上。“NUT 坏了”还称不上诊断。
统一的变量名与测量质量是两回事。有的 UPS 根据负载和电池状况估算续航,有的只暴露粗略的低电量标志,也有设备完全省略某项数值。因此,生产策略应从现场使用的具体设备、驱动、固件和连接方式出发,不能照搬另一型号的配置。项目的硬件兼容性数据可作为起点;现场证据来自放电演练。
11:07 左右,四份文件划分权限
随后,指南依次处理 upsmon.conf、upsd.conf、安装运行模式与 upsd.users,乍看像是一批散落的配置。实际每份文件回答的问题各不相同。
ups.conf 说明怎样连接并解释电源设备。upsd.conf 说明标准化状态服务监听在哪里。upsd.users 说明哪些已认证客户端有权管理设备或承担 upsmon 角色;普通只读状态查询不受它控制。upsmon.conf 说明本机依赖哪些电源,以及电源已无法维持供电时,本机应该做什么。软件包还会加入模式设置,常见选项是 standalone、network server 或 network client,用来决定服务管理器启动哪些部分。[2][3][7]
权限划分也能从网络通信中看见。保持默认配置时,upsd 监听回环地址并使用 TCP 端口 3493;远程监控需要明确设置 LISTEN 地址,同时开放合适的防火墙通道。NUT 手册提醒,单独绑定网络接口只解决监听位置,不能充当安全控制。[6] 只要能够访问服务,客户端即使没有监控账户也能查询状态,因此合理的部署只向受保护的管理网络开放 upsd,只读应用不应取得管理权限,upsmon.conf 中的监控凭据也应按秘密信息管理,不能当成无害的遥测配置。[7]
仪表盘因此位于链路下游。它可以查询同一份 upsd 状态,绘出很出色的历史曲线,但图表在关机协议中没有特殊权限。仪表盘离线时,upsmon 仍应照常行动;反过来,一张绿色图表也无法证明监控凭据有效,或本机关机命令拥有足够权限。
33:21 左右,客户端身在远端,电力仍在本地
视频配置远程 NUT 客户端时,项目名称有了字面意义。连接 UPS 的 USB、串口或网络管理界面的那台系统运行驱动和 upsd。由同一台 UPS 供电的主机可以按 secondary 角色运行 upsmon,经网络读取状态。primary upsmon 通常位于能够管理所连 UPS 的系统上,负责协调最后的负载断电。TrueNAS 为一台 UPS 向多台计算机供电的情况记录了同样的部署方式:一台机器掌握数据连接,再把状态发布给其余机器。[8]
危险之处在于把“远程”等同于“独立”。secondary 主机可以正常由电池供电,却会因为中间的交换机、Wi-Fi 接入点、DNS 服务或 NUT primary 插在未受保护的插座上,而失去状态信息通道。题图让这个问题变得具体:UPS 硬件、网络机架和线缆彼此相邻,但相邻只说明物理位置;状态通道能否比市电故障存续得更久,仍取决于实际供电关系。[10]
配置角色之前,先画两张图。供电图标明每台服务器、存储架、交换机和 NUT 主机由哪个 UPS 插座及电路供电。控制图标明驱动怎样连接 UPS,以及每个 upsmon 怎样连接 upsd。控制图必须持续可用,直到供电图中的设备完成关机。对于小型机架,可以把调制解调器或管理交换机与低功耗 NUT 主机接到同一套受保护电源上。大型环境还要如实记录冗余电源,并在 MONITOR 中填写真实的 power 值,不能假定每根电源线都提供等量且互相独立的供电。[4][5]
45:00 左右,测试改变状态,不只采集读数
视频末尾的生产测试最有分量。停电包含一系列不可逆的状态变化,单靠观察证明不了这些变化能够顺利完成。
在正常流程中,驱动首先报告 UPS 已转入电池供电。这时通常尚未下达关机令,毕竟 UPS 的用途之一就是撑过短时停电。当供电状况进入临界点——常见条件是电池供电与低电量同时出现,也可以由操作人员触发强制关机——primary 监控端会设置 NUT 的 FSD 状态。secondary 监控端看到这项决定后发出通知,等待各自配置的 FINALDELAY,调用 SHUTDOWNCMD,随后断开连接。primary 最多等待这些 secondary HOSTSYNC 所设的时长,然后开始自己的关机流程。断开连接只是一项有时限的协调信号,无法证明每台 secondary 已经物理停机。[3][4][5]
把控制权交给操作系统之前,primary 会创建 POWERDOWNFLAG 指定的文件。进入停机流程后段,服务已经停止、文件系统已经安全,此时集成钩子检查这个标记,并调用驱动的关机通道,常见命令是 upsdrvctl shutdown。到了这一步,UPS 才会切断负载供电。硬件配置合适时,市电恢复后插座重新上电,设置为交流电恢复后启动的主机也会随之开机。[3][4]
这个文件连接着两套权限。系统仍在完整运行时,upsmon 确定关机已经进入执行阶段;操作系统完成自身工作后,后期关机钩子才通知硬件断电。过早切断负载会危及数据。只停机而没有切断负载也会带来同样严重的后果:如果市电在机器已经停止但仍保持通电时恢复,系统就不会经历一次从断电到上电的转换,自然也无法借此重新启动。
NUT 自带直接演练协调流程的办法,这条命令的性质必须写清:upsmon -c fsd 会启动真实的强制关机序列,应视为破坏性操作。正式中断业务之前,可以在隔离的测试系统上演练,也可以使用一个只记录日志的 SHUTDOWNCMD 查看预期动作。手册明确警告,FSD 状态会锁存在 upsd 中;模拟结束后,操作人员应检查是否需要重启服务器、是否需要清除残留的断电标记,再确认系统已经重新进入待命状态。[4] Dan Langille 记录的一次 FreeBSD 多主机演练,也在这里留下了有用的旁证:各主机的日志和实际关机耗时,比监控画面更重要。[9]
后续还应安排一次维护窗口测试,在能够访问控制台的条件下,真正检验停机与负载断电。测试要测量最慢工作负载的耗时,确认 secondary 断开连接,检查后期断电钩子,并验证市电恢复后的启动。只看 battery.charge 下降,完成不了这项验证。
电池续航预算划出界线
NUT 能够协调关机顺序,却无法凭空增加续航时间,也无法让含糊的设备信号变得精确。HOSTSYNC 默认为 15 秒,单纯增大这个值并不会自动给缓慢的 secondary 留出更多关机时间。默认配置下,secondary upsmon 可以在调用 SHUTDOWNCMD 后退出;primary 看到连接断开时,数据库或虚拟机仍在停止。若切断负载必须等待,服务停止顺序就要让 upsmon 保持连接,直至这些工作负载安全结束;另一种做法是在 SHUTDOWNEXIT 中写入经过设计的延时,同时让 HOSTSYNC 大于实测时长。如果电池覆盖不了这段时间,重型工作负载就要借助 upssched 或其他策略提前开始停止,不能等到硬件最终报告低电量。[5]
通信中断也需要同样务实的处理。DEADTIME 让监控端决定,状态数据陈旧多久便应视为不可用;它分辨不了交换机故障与 primary 故障,也无法证明还剩多少电量。每次短暂通信间隙都立即按停电处理,会造成误关机。状态通道已经断开,却一直拖到电池耗尽,则会造成硬关机。计时器应依据实测轮询表现、真实网络拓扑、工作负载停止耗时和 UPS 放电曲线设定。
一台 Linux 主机配一台受支持的 USB UPS 时,一位操作人员即可负责整套系统。机器数量增加后,职责范围也随之扩大:稳定的设备标识、受限的网络暴露、软件包版本控制、凭据、服务顺序、状态陈旧告警,以及经过演练的恢复步骤,都会成为供电系统的一部分。如果没人说得清最后一条硬件命令由哪个进程发出,部署工作就还没有完成。
这段视频最终离开屏幕,检验了物理世界里的承诺,它的价值也正在这里。NUT 更深一层的启示同样具体:一个电池读数定义不了优雅停机。它来自一份共同约定,参与者包括驱动、状态服务器、监控角色、操作系统、始终保持可用的网络,以及储能足以让每一步走完的 UPS。最后一步尤其值得测试,因为任何仪表盘都无法代替操作人员完成它。
来源
- Techno Tim,《Network UPS Tools (NUT Server) Ultimate Guide》——本文嵌入的安装、远程客户端、监控与真实停电操作指南。
- Network UPS Tools 项目,《Network UPS Tools Overview》——分层的驱动、
upsd、客户端、访问控制与共享关机体系。 - Network UPS Tools 项目,Network UPS Tools User Manual——部署拓扑、配置职责、硬件兼容性与完整关机流程。
- Network UPS Tools 项目,
upsmon(8)——监控角色、power 值、FSD 模拟、关机流程与测试后的清理。 - Network UPS Tools 项目,
upsmon.conf(5)——MONITOR、MINSUPPLIES、HOSTSYNC、FINALDELAY、POWERDOWNFLAG与缓慢工作负载的时间界线。 - Network UPS Tools 项目,
upsd.conf(5)——状态套接字路径、默认回环地址、TCP 端口3493、LISTEN与网络暴露注意事项。 - Network UPS Tools 项目,
upsd.users(5)——经过认证的管理操作、即时命令与 primary/secondary 监控角色。 - TrueNAS Documentation Hub,《Configuring UPS Service》——一台 primary 掌握数据连接、多台 secondary 经网络接收状态的独立部署案例。
- Dan Langille,《nut — testing the shutdown mechanism》——真实多主机 FSD 演练、日志、空运行测试与实测停止耗时的独立记录。
- Derrick Coetzee,《UPS Power Management Module, racks with network cabling in NERSC data center》——2011 年纪实照片,来自 Wikimedia Commons。