ネットワークを経由したUPSの共有
最後に,ネットワークを介したUPS状態の共有方法を説明しよう。冒頭のFig.2でも説明したように,APCUPSDでは1台のUPSに複数台のコンピュータを接続した場合でも,ネットワークを経由してバッテリ状態をほかのコンピュータに伝えることが可能だ。直接UPSとシリアルケーブルが接続されていないコンピュータであっても正しくシャットダウンすることができる。
UPSを複数のコンピュータで共有をする場合,UPSとシリアルケーブルを接続したコンピュータが「マスタ」となり,ほかのコンピュータが「スレーブ」となる(Fig.3)。マスターは1台だけだが,スレーブは最大20台まで設定が可能だ。
One Point!
マスタとスレーブとで注意することは,同じバージョンのAPCUPSDを用いることだ。バージョンが異なると,正しく通信できないことがある。
マスタやスレーブとして動作させるためには,apcupsd.confファイル内のUPSCLASS項目以降で設定する。標準では次のように記述されており,マスタ,スレーブいずれにも設定されていない。
# UPSCLASS [ standalone | shareslave | sharemaster | netslave | netmaster ]
# normally standalone unless you share a UPS with multiple machines.
UPSCLASS standalone
#
# Unless you want to share the UPS (power multiple machines).
#this should be disable
# UPSMODE [ disable | share | net | sharenet ]
UPSMODE disable
#
#NETACCESS <string> [ true | false ] Enable Network Access Support
NETACCESS true
#
# NETTIME <int>
#NETTIME 100
#
# NETPORT <int>
#NETPORT 6666
#
# MASTER <string>
#MASTER
#
# SLAVE <string>
#SLAVE
#
# USERMAGIC <string>
#USERMAGIC
マスタとスレーブの共通設定
マスタやスレーブとして動作させるためには,APCUPSDのネットワーク機能を有効にしなければならない。そのためにはUPSMODEをnetに設定しNETACCESSをtrueに設定する必要がある。
# UPSMODE [ disable | share | net | sharenet ]
UPSMODE net
#
#NETACCESS <string> [ true | false ] Enable Network Access Support
NETACCESS true
また,マスタとスレーブ間でデータを転送する間隔(秒)をNETTIMEで通信利用するTCPポート番号をNETPORTに指定する。たとえば,1分(60秒)おきにデータを転送し,TCPポート6666を利用する場合には,次のような設定になる。
# NETTIME <int>
NETTIME 60
#
# NETPORT <int>
NETPORT 6666
One Point!
インターネットに接続されているホストの場合、NETTIMEで設定したTCPポートは、パケットフィルタリングで外部からの接続を拒否する設定をしておこう。そうしないと、偽装された不正なパケットによって、偽ったUPSの電源状態が通知され、何者かが不正にシャットダウン動作を引き起こす可能性がある。
残りの設定項目であるUPSCLASS,MASTER,SLAVE,USERMAGICの各項目は,マスタであるのかスレーブであるのかによって設定値が異なる。
マスタ側の設定
マスタの場合,UPSCLASSにはマスタであることを示すnetmasterを指定する。
UPSCLASS netmaster
そしてSLAVEの場合には,スレーブとなるホストのIPアドレスを指定する。マスタはSLAVEに記述したホストに対してのみUPS情報を転送するのだ。
ホスト部分には,ホスト名でもIPアドレスでも指定できるがIPアドレスで指定するほうが望ましい。なぜならば起動時やシャットダウン時の最中などにはDNSサーバやhostsファイルが正しく参照されるか分からないためだ。たとえば,192.168.1.100のコンピュータをスレーブとするのであれば,次のように記述すればよい。
SLAVE 192.168.1.100
複数のスレーブがあるならば,その台数分だけSLAVE項目を列挙すればよい(最大20個まで)。たとえば,192.168.1.100と192.168.1.101をスレーブとするならば,次のようにSLAVE項目を2つ記述すればよい。
SLAVE 192.168.1.100
SLAVE 192.168.1.101
以上でマスタ側の設定は完了だ。
スレーブ側の設定
スレーブの場合には,UPSCLASS項目にスレーブであることを示すnetslaveと記述すればよい。
UPSCLASS netslave
また,スレーブ側ではシリアルケーブルではなくTCP経由でデータを取得することになるので,UPSケーブルの種類を示すUPSCABLEの値をetherと記述変更する。
UPSCABLE ether
次に,MASTER項目にマスタとなるホストを指定する。ホスト名でもIPアドレスでも指定できるが,前述のようにIPアドレスで指定するのが望ましい。たとえばマスタが192.168.1.1であるならば次のように指定する。
MASTER 192.168.1.1
最後にUSERMAGIC項目にて,適当な17文字以内の識別子を付ける。この識別子は,スレーブを区別する名前として使われるため,どのような文字列でもかまわない。ただし,複数のスレーブが存在する場合にはスレーブごとに別々の識別子をつけなければならない。
たとえば,識別子にMyClientとつける場合には次のように指定する。
USERMAGIC MyClient
以上でスレーブ側の設定は完了だ。
マスタとスレーブの動作
マスタ側とスレーブ側の設定が完了したならば,それぞれを実行する。マスタとスレーブはどちらを先に実行してもよい。
マスタ側とスレーブ側が正しく通信できた場合,/var/log/apcupsd.eventsファイルにその動作記録が残る。スレーブの場合には次のようになる。
Tue Jan 15 02:14:26 JST 2002Connect to slave XXX.XXX.XXX.XXX succeeded
同様に,マスター側には次のように記録される。
Tue Jan 15 02:14:20 JST 2002Connect to master XXX.XXX.XXX.XXX succeeded
正しく通信できたならば,あとはUPSケーブルを直接接続している場合と動作は同じだ。すなわち,UPSの状態がBATERRYLEVEL項目で設定した残量を下回るか,MINUTESで設定した時間を経過した場合にはシャットダウンされる。実際にUPSの電源コンセントを抜いてしばらく待てば,その動作を確認できるはずだ。
なおAPCUPSDは,LinuxだけではなくFreeBSDやWindowsでも動作する。そのため,1台のUPSにLinuxホストとWindowsパソコンを接続しLinux側をマスター動作とし,Windows側をスレーブ動作とさせるようにすれば,LinuxとWindowsの双方を正しくシャットダウンさせるといったことも可能だ(ただし,マスタとスレーブはIPアドレス,またはホスト名で互いを識別するため,DHCPなど動的なIPの環境での利用はやや難しい)。
One Point!
Windows版のAPCUPSDは,コマンドライン版で提供される。設定方法などは,Linux版と同じくapcupsd.confファイルを記述する方法であり,Linux版もWindows版も使い方は変わらない。
ネットワーク通信時の注意
ここで気になる点がある。当たり前のことだが,マスタとスレーブが正しくUPSを共有して利用できるようにするためには,停電中もマスタとスレーブが通信できていなければならない。つまり,マスタとスレーブを接続するハブなどは,UPSからバッテリが供給される必要がある。そうしなければ停電中にはハブの電源が切れてしまいマスタとスレーブとが通信できないことになってしまう。このため,UPSの総容量はコンピュータだけでなくネットワークに関する機器までをカバーするよう考えておかなければならない。
まとめ
UPSという機器は,導入するだけでもバックアップ電源として使うことができる。しかし,より安全確実にマシン(ハードディスク)をカバーしたいのであれば,正しいシャットダウンが必要になる。このためには,今回説明したようなソフトウェアによるシャットダウンが必須だ。
また,APCUPSDはapcaccessコマンドを利用すれば電源状態を調べることもできるため,電源の監視目的で利用することもできる。今回利用したBK 500は,バッテリ動作か否かといった簡単な情報しか得られないが,上位機種のSmart-UPSでは残量や負荷,電圧なども調べることができる。電圧変動を調査するといった目的にも利用できるだろう。
また,今回は紹介できなかったが,APCUPSDにはCGIからUPSの状態を参照できるプログラム群が/etc/apcupsd/cgiディレクトリに格納されている。このスクリプトを利用すれば,ApacheなどのWebサーバを使いWeb経由でこれらのCGIを呼び出せるようにできる。Webブラウザを介してUPSの状態を参照できるようになるのだ。
Smart-UPSを使っている場合には,以前紹介したUCD-SNMPを使ってapcaccessコマンドからの出力を加工するスクリプトと組み合わせることが可能だ。SNMPで電源状態を取得できるようにし,MRTGなどを利用して電圧変動や負荷をグラフ化してみるというのも面白いだろう。
なお今回は,APCのBK 500を利用したわけだが,APCUPSDのWebサイトには,UPSとの結線図も掲載されている。このため,APC製以外の機種でもAPCUPSDを利用できる可能性が高い。さすがにバッテリの残量や予測残り時間,負荷状況や電圧などはバイナリデータとして送信されるため機種間の差異が大きい。このため取得は難しいが,単なる信号のオンオフで電源状態を伝えているUPS(BK 500もそのような機種のひとつだ)であれば,結線を少し変更するだけで利用可能なはずだ。