OUP-400NとTowns-Linuxとの連携


1.はじめに
私は、富士通(株)のパーソナルコンピュータ「FM-TOWNS」をベースとしたLinux-Boxを使い、インターネットでのサーバを運用しています。サービス開始当初より、停電や瞬電による動作中の電源切断からシステムを保護するため、UPS(Uninterruptible Power System:無停電電源装置)を導入することを考えました。UPSの機種選定にあたっては、Linux-boxとの連携動作事例(by 湯川高志氏)が公開されていたことが決め手となり、GS-EE社製OUP-400N(国内販売元:関西蓄電池殿)を導入することにしました。OUP-400Nは、小型、計量、静粛、安価で、個人ベースでの利用にも適したUPSです。

導入後、湯川氏の事例に従って、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ご利用の方)の参考になれば幸いです。

2.システムの概要
以降で解説する連携動作は、次のシステムにて動作確認したものです。

ハードウェア
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
 

3.連携動作の概要
UPS監視デーモン(usvd)とUPS(OUP-400N)は、以下のように連携して動作します。

停電時

商用電源から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のインバータを停止します。
4.ケーブルの準備
ケーブルは、当初、配線を自由に試行錯誤できるように自作しましたが、最終的には、UPS監視デーモン(usvd)にパッチをあてて、WindowsNTとの連携用純正オプションケーブルであるOUP/NTを使えるようにしました。この場合DCE側のコネクタが9P-DSUBですので、TOWNSでは、25P-DSUBに変換するための一般的なアダプタを利用します。もし、自作される方は、以下のように結線してください。
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.UPS連携パッケージのインストールと設定

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)の修正が必要です。パッチを用意しましたので、必要な方はご利用ください。
参考までに、オリジナルでは、DCD high = 停電、CTS high = 電圧低下 となっています。
5.3 usvdパッケージのインストール
  1. usvd-2.0.0.tgzを展開します。
  2. >tar xvzf usvd-2.0.0.tgz
  3. OUP-400N用パッチをあてます。
  4. >cd usvd-2.0.0
    >cp (downloaded dir)/oup400n-patch .
    >patch < oup400n.patch
  5. プログラムをコンパイルしインストールします。
  6. >make
    (ルートになって)
    >make install
    UPS監視デーモン(usvd)とUPS停止用プログラム(usv_off)が作られて、それぞれ/sbinにインストールされます。
5.4 設定
  1. システムの起動、および停止スクリプトに、usvdとusv_offの起動コマンドを追加します。
  2. Slackwareでは、/etc/rc.d/rc.Mおよび/etc/rc.d/rc.0です。usv_offは、"halt or reboot"手続の直前に追加してください。
  3. UPSが接続されているシリアルポートのデバイスファイルに、/dev/usvからのリンクを張ります。
  4. >cd /dev
    >ln -s cua0 usv
    (upsdは、デフォルトで/dev/usvを10秒間隔で監視しています)
  5. 電源異常時にusvdが実行するスクリプトファイルを、/etc/usvdに作成します。
  6. パッケージには、標準的なスクリプトファイルが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.動作確認

6.1 準備

Linux-BoxとUPSを付属のケーブルで接続しますが、安全のため、Linux-Boxの電源はUPSにつながず、直接商用電源からとります。UPSには、負荷として白熱灯の電気スタンドなどをつないでおくと、インバータの動作確認ができて好都合です。
6.2 停電時と復電時の動作確認
  1. Linuxをリブートして、upsdが正しく起動されることを確認します。
  2. UPSのコンセントを抜くかTESTスイッチを押します。数秒で、以下のようなメッセージが表示されます。
  3. power is failing... please log out as soon as you can
      ・
      ・
      ・
    The system is going DOWN for system halt in 5 minutes !!
  4. そのまま停電状態を続けるとシステムが停止します。この際、UPSのインバータも停止します。
  5. システムを起動し、上と同様の停電状態を作ります。その後、コンセントを差し込んで復電させると、以下のようなメッセージが表示され、シャットダウン処理がキャンセルされます。
  6. power is back... you can continue

  7. しばらく様子を見て、システムが停止してしまわないことを確認します。

6.3 バッテリー消耗時の即時停止の確認

  1. システムが起動した状態でUPSのコンセントを抜き、以下のメッセージを確認します。
  2. The system is going DOWN for system halt in 5 minutes !!
  3. shutdown -c とコマンドを入力し、手動で停止手続を解除します。
  4. バッテリーの消耗を待ちます。
  5. 以下のメッセージが表示され即時にシステムが停止することを確認します。
  6. battery is low

6.4 総合確認

これまでの確認で正常動作することは間違いないはずですが、念のため実際に Linux-box の電源を UPS から採って動作確認を行ないます。UPS のコンセン トを抜いて停電状態を作りだしシステム停止を確認します。十分に充電された状態にもかかわらずバッテリー消耗による即時停止に至ってしまう場合は、/etc/usvd/linefailに記述された停電時のシャットダウンまでの時間を調整します。また上記同様、手動で停止手続きをキャ ンセルし、バッテリーが消耗してシステムが即時停止することも確認します。
7.最後に
TOWNS-Linuxでのgenpowerdの動作不良により、一時は諦めていた自動電源断も、usvdを利用することで、めでたく実現することができました。以下の関係する皆さんに深く感謝いたします。 どうも、ありがとうございました。
1998年5月24日
村嶋 亮一
murasima@hmc.gr.jp

Copyright (c) 1998-2004 Ryoichi "Rio" MURASHIMA
[戻る] [R!o Interactive top]