upsd是个不间断电源(UPS)的守护进程,通过监视串口的信号(根据UPS类型而定)判断UPS的当前状态。
它同时支持网络的C/S工作方式,用白话来说,就是一台大型UPS同时为若干台主机供电,控制口接到作为S的linux主机的串口上,其它主机上的upsd则以C模式运行,当断电并电量低后,S通知各个C赶紧关机,然后自己关机...
我没这么复杂的应用,环境很简单:
1.一台debian linux服务器(有一个RS-232串口)
2.一台最多支持10分钟左右的小型UPS
先检查确认设备
1.UPS说明书上注明支持RS-232信号
2.cat /proc/tty/driver/serial, 输出以下就对了
0: uart:16550A port:000003F8 irq:4 tx:0 rx:0
1: uart:16550A port:000002F8 irq:3 tx:0 rx:0
如果都是unknow, 用这个方案中没戏了,另想法子吧, 请忽略本文.
----------------以下继续----------------
安装也很简单:
apt-get install upsd
/etc/init.d/upsd stop -- 如果你的硬件完成符合默认配置并且全部都接好了线,请忽略这一步
不过配置有点麻烦,要同时修改启动脚本和配置文件
启动脚本/etc/init.d/upsd
里面关于ttyS0表示使用COM1, ttyS1表示使用COM2, 要据实行事.
start-stop-daemon --start --quiet --exec $DAEMON -- $PORT
要修改为:
start-stop-daemon --start --quiet --exec $DAEMON -- $PORT -m
目的是禁用master模式,也就是本文开始提到的S.
配置文件/etc/upsd.conf
这里要说清楚恐怕要长篇大论了,基本原理就是指定RS-232发个信号脚本的电平对应UPS什么信号,我只说说我这的吧
参照说明文件,里面有
Belkin ReSource F5C520c UPS
===========================
This UPS comes with what looks like a standard DB-9 M-F serial cable but
it is wired differently. There appear to be no internal resistors (the
UPS may have an internal circuit with the pullup resistors for the status
lines). The pinout appears to be as follows:
DB-9 (PC side, female) DB-9 (UPS side, male)
---------------------- ---------------------
Pin Pin Meaning
--- --- ------
1 (DCD) <--------------------------- 1 LOW BATTERY
3 (Tx) ---------------------------> 5 ?? (PC's Tx tied to GND?)--我的解释:7提供Vcc+, 3提供Vcc-, 学电子电路的人应该明白的。
4 (DTR) ---------------------------> 4 UPS Shutoff (when on battery)
7 (RTS) ---------------------------> 7 Power to UPS status lines
8 (CTS) <--------------------------- 8 ACFAIL
正好我的UPS的说明书中,对控制口的描述是一样的,于是,我就比较省事了,把原来APC那部分注释掉,Belkin ReSource F5C520c那部分取消注释,搞定。
至于连接线,则可以直接用9PIN串口延长线来做--可惜我没有这个,材料倒是不少,自己焊吧:9PIN连接器一公一母,多芯线或网线,1,3,4,7,8直通。
最终的引线顺序,还是要搞明白上面的那些含义并与之符合才行哦。
到此,已经完成了一大半,可以先测试一下再作进一步工作:
1.把UPS接上市电,输出那里接个显示器或风扇或台灯--反正不能接主机
2.再把RS-232连接线把主机串口与UPS控制器连接起来
3./etc/init.d/upsd start
4.cat /etc/upstatus,正常应显示0:0 Power = OK:Power = OK
5.拔下市电,重复4, 0:0会变成0:1, 过大约10秒,会变成1:1
6.重新插上市电,重复4, 1:1会变成1:0, 过一会变成0:0
--到这里,表明upsd已经正常工作了
但在上述过程的中间有个提示: cannot execute "/etc/init.d/powerfail"
这个就是本文要解决的最后一个配置环节了,接着往下:
修改/etc/inittab
找到
# What to do when the power fails/returns.
注释pf, pn, po三行
再增加一行:
pf::powerfail:/sbin/shutdown -h now "Power Failure; System Shutting Down"
至此全部完成!
upsd默认每10秒检查一次RTS信号,连续两次为0后,发出powerfail信号给init,再由init进程执行关机操作。
由于我这里是单机,所以禁用了master模式,而且电池容量小,因此shutdown的延时参数也用不上了,所以把po(电源恢复)的信号也省掉了。
这个地方也有另一个角度的描述,请参考