seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

CentOS5.2(x64)にAPC ES 500のUPS(無停電装置)をつけてモニタリングしてみる。

動機

もともと常用する気がなくてちょっと立てた古い自作サーバも気に入ったのでRAIDにしたけれど、
使っているUPSサンワサプライのUPS-500T
すでに3年ぐらい使っていて、ときどきバッテリー交換アラームがなったりする。

よくわらないがオムロンOEMなのかどうなのか、交換バッテリはオムロンで買う必要があるのだが、ネットで価格を調べると\8000ぐらいする。
(本体は、もうどこも在庫切れ。)

最近のUPSは安くなっているので新しい機種を買った方がいいような気がする。
ちなみに、このUPS-500Tは単純なバックアップ電源でしかなくモニタリングも何もできない。

自宅の他のUPSは、他にRS232Cで接続するオムロン製の古いもの(もう8年ぐらい?)と、コンシューマ向けのUSB接続のAPC製のものが現役稼働中である。
このAPC製のものは半年ほど前に買ってWindowsマシンにつないでいるが、かなり気に入っている。

これは付属のソフト(PowerChute Personal Edition)を使うとUSB接続でバッテリ状態をモニタリングしたり残量が少なくなるとシャットダウンを開始してくれたりする。
ただし、コンシューマ向けな製品に付属するPowerChute Personal Editionでは、Linuxはサポートしていないようである。


調べたところ、APC ES-500の安価のもの(1万円前後?)であってもLinux(CentOS5)で同様に(サードパーティ製ではあるが)USB接続でモニタリングしたりシャットダウンしてくれたりすることがわかった。
それで、近所のPC量販店でAPC ES-500を購入することとした。*1


無停電装置を新調することなど、とうぶん無いだろうから次回忘れていると思うので念のためメモしておく。

Apcupsd a daemon for controlling APC UPSesを入れる。

CentOS5.2上でAPC製の無停電装置を監視するためのデーモンを入れる。


以下のサイトが非常に役立った。

ソフトウェアのダウンロード

以下から最新版をもらってきる。

http://www.apcupsd.org/

今回使ったのは、apcupsd-3.14.5.tar.gzだった。

展開・ビルド・インストール

$ tar xvfz apcupsd-3.14.5.tar.gz

$ cd apcupsd-3.14.5

$ ls
COPYING     Developers  ReleaseNotes  c          examples   platforms
ChangeLog   INSTALL     VERIFYING     configure  include    src
DISCLAIMER  Makefile    autoconf      doc        kernstodo

./configureして、make, make installする、普通のプロジェクトのようである。

$ ./configure --enable-usb --with-upstype=usb --with-upscable=usb \
--enable-cgi --with-cgi-bin=/etc/apcupsd/cgi


本当に必要なのは--enable-usb だけと思われる。

--with-upstype, --with-upscable はインストール後のapcupsd.conf設定ファイルの書換えでも対応できる。
--enable-cgiは、cgiでブラウザからモニタリングできるようにするもの。
そのcgiの配備場所を--with-cgi-binで指定する。


とりあえず、ビルドする。

$ make

インストールすることにより以下のようにファイルが配備される。

$ sudo make install
Password:
        src
        src/lib
        src/drivers
        src/drivers/apcsmart
        src/drivers/dumb
        src/drivers/net
        src/drivers/pcnet
        src/drivers/usb
        src/drivers/usb/linux
        src/cgi
  MKDIR /etc/apcupsd/cgi
  COPY  multimon.cgi => /etc/apcupsd/cgi
  COPY  upsstats.cgi => /etc/apcupsd/cgi
  COPY  upsfstats.cgi => /etc/apcupsd/cgi
  COPY  upsimage.cgi => /etc/apcupsd/cgi
  MKDIR /etc/apcupsd
  COPY  apcupsd.css => /etc/apcupsd/apcupsd.css
  COPY  hosts.conf => /etc/apcupsd/hosts.conf
  COPY  multimon.conf => /etc/apcupsd/multimon.conf
  COPY  apcupsd => /sbin/apcupsd
  COPY  apctest => /sbin/apctest
  COPY  apcaccess => /sbin/apcaccess
  COPY  smtp => /sbin/smtp
        platforms
        platforms/etc
  COPY  apcupsd.conf => /etc/apcupsd/apcupsd.conf
  COPY  changeme => /etc/apcupsd/changeme
  COPY  commfailure => /etc/apcupsd/commfailure
  COPY  commok => /etc/apcupsd/commok
  COPY  offbattery => /etc/apcupsd/offbattery
  COPY  onbattery => /etc/apcupsd/onbattery
        platforms/redhat
  ------------------------------------------------------------
  RedHat distribution installation
  ------------------------------------------------------------
  COPY  apcupsd => /etc/rc.d/init.d
  CP    /etc/rc.d/init.d/halt => //etc/rc.d/init.d/halt.old
  AWK   /etc/rc.d/init.d/halt
=================================================

apcupsd script installation for RedHat  complete.

You should now edit  /etc/apcupsd/apcupsd.conf  to correspond
to your setup then start the apcupsd daemon with:

/etc/rc.d/init.d/apcupsd start

thereafter when you reboot, it will be stopped and started
automatically.

Please check that your halt script in:
    /etc/rc.d/init.d/halt
was properly updated (see installation section of manual)

=================================================
  COPY  apccontrol => /etc/apcupsd/apccontrol
  COPY  80-apcupsd-ups-policy.fdi => /usr/share/hal/fdi/policy/20thirdparty
        doc
  COPY  apcupsd.man => /usr/share/man/man8/apcupsd.8

init.dにサービスが登録されていることがわかる。

また、haltスクリプトが若干修正されている。(apcupsdコメントがついている数行が追加されている)

$ diff /etc/init.d/halt.old /etc/init.d/halt
198a199,210
> # See if this is a powerfail situation.                               # ***apcupsd***
> if [ -f /etc/apcupsd/powerfail ]; then                                # ***apcupsd***
>    echo                                                               # ***apcupsd***
>    echo "APCUPSD will now power off the UPS"                    # ***apcupsd***
>    echo                                                               # ***apcupsd***
>    /etc/apcupsd/apccontrol killpower                                  # ***apcupsd***
>    echo                                                               # ***apcupsd***
>    echo "Please ensure that the UPS has powered off before rebooting" # ***apcupsd***
>    echo "Otherwise, the UPS may cut the power during the reboot!!!"   # ***apcupsd***
>    echo                                                               # ***apcupsd***
> fi                                                                    # ***apcupsd***
>

UPS監視設定を行う

設定ファイルを修正する。

$ sudo vim /etc/apcupsd/apcupsd.conf

configureでusbを指定しているので、できあがったconfファイルには修正する箇所はあまり無い。

変更点は以下のとおり。

$ diff /etc/apcupsd/apcupsd.conf.org /etc/apcupsd/apcupsd.
conf
15c15
< #UPSNAME
---
> UPSNAME APC_ES_500
76c76
< DEVICE /dev/ttyS0
---
> #DEVICE /dev/ttyS0

DEVICE /dev/ttyS0をコメントアウトしないとUSBに接続できない、というエラーが発生した。

サービスに登録する。

$ sudo /sbin/chkconfig --list apcupsd
サービス apcupsd は chkconfig をサポートしますが実行レベルで参照されていません (run 'chkconfig --add apcupsd')
$ sudo /sbin/chkconfig --add apcupsd
$ sudo /sbin/chkconfig --list apcupsd
apcupsd         0:off   1:off   2:on    3:on    4:on    5:on    6:off

init.d下にapcupdsは準備されているので、あとはchkconfigで登録すればOK。

サービスを起動する。

$ sudo /sbin/service apcupsd start
Starting UPS monitoring:                                   [  OK  ]

モニタリングできるか確認してみる。

$ /sbin/apcaccess

大丈夫そうだ。

USBが接続できなかったり、USBが抜けたり、商用電源が停止したり、などといったイベントが発生すると、
/var/log/apcupsd.eventsファイルに記録されるので、そこでも確認できる。

テスト

UPSのテストには、/sbin/apctestが使える。

これは対話的にテストを行うもので、このテストツールを動作させるには背後でapcaccessやapcupsdサービスが動作していると、
USBを排他的にオープンできないので、あらかじめ停止しておく必要がある。

CGIによるモニタリングの有効化

apache2のconf.dにapcupsdの設定を追加し*2、Apacheを再起動する。

$ ls /etc/apcupsd/cgi
multimon.cgi  upsfstats.cgi  upsimage.cgi  upsstats.cgi


$ sudo vim /etc/httpd/conf.d/apcupsd.conf

Alias /apcupsd-status "/etc/apcupsd/cgi/"

<Location /apcupsd-status>
    SSLRequireSSL
    AddHandler cgi-script .cgi
    Options indexes ExecCGI
    DirectoryIndex multimon.cgi
    AuthType Basic
    AuthName "apcupsd-status"
    AuthUserFile /etc/apcupsd/.htpasswd
    Require valid-user
</Location>

$ sudo /sbin/service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

これで、ブラウザからhttps://servername/apcupsd-status/でアクセスすると、
現在のUPSの各種情報を表やグラフとして、また、最近のイベントログも確認することができる。

なお、ローカル外からUPSの状態をモニタリングする意味はあまりないと思うが、SSL且つBASIC認証でステータス表示は保護してみた。
また、http://servername/apcupsd/でcgiを開きたいのでScriptAliasではなく、ただのAliasとして、DirectoyIndexにモニタ用cgiを指定している。
単にBASIC認証+SSLだけならば、AddHandler,Options,DirectoryIndexを消してAliasをScriptAliasにして直接cgiのURLを叩けば問題なし。

シャットダウンの実験

UPSのバッテリ切れで本当にシャットダウンしてくれるのかテストしてみた。

とはいえ、バッテリ切れをテストするための簡単な方法がわからなかった。(apctestには電源断をテストする項目はあるが、バッテリ残量があるのでシャットダウン開始には至らなかった。)

しかたないので商用電源を本当に抜いてバッテリ動作させて警告音をピーピーならしながらテストしてみた。

購入したばかりだからバッテリ残量が少ないので助かったが、60W電球を二個ぐらいつけて余計に電力を消費させてみたりしてテストした。

ブラウザからのバッテリ残量のモニタリングは自動リフレッシュが効いているので、それで残量が減ってゆくのを確認できる。

結果、予定された残り時間に達したとき、きちんとシャットダウンイベントが発生して、きれいにpoweroffしてくれるのを確認できた。

ちなみに、この自宅サーバの消費電力は、サンワサプライの「ワットチェッカー」によると常時70W+なので、ES-500の容量だと余裕で30分ぐらいの時間はありそうな感触である。

結論

APC製USB接続のUPSはLinuxでも問題なく使えるとわかった。

今後、Linuxマシンを新たに組むことがあったら、これを覚えておきたいと思う。

*1:仮にシャットダウン機能が使えないとしてもバックアップ電源は必要だし、無駄にはならないだろう。

*2:AddHandlerをLocationの中に置いて良いものかはよくわからない。