私は、富士通(株)のパーソナルコンピュータ「FM-TOWNS」をベースとしたLinux-Boxを使い、インターネットでのサーバを運用しています。サービス開始当初より、停電や瞬電による動作中の電源切断からシステムを保護するため、UPS(Uninterruptible Power System:無停電電源装置)を導入することを考えました。UPSの機種選定にあたっては、Linux-boxとの連携動作事例(by 湯川高志氏)が公開されていたことが決め手となり、GS-EE社製OUP-400N(国内販売元:関西蓄電池殿)を導入することにしました。OUP-400Nは、小型、計量、静粛、安価で、個人ベースでの利用にも適したUPSです。2.システムの概要導入後、湯川氏の事例に従って、UPS連携パッケージであるgenpowerdをセットアップしましたが、(TOWNS-Linuxのシリアルポートドライバかinitとの相性が悪いのか?)、genpowerdを起動すると、セグメンテーションフォールトを起こし異常終了してしまう、という不具合が発生してしまい、残念ながら自動電源停止処理は実現できない状態で利用せざるを得ませんでした(AT互換機ではうまくいくのに…)。
その後、半年ぐらいはそのまま諦めておりましたが、ある日、システムの保守中に電源異常(電源ケーブルの接触不良)が発生し、危うくハードディスクを壊してしまいそうになったことから、もう一度、徹底的にやってみよう、ということになり、他のUPS連携パッケージの調査、ケーブルの自作、テストなどを行うことになりました。
まず、標準的なpowerdを試してみましたが、異常終了はしないものの、UPS側の信号変化をまったく認識しません。powerd.confファイルをいじってみたり、ケーブルの結線を変えてみたりといろいろ試行錯誤しましたが、どうもうまくいかないため、原点に帰って、UPS-HOWTOのドキュメントを調査したところ、(あやしいと思われる)SYSVINITと連携せず単体で動作可能な、usvdというドイツのFrank Gockel氏作のパッケージを発見。さっそくインストールして動作確認したところ、ソースの部分修正(または、ケーブルの自作)により、見事に動作することが確認できました。
というわけで、前置きが長くなりましたが、ここでは、Linux+usvdを使った、OUP-400Nの連携方法についてご報告いたします。genpowerdやpowerdでうまくいかない方(特にTOWNS-Linuxご利用の方)の参考になれば幸いです。
以降で解説する連携動作は、次のシステムにて動作確認したものです。3.連携動作の概要ハードウェア
PC本体 FM-TOWNS II model HA, model MX UPS GS-EE社製OUP-400N ケーブル OUP/NT(WindowsNTとの連携用純正オプションケーブル) +9P→25P変換アダプタ
ソフトウェア
Linuxパッケージ Slackware96(Kernel version 2.0.30) UPS連携パッケージ usvd-2.0.0.tgz
UPS監視デーモン(usvd)とUPS(OUP-400N)は、以下のように連携して動作します。4.ケーブルの準備停電時
商用電源からUPSへの電力供給が停止(停電)すると、UPSはバッテリーによる運転に切り替わると同時に、停電を通知する端子のレベルが変わります(OUP-400Nでは、6番ピンがLOW→HIGHになる)。UPS監視デーモン(usvd)は、停電によるシリアルポートのレベルの変化を検出すると、システム停止手続を実行するスクリプトファイル(usvdでは、/etc/usvd/linefail)を起動します。復電時商用電源からUPSへの電力供給が再開(復電)すると、UPSは商用電源による運転に切り替わると同時に、停電を通知する端子のレベルが変わります(OUP-400Nでは、6番ピンがHIGH→LOWになる)。UPS監視デーモン(usvd)は、復電によるシリアルポートのレベルの変化を検出すると、システム停止手続をキャンセルするスクリプトファイル(usvdでは、/etc/usvd/lineback)を起動します。バッテリー消耗時UPSがバッテリーによる運転中に電圧が低下すると、バッテリー消耗を通知する端子のレベルが変わります(OUP-400Nでは、5番ピンがHIGH→LOWになる)。UPS監視デーモン(usvd)は、バッテリー消耗によるシリアルポートのレベルの変化を検出すると、即時停止手続を実行するスクリプトファイル(usvdでは、/etc/usvd/battlow)を起動します。また、システム停止と同時に、UPSのインバータを停止します。
ケーブルは、当初、配線を自由に試行錯誤できるように自作しましたが、最終的には、UPS監視デーモン(usvd)にパッチをあてて、WindowsNTとの連携用純正オプションケーブルであるOUP/NTを使えるようにしました。この場合DCE側のコネクタが9P-DSUBですので、TOWNSでは、25P-DSUBに変換するための一般的なアダプタを利用します。もし、自作される方は、以下のように結線してください。
5.UPS連携パッケージのインストールと設定
OUP-400N 9P
DSUB
オス25P
DSUB
オス9P
DSUB
メスLinux-Box Line Fail 6 ----------> 5 8 CTS →停電時HIGH Low Battery 5 ----------> 8 1 DCD →電圧低下時LOW ShutdownUPS 1 <---------- 20 4 DTR ←HIGHでUPS停止 GND 4 ----------- 7 5 GND シグナルグラウント
5.1 usvdパッケージの入手
まず、今回UPS連携パッケージとして利用するusvd-2.0.0.tgzを入手します。USVDとは、Uninterruptible Power Systemをドイツ語で表記した"Ununterbrochene Spannungs-Versorgung"の頭文字をとったものだそうです。私は、sunsiteのups関連ソフトのディレクトリからゲットしましたが、私のサーバにもコピーを置いておきますので、必要な方はご利用ください。5.2 OUP-400N用パッチの入手
OUP-400Nを純正オプションケーブル(OUP/NT)で接続した構成でusvdを使う場合、ソースファイル(usvd.c)の修正が必要です。パッチを用意しましたので、必要な方はご利用ください。5.3 usvdパッケージのインストール
参考までに、オリジナルでは、DCD high = 停電、CTS high = 電圧低下 となっています。
>tar xvzf usvd-2.0.0.tgz
>cd usvd-2.0.0
>cp (downloaded dir)/oup400n-patch .
>patch < oup400n.patch
>make
(ルートになって)
>make install
UPS監視デーモン(usvd)とUPS停止用プログラム(usv_off)が作られて、それぞれ/sbinにインストールされます。
Slackwareでは、/etc/rc.d/rc.Mおよび/etc/rc.d/rc.0です。usv_offは、"halt or reboot"手続の直前に追加してください。
>cd /dev
>ln -s cua0 usv
(upsdは、デフォルトで/dev/usvを10秒間隔で監視しています)
パッケージには、標準的なスクリプトファイルがetc以下に用意されていますので、これをコピーすればOKです。内容は次の通りです。/etc/usvd/linefail:
usvdが停電時に実行するスクリプトです。ユーザへの通知とシャットダウンコマンドの実行を行っていますが、OUP-400Nのバックアップ時間は、定格負荷で約5分間ですので、ここで起動されるshutdownコマンドの引数では、5以下を指定すべきでしょう(デフォルトでは-10になっています)。/etc/usvd/lineback:usvdが復電時に実行するスクリプトです。シャットダウンコマンドをキャンセルしユーザに通知します。/etc/usvd/battlow:usvdがバッテリー電圧低下時に実行するスクリプトです。即時シャットダウンを実行します。/etc/usvd/noconnect:シリアルケーブルがUPSに接続されていないときに実行されるスクリプトです。
6.1 準備
Linux-BoxとUPSを付属のケーブルで接続しますが、安全のため、Linux-Boxの電源はUPSにつながず、直接商用電源からとります。UPSには、負荷として白熱灯の電気スタンドなどをつないでおくと、インバータの動作確認ができて好都合です。6.2 停電時と復電時の動作確認
power is failing... please log out as soon as you can
・
・
・
The system is going DOWN for system halt in 5 minutes !!
power is back... you can continue
6.3 バッテリー消耗時の即時停止の確認
The system is going DOWN for system halt in 5 minutes !!
battery is low
6.4 総合確認
これまでの確認で正常動作することは間違いないはずですが、念のため実際に Linux-box の電源を UPS から採って動作確認を行ないます。UPS のコンセン トを抜いて停電状態を作りだしシステム停止を確認します。十分に充電された状態にもかかわらずバッテリー消耗による即時停止に至ってしまう場合は、/etc/usvd/linefailに記述された停電時のシャットダウンまでの時間を調整します。また上記同様、手動で停止手続きをキャ ンセルし、バッテリーが消耗してシステムが即時停止することも確認します。7.最後に
TOWNS-Linuxでのgenpowerdの動作不良により、一時は諦めていた自動電源断も、usvdを利用することで、めでたく実現することができました。以下の関係する皆さんに深く感謝いたします。どうも、ありがとうございました。
- OUP-400Nを無償で貸し出していただいた、(株)関西蓄電池の銭谷さん
- 結婚前の忙しい時に、動作確認などの作業をやってくれた村山@HMCさん
- 今回の動作確認やこのドキュメントの執筆において大変参考となった「OUP-400NとLinux-boxの連携動作」の執筆者である湯川高志さん
- usvdの作者であるFrank Gockel氏
- UPS-HOWTO関係のドキュメントをまとめられたLinuxの先人の方々
- 家族サービスの時間を今回の作業のために諦めてくれた?妻と3人の子供たち
- その他、今回の作業を支えて頂いた皆様