OMRON の UPS BY35S を Linux と使う

先日引っ越して自宅サーバを移動したところ、まれにサーバの電源を取っている子ブレーカが落ちることが判明。HDD が壊れたらたまらないので、今まで自宅では使っていなかった UPS を導入することにした。

前の会社では APCUPS ばかり使っていたので、惰性で APC にしようかなと思ったのだが、APC の個人ユースの製品はあまり評判がよろしくない感じ。使ったことはないけど評判よさげな OMRON にしてみた。

オムロン 無停電電源装置(常時商用給電/正弦波出力) 350VA/210W BY35S

オムロン 無停電電源装置(常時商用給電/正弦波出力) 350VA/210W BY35S

わりと省電力の PC サーバ 1台しか接続しないので、350VA モデルを¥13,992 で購入。この値段で正弦波出力だし、電池寿命が 4〜5年と長めなのも嬉しいところ。

さっそく Linux (CentOS-5.5 x86_64) で自動シャットダウンの設定。
複数台をネットワーク越しにシャットダウンできる PowerAct Pro というものもあるが、1台 (KVM 上に仮想マシンはある) だし、Apache が必要らしいけど KVM host に入れるのも大袈裟だし、ということで Simple Shutdown Software(オープンソース版) を使う。

インストールは zip を展開して shell script を叩くだけ。

$ unzip SimpleSoftwareVer210_Linux.zip
$ cd SimpleSoftware_Ver210_Linux/Release/
# sh ./install.sh

(ライセンス確認入力)

Simple Shutdown program has been installed completely.
Please run below command and setup the parameters of
Simple Shutdown to meet your system.

Command:  /usr/lib/ssd/master/config.sh"

設定用に /usr/lib/ssd/master/config.sh を実行して、いくつか質問に答える。

1. Port Selection Mode:               Auto Mode
2. AC fail Delay time (Sec):          120
3. External Command Line:             /root/shutdown.sh
4. External Command needs time (Sec): 60
5. OS Shutdown needs time (Sec):      60
6. Send Message to login users:       Enable
  1. 接続されている UPS を自動検出するか。これは自動で
  2. 商用電源断から何秒でシャットダウンプロセスを開始するか
  3. シャットダウン時に実行する外部コマンドを指定。後述する shell script を指定
  4. 実行した外部コマンドが完了するまでに必要な秒数
  5. OS がシャットダウンするのに必要な秒数
  6. 端末にメッセージを表示するかどうか

このように設定すると、

  • 電源断から 120 秒後にプロセス開始。外部コマンド実行
  • 60 秒待って (外部コマンドが終了したはず)
  • OS 自身のシャットダウンを実行
  • さらに 60 秒後に UPS の電源が落ちる

という動作になる。

設定は /usr/lib/ssd/master/Shutdown.cfg に書き込まれる。

[ShutdownParam]
AutoMode = 1
PortType = USB
PortNum = 1
ACFailDelayTime = 120
ExternalCommand = /root/shutdown.sh
ExCmdNeedTime = 60
ShutdownNeedTime = 60
SendMessage = 1

[End]

さて、このサーバは KVM のホストなので、動いている仮想マシンを先に shutdown するために shell script を用意した。

#!/bin/sh
LANG=C
export LANG

VM=`/usr/bin/virsh list --all | grep 'running$' | awk '{print $2}'`
for v in $VM
do
  echo "shutdown virtual machine $v" | logger -t "shutdown.sh"
  virsh shutdown $v
done

仮想マシンの一覧を取得して、それぞれについて shutdown 指令を送る、というまあベタな内容。

電源を引っこ抜いたときの syslog の内容はこんなかんじ。

2011-02-16T01:37:09.871667+09:00 kvmhost SimpleShutdown[2531]: AC line failure!
2011-02-16T01:39:09.171669+09:00 kvmhost SimpleShutdown[2531]: Run External Command.
2011-02-16T01:39:09.193183+09:00 kvmhost shutdown.sh: shutdown virtual machine testvm
2011-02-16T01:40:10.407570+09:00 kvmhost SimpleShutdown[2531]: Shutdown Agent Stop.
2011-02-16T01:40:10.411646+09:00 kvmhost SimpleShutdown[2531]: Shutdown.
2011-02-16T01:40:10.435218+09:00 kvmhost shutdown[3043]: shutting down for system halt

ということで普通に動いたのだけど、1点疑問が。
どうも、「シャットダウンプロセスが開始した後に商用電源が回復した場合、UPS の電源断がキャンセルされない?」ような。

サーバがシャットダウン完了後、まだ UPS が上がっている状態で商用電源が復活しても、UPS の電源断がキャンセルされず、そのまま落ちてしまう。なので UPS が生きているうちに落ちたブレーカーを上げて、すぐサーバを起動すると、起動中に UPS が落ちて悲惨な目に遭う気がする。というか実験中に遭った。……何か変な気がするのでマニュアル読み直そう。