UPS、停电、自动通知多个服务器关机、短信报障[2012] 回首页

  国庆前家里停了一次电,UPS在若干分钟后电力耗尽,NAS设备的raid1上的硬盘坏了一块,硬盘的BIOS已不可读而且报警。
  然后赶紧在收假前买了两块硬盘回家救援,先把挂一块新盘把RAID1上的东西拷出来,然后加上另一块新盘到RAID1上恢复RAID1.
  国庆后去中关村去换那块坏硬盘。

讨论:
一、关于硬盘和数据:
  1.这次硬盘坏不是因为盘片区块损坏,而是电路板坏,说不定就是这个型号的缺限,如果两个硬盘电路板全坏呢?(硬盘“医生”、恢复公司之流通常以“硬盘有价、数据无价”为由,狠狠收你一笔。)是不是以后应该考虑用不同品牌的盘来做RAID1呢?
  2.硬盘在保期内可以换新的,而旧盘上的数据是不是换个电路板就可以读那块硬盘呢?还好,我的机密数据都放在truecrypt容器文件里面,别人是解不开的。
  3.是不是以后需要买支持“硬盘透明加密”的NAS设备?
  4.随着低工耗计算机价格下降,准备以FreeNAS、CryptNAS软件建NAS服务器。

二、应对停电措施:
  对停电事件监控,一旦停电就做操作响应
  1.购买有串口的UPS,用linux或ros管理连接这个串口。
    UPS有没有专用的厂商定制的串口管理软件(通常是windows平台的、或者java版的)这是没有关系的,在linux和ros下面都可以通过shell去采集串口的状态,然后通过采集若干次停电状态、通知所有机器关机。
  2.检查IP设备(比如:打印服务器)是否掉电。通过curl等工具去轮循。
    这个方法实施容易一些,主要检查两方面:A.挂在UPS上的IP设备(如linux,交换机)取得信号,B.挂在UPS之外的电路上的IP设备(如打印服务器)不能取得信号,这两方面检测10次并且同时成立,就可以发关机通知了。
    特别注意:这个去检查的虚拟机要在被检查的IP设备之后启动。

三、通知关机方法:
    1.使用expect配合ssh远程执行
    2.通知接收交易码的服务(过程中有帐号验证)

四、关于短信通知到操作人:
    1.飞信
        飞信命令行客户端对debian/ubuntu linux支持较好,在centos中没试成功.
        Usage:
        sms -f mobile -p pwd -t mobile1,.. -m message -a message -d
        sms -f mobile -p pwd -t mobile1,.. -i file_name[utf8] -a invite_message -d 1
        -f:Fetion mobile account(only supports mobile phone No.)
        -p:Account password
        -t:Destination mobile list
        -m:Message
        -i:File name(only supports utf8)
        -a:Auto send invite using invite_message.
        -d:Debug on.
        发送例子:
        sms -f 13711111111 -p 123456 -t 13711112222,13711113333 -m "中文, testing!"
        sms -f 13711111111 -p 123456 -t 13711112222,13711113333 -i msg.txt
        邀请加好友例子:
        sms -f 13711111111 -p 123456 -t 13711112222,13711113333 -m "你好, 请加我!" -a "宁采臣"

        网上找的开源PHP飞信发送类:http://code.google.com/p/php-fetion/
        需要php支持socket
        在内网其它机器上执行:curl -I http://192.168.0.111/sendmsg_01.aspx

    2.msn机器人
        网上找的:http://code.google.com/p/phpmsnclass/ 使用例子:http://code.google.com/p/phpmsnclass/w/list
        支持MSNP9(MSN 6.2)和最新的MSNP15(WLM 8.1)协议。(MSNP15协议支持离线消息,默认MSNP9协议)。
        使用MSNP15协议,PHP需要支持mhash;使用msnbot机器人功能,PHP需要支持pcntl。
        例子:
        <?php
        include_once('msn.class.php');
        $msn_username = "[email protected]";//消息发送人MSN帐号
        $msn_password = "12345678";//消息发送人MSN密码
        $msn_list = array("[email protected]","[email protected]");//消息接收人MSN帐号
        $msn = new MSN('MSNP15');//采用MSNP15协议,支持离线消息
        if ($msn->connect($msn_username, $msn_password)) {
            $msn->sendMessage("UTF-8编码的中文和英文", $msn_list);
        }
        ?>

---------------------------------------------------------------------------------
参考文献和引用地址:

(1).Linux下如何使用USB转串口线?
摘要>>><<<隐藏
计算机的串口不能用,怎么与目标板的串口连接呢? windows下可以用USB转串口线实现,linux下更简单,连驱动都免装! 测试环境:redhat linux fedora core 4 总结如下: 1. 检查是否存在设备/dev/ttyUSB0,如果没有就建立一个: mknod /dev/ttyUSB0 c 188 0 以下推理未测试: 串口线 esxi串口映射 发短信 路由器或ip设备检查 如果有多个USB口,可以类推,建立/dev/ttyUSB[1-n],注意从设备号要累加, 如:mknod /dev/ttyUSB[1-n] c 188 [1-n] 2. 启动minicom, 设置串口设备为 /dev/ttyUSB0, 再设置波特率/数据位/停止位,保存为缺省配置df1 3. 重启minicom, 复位目标板,看是否有打印信息? 如果没有请确认:a)USB/串口线没问题,b)确认你使用的USB口是第一个(一个个的试吧,一般电脑不会标示出来)
(2).为debian linux配置upsd不间断电源守护 http://salomi.blog.51cto.com/389282/108602 摘要>>><<<隐藏
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什么信号,我只说说我这的吧 参照file:///usr/share/doc/upsd/README说明文件,里面有 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(电源恢复)的信号也省掉了。
(3).短信报障: http://code.google.com/p/php-fetion/ http://code.google.com/p/phpmsnclass/