
简介PowerChute Network Shutdown3.zip 是面向数据中心运维与服务器管理人员的 APC UPS 电源管理工具包针对 Windows Server 2003 的 32 位与 64 位环境用于在断电、电压异常等电力故障下监控 UPS 状态并按策略安全关闭服务器降低数据丢失与硬件损坏风险。压缩包共 4 个文件约 38.98MB包含可执行安装程序、PDF 安装指南、HTM 发行说明以及 INI 静默安装配置分别对应部署、配置参考、版本变更与无人值守安装等用途结构精简便于快速查阅和批量部署准备。目前已有 328 人学习适合具备一定服务器运维基础、需要为机房断电保护补全方案的中级读者。读者可从中获取电源监控、预警通知、自动关机、负载管理与远程管理等核心功能的落地参考并借助安装文档和发行说明梳理版本要点与配置注意事项为实际环境中的 UPS 联动关机方案提供较完整的基础资料。1. 一台 UPS 顶不了十分钟这套 APC UPS PowerChute 到底解决什么机房只配一台 APC UPS市电一断电池表就开始跳秒。真正要命的不是断电那一下而是断电后那几分钟没人知道该先关哪台机器、谁先停服务、谁最后断电。PowerChute Network Shutdown下面简称 PCNS干的就是这件事它装在被保护的主机上通过网卡和 UPS 的网络管理卡NMC通信在电池耗尽前按设定顺序把操作系统安全关掉。这个压缩包 PowerChute Network Shutdown3.zip 里就是这一代 PCNS 的安装介质面向 Windows 和 Linux 被保护节点不是给 UPS 刷的固件也不是监控大屏。适合手上有 APC UPS 加网络管理卡、被保护主机超过三台、又不想每次停电靠人肉 SSH 挨个关机的运维单机 USB 直连、一台机器关机就完事的场景装它反而多一层故障点。2. 先看清通信链路PowerChute、NMC、UPS 三者谁跟谁说话装之前如果不把这条链路捋清楚后面所有“连不上”“不关机”的排查都是瞎猜。PCNS 不是万能的中间件它唯一的信源就是 NMCNMC 一挂或者网络一断PCNS 对 UPS 的认知立刻退化成“未知”。这一章先把角色、端口和前置条件钉死再动手解包。2.1 三个角色和四条通路6547、80/443、161 各管什么UPS 本体只负责供电和上报电池容量、负载、剩余运行时间、输入电压这些物理量它自己不会关机也不会通知谁。NMC 是插在 UPS 智能插槽里的那张卡有独立 IP对外提供 Web、SNMP、SSHPCNS 收到的市电中断、低电量、电池故障事件全部由它发出。PCNS 是被保护主机上的守护进程加一个 Web 控制台负责“收到事件、判断要不要关、执行关机”这三步。把这三者的关系想成一条链UPS 把状态喂给 NMCNMC 通过网络把事件推给 PCNSPCNS 在本机执行关机命令。链上任何一环断了结果都不是“不关机”而是“按另一种逻辑关机”这个区别很关键后面避坑那章会展开。端口方向用途谁监听80 / 443PCNS → NMC读取配置、轮询 UPS 状态NMC6547双向PCNS 控制台入口、NMC 与本机之间的事件通道PCNS 主机161 / 162监控 → NMCSNMP 只读查询、告警上报NMC22运维 → NMCSSH 登录 NMC 排障NMC123/udp双向NTP 时间同步事件时间线全靠它两端都要选网络关机而不是 USB 直连的理由也在这张表里一台 UPS 加一张 NMC 可以同时保护十几台跨系统的主机Windows、Linux、虚拟化平台都能挂上去而 USB 线只有一根只能保护插着它的那台机器。代价是多了一个 NMC 单点和一层网络依赖所以端口和防火墙必须提前规划不能等装完再补。2.2 装机前必须过的六项检查这一步偷懒后面八成要返工。下面这六项我每次上线前都会过一遍缺一项就先解决再往下走。检查项怎么看不满足的后果NMC 固件支持这一代 PCNSNMC Web 里的固件信息页认证短语选项都不出现PCNS 加不上设备NMC 使用固定 IPping 加交换机侧确认DHCP 续租换地址全部主机失联主机与 NMC 三层可达ping 加端口探测只能靠同网段发现跨网段直接超时主机与 NMC 时间一致date 和 NMC 时间页对比事件时间线错乱多机顺序失效安装账号有 root / 管理员权限id、whoami服务起不来关机命令发不出去系统盘剩余 ≥ 200MBdf -h安装中断卸载不干净第三条最容易被忽略。很多人习惯“反正同一个机柜肯定通”结果 NMC 在管理 VLAN、主机在业务 VLAN中间还隔了防火墙发现按钮转半天列表空白。规划阶段就把 6547 的入站规则写进变更单比装完再排查省事得多。2.3 解包与安装Windows 和 Linux 两条路压缩包到手先别急着解先看结构。安装介质里通常会把两个平台的目录分开Windows 是 setup.exe 加依赖Linux 是自解压安装器。下面这套动作我在测试机上跑过很多次顺序别换。# 1) 只列不解先看清压缩包里的目录结构 unzip -l PowerChuteNetworkShutdown3.zip # 2) 解到独立目录避免污染家目录 mkdir -p ~/pcns unzip -o PowerChuteNetworkShutdown3.zip -d ~/pcns # 3) 按平台挑安装器Linux 常见 .run/.bin 自解压Windows 是 setup.exe find ~/pcns -maxdepth 3 -type f \( -name *.run -o -name *.bin -o -name *.exe -o -name *.sh \) -lsunzip -l只读目录不解压-o表示覆盖同名文件-d指定落地目录find里的-maxdepth 3是为了不让它钻进深层依赖目录刷屏\( ... \)那一组是“或”条件一次把所有可能的安装器捞出来。看清楚哪个是主安装器再动手。Linux 侧最关键的一步是执行权限自解压安装器从压缩包里解出来默认没有 x 位。# 自解压安装器必须先加执行权限 chmod x ~/pcns/Linux/*.run # 交互项安装路径、控制台端口、运行账号端口默认 6547 不要改 sudo ~/pcns/Linux/*.run # 装完别硬背服务名不同版本叫法不一样先查再操作 systemctl list-unit-files | grep -i -E powerchute|pcns systemctl status 上一步查到的服务名 --no-pagerchmod x解决的是“装到一半提示权限不足”这类看似玄学的问题sudo是必须的服务要注册成系统级list-unit-files加 grep 是为了拿到真实服务名后面对日志、开机自启的操作全依赖它。Windows 侧换个思路关键是提权安装。# 必须以管理员身份启动普通双击会把服务注册到当前用户上下文 Start-Process -FilePath C:\temp\pcns\Windows\setup.exe -Verb RunAs # 装完确认服务和控制台端口 Get-Service | Where-Object {$_.Name -like *PowerChute*} Get-NetTCPConnection -State Listen | Where-Object {$_.LocalPort -eq 6547}Start-Process -Verb RunAs等价于右键“以管理员身份运行”避免权限不足导致服务注册失败Get-NetTCPConnection过滤 6547能立刻确认控制台端口有没有起来比打开浏览器试地址快。3. 把主机挂上 UPS设备发现、认证短语与控制台登录装完只是把软件放上去真正的活是让它和 NMC 建立信任关系。这一步失败率最高而且报错信息通常很含糊所以顺序上先验连通、再做发现、最后对短语一层一层往上叠。3.1 第一步永远是端口通不通不要先去点控制台里的“发现”先用命令行确认基础网络。四组命令分别对应四种失败HTTP 不通、6547 不通、本机没监听、包过不去。# 1) NMC 的 Web 是否可达-k 跳过自签证书校验-I 只看响应头 curl -k -I --connect-timeout 3 https://192.0.2.10/ # 2) NMC 与本机之间的 6547 通道 nc -zv 192.0.2.10 6547 # 3) 本机 PCNS 侧是否真的在监听 ss -lntp | grep -E 6547|443 # 4) 抓包确认事件通道有没有握手成功的迹象 tcpdump -ni any host 192.0.2.10 and port 6547 -c 20--connect-timeout 3把超时压到 3 秒避免卡在不可达地址上等半天nc -zv只探端口不传数据做连通性初筛最省事ss -lntp的-l是监听态、-n不做域名解析、-t只看 TCPtcpdump的-c 20抓满 20 个包就停防止在流控终端里刷屏。四条里前三条都正常、第四条抓不到任何包基本可以断定中间有设备在静默丢包去查安全组和 ACL。Windows 侧对应的是这一组思路一致。# 测 6547 是否可达比 telnet 客户端更可靠 Test-NetConnection -ComputerName 192.0.2.10 -Port 6547 # 查本机是否在监听控制台端口 Get-NetTCPConnection -State Listen -LocalPort 6547Test-NetConnection的输出里TcpTestSucceeded为 True 才算通False 时看PingSucceeded是否也为 False能区分是主机不通还是端口被挡。3.2 设备发现广播只在二层跨网段只能手填PCNS 控制台里的“发现”按的是广播/组播逻辑它发出去的探测包不会被三层设备转发。同 VLAN 里秒出结果跨 VLAN 就永远是空列表这不是软件坏了是协议本身的设计边界。跨网段的正确姿势是手动填 NMC 的 IP一个字符都不要省。同一个网段里如果也发现不了先回 3.1 的第四步抓包看探测器有没有发出、有没有回应。有些交换机开了广播风暴抑制会把这种低速率广播直接吞掉。另一边检查 PCNS 主机的防火墙6547 的入站一定要放NMC 要能主动连回来。# firewalld只放通管理网段不要开成 0.0.0.0/0 sudo firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.0.2.0/24 port port6547 protocoltcp accept sudo firewall-cmd --reload # ufw 环境等价写法 sudo ufw allow from 192.0.2.0/24 to any port 6547 proto tcpsource address限定来源网段是重点6547 一旦对全网开放等于把一个能触发关机的接口挂到公网上。--reload让永久规则立即生效ufw 那条是对等写法两种环境各取其一即可。3.3 认证短语两边必须逐字符一致的那串东西NMC 侧有一个认证短语配置作用是让“只有知道这串字符的客户端才能控制我”。PCNS 添加设备时要把同一串填进去此外 NMC 上还要把 PCNS 主机的 IP 加进允许列表。三个条件缺一个设备列表里就会一直显示未连接。短语不一致是最常见的坑大小写不同、尾部多一个空格、全角半角混用肉眼几乎看不出来。核对办法是把它复制到一个十六进制查看器里对齐别靠肉眼。还有双网卡主机NMC 看到的源 IP 可能不是你预期的那个这时候用路由查询确认出口。# 确认本机到 NMC 走哪张网卡、源 IP 是哪个 ip route get 192.0.2.10 # 输出里的 src 字段就是 NMC 看到的来源 IPNMC 白名单要写这个ip route get会打印实际选路和src这一步能省掉大量“我明明加白了却还是连不上”的争论。虚拟化环境里尤其常见宿主机多网卡、虚机桥接选错源地址跑到另一个网段去了。4. 关机参数三个时间量决定你会不会丢数据链路通了以后真正决定成败的是参数。PCNS 里跟关机相关的量看着多核心就三个剩余运行时间阈值、低电量时长、系统关机耗时。这三个数不是独立配置项它们是一条时间轴上的三段配错任何一段结果要么是该关不关要么是没关完就断电。4.1 剩余运行时间、低电量时长与关机耗时的换算关系剩余运行时间由 UPS 实时计算随负载变化满电时可能是 25 分钟负载翻倍后可能只剩 9 分钟它不是常数。低电量时长配置在 NMC 侧表示“剩余运行时间低于这个值时宣布进入低电量状态”典型值 2 到 3 分钟。系统关机耗时是你这台机器从执行关机到真正停机的真实秒数必须实测不能拍脑袋。安全窗口可以按这个式子估事件触发时剩余运行时间 − 低电量时长 − 实测关机耗时 − 60 秒网络与脚本开销。算出来如果是负数说明阈值设得太晚电池撑不到你关完。参数配在哪典型值调大的后果调小的后果剩余运行时间阈值PCNS 事件配置8 到 12 分钟断电后很快就关浪费续航电池快耗尽才触发风险高低电量时长NMC 电池配置2 到 3 分钟提前宣布低电量频繁关机事件发得太晚系统关机耗时PCNS 关机配置实测值 60 秒等太久UPS 已断输出系统没关完就被切电通信丢失延时PCNS 事件配置不关机或 ≥ 300 秒网络故障迟迟不动作抖动一次就误关机这张表建议抄进变更单每次改参数都对照一遍。特别是最后一行它跟电池没关系却最容易造成批量事故。4.2 事件动作哪些该关机哪些只该告警PCNS 的事件配置页一般会列出市电中断、低电量、电池故障、通信丢失、过载、温度异常这几类。默认动作未必适合你逐条过一遍比全盘接受默认值靠谱。事件建议动作理由市电中断只记录和告警不关机闪断一次关整个机房属于事故低电量触发关机主力关机事件唯一可靠的触发点电池故障 / 严重故障立即关机电池已无意义保数据优先通信丢失不关机仅告警网络维护、NMC 重启都会触发过载 / 温度异常告警接入监控需要人判断不适合自动动作市电中断不关机这条很多默认模板是反的或者模板里给了个很短的延时。我见过一次交换机堆叠切换UPS 毫发无损三台机器同时自己关了事后查就是通信丢失被配成了立即动作。这个坑放到第 5 章细说。4.3 多机顺序用递增延时别指望“同时触发”一个 NMC 保护多台主机时正确的顺序是数据库最后关、应用中间关、前端最先关。实现方式不是让它们同时收到事件再各自判断而是给每台主机的关机动作设递增延时。数据库 0 秒、应用 60 秒、前端 120 秒这样事件来的时候前端先走应用还有时间把连接排空数据库最后落盘。如果 PCNS 支持在关机流程里挂自定义脚本这段可以做得更细。下面是个钩子脚本的模板思路是“短、幂等、绝不阻塞关机”。#!/usr/bin/env bash # 关机前钩子只做三件事且必须在 10 秒内返回 set -euo pipefail LOG/var/log/pcns-hook.log echo $(date -Is) pre-shutdown triggered $LOG # 1) 从负载均衡摘掉本机避免请求继续打进来 curl -fsS -m 3 -X POST http://192.0.2.50/api/drain \ -d {\host\:\$(hostname -s)\} $LOG 21 || true # 2) 停有状态服务给落盘留时间 systemctl stop app-server.service $LOG 21 || true # 3) 刷盘别让 page cache 背锅 syncset -euo pipefail保证脚本出错就退出不会带着半截状态往下走-m 3把外部调用超时压到 3 秒避免负载均衡接口挂了把整个关机流程卡死每条命令后面的|| true是有意为之钩子失败不能阻止系统关机否则就成了“为了优雅而拒绝断电”。这个脚本的路径要在控制台里填对填错等于没挂。4.4 不进 Web 也能核对配置文件与关键字段控制台能用但排障和批量核对时命令行更快。不同版本、不同系统的配置路径不完全一样别猜先定位再读。# 先定位安装目录别硬编码路径 sudo find /opt /usr/local -maxdepth 5 \( -iname *powerchute* -o -iname *pcns* \) 2/dev/null # 找到配置目录后核对四类关键字段 sudo grep -rniE ups|phrase|shutdown|delay|runtime /opt/PowerChute/config 2/dev/null | head -40-maxdepth 5控制搜索深度-iname忽略大小写2/dev/null把无权限目录的报错吞掉grep 的-rniE是递归、显示行号、忽略大小写、扩展正则四合一head -40防止输出过长。注意配置里的短语通常不会明文展示能看到的更多是地址、阈值和延时核对短语还是得回控制台。5. 避坑与排查五个真会翻车的点下面五条都按“现象、原因、解决”写每一条背后都是能让人半夜爬起来的那种问题。排障顺序建议从上往下先排除通信再看时间最后看误动作因为后两类问题经常是前一类伪装出来的。5.1 通信类发现不到、加进去又连不上坑一同网段能发现跨网段永远空列表。现象是点了发现按钮转圈列表空白但手动填 NMC 地址却能连上。原因是发现走广播三层设备不转发。解决是跨网段一律手动添加同时确认 PCNS 主机 6547 入站放通再用抓包确认探测包到底有没有到对端。不要在这上面反复点按钮点一百次也不会通。坑二设备加进去了状态一直是未连接。现象是控制台里 UPS 状态灰着NMC 侧日志能看到认证相关报错。原因多半是认证短语不一致、NMC 白名单没写对或者双网卡主机源 IP 跑偏。解决是两边逐字符核对短语白名单按ip route get输出的 src 填别按你记忆里的网卡地址填。# 双网卡/虚拟化环境最容易出问题的一步 ip route get 192.0.2.10 # 用输出里的 src 去 NMC 白名单里核对不要用 ifconfig 里的第一个地址5.2 时间与顺序类事件错序、没关完就断电坑三三台机器顺序乱套数据库比应用先停。现象是恢复后应用日志里一片连接错误。原因是各主机与 NMC 时间不同步所谓“同一时刻触发”实际差了几十秒也可能三台的关机延时被设成了同一个值。解决是把所有主机和 NMC 指向同一 NTP 源顺序用递增延时实现而不是靠同时触发再各自判断。# 确认时间同步状态偏移超过 1 秒就要处理 timedatectl status chronyc tracking 2/dev/null || ntpq -ptimedatectl看的是系统时钟与 NTP 是否同步chronyc tracking或ntpq -p能给出具体偏移量。偏移几百毫秒看着不多放到多机顺序场景里足够让事件错位。坑四系统还没关完UPS 就切了输出。现象是下次开机 fsck 报错、数据库要做 journal 回放。原因是系统关机耗时被低估或者某个服务卡住拖了九十秒。解决是实测一次完整关机耗时把配置改成实测值加 60 秒余量同时把低电量时长往上调一档。# 找出拖慢关机的服务 systemd-analyze blame | head -10 # 回看上一次关机的日志尾部确认卡在哪个单元 journalctl -b -1 -n 50 --no-pager | tail -20systemd-analyze blame按耗时排序启动单元虽说是启动视角但拖慢启动的服务往往也拖慢关机journalctl -b -1看的是上一次启动周期也就是上次关机前后的日志--no-pager防止输出被分页器截断。5.3 误动作类一次抖动关掉半个机房坑五UPS 一点事没有几台机器集体自己关了。现象是交换机做了一次堆叠切换或者 NMC 重启几台机器同时进入关机流程。原因是通信丢失事件被配成了立即关机或者延时设得极短。解决是把通信丢失的动作改成不关机或仅告警实在要动就延时拉到大于一次网络维护窗口NMC 升级前先把这条事件临时禁用。这个坑的隐蔽之处在于事后看 UPS 日志干干净净你会以为是主机自己抽风其实是软件忠实地执行了你配的规则。6. 上线前的拔电演练把阈值拉高看它到底会不会关参数配完不代表能用得让它真跑一次关机流程。真拔市电风险太大我一般用“拉高阈值”的办法先在一台非核心测试机上装好 PCNS记下 NMC 页面上的满电预估续航比如 25 分钟然后把“剩余运行时间低于 X 分钟触发关机”里的 X 设成 30。市电正常、电池满电的情况下剩余运行时间永远低于 30 分钟事件会立刻被触发整条链路从 NMC 到 PCNS 到钩子脚本到系统关机全部跑一遍。这个办法的好处是不用碰配电坏处是它会真的关机所以只能拿测试机做而且做完立刻把 X 改回去。演练时重点看四件事钩子脚本日志有没有写、应用服务是不是按预期先停、系统从收到事件到完全断电用了多少秒、UPS 侧有没有记录到对应事件。四项里任何一项和预期不符都别急着上生产。演练检查项预期不符时先看哪钩子脚本执行日志有带时间戳的记录脚本路径、执行权限服务停止顺序前端先、数据库后递增延时配置关机总耗时小于配置的系统关机时长systemd-analyze blameUPS 事件记录与触发时间对得上两端 NTP 同步状态演练完记得恢复三样东西剩余运行时间阈值、低电量时长、通信丢失事件的动作。我吃过一次亏测试时把阈值拉到 30 分钟忘了改回来第二天早上负载一高续航掉到 28 分钟生产机直接进了关机流程人还在路上。从那以后我每次动完阈值都会在变更单上单独列一行“恢复项”演练结束当着第二个人复核一遍才关单。如果你手上正好有这套包和一张 NMC建议先把第 2 章那六项前置检查过一遍再拿一台闲置机器把第 6 章的演练跑通剩下的就是照着表填参数。希望帮到你。本文还有配套的精品资源点击获取