[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:04562] Re: UPS: OUP-400N


湯川です。

数人の方が興味を持って頂いたようなので流します。
#JF-ML にも入ろうと思ってます。

UPS-HOWTO も訳し始めたのですが途中で止まってます。分量が多い
んだもの(;_;)。

=====
  事例報告: OUP-400N と Linux-box との連携動作
  湯川 高志著
  1997年5月4日

  本稿では、GS-EE社製の無停電電源 OUP-400N に Linux が走っているコンピュ
  ータ(以下、Linux-box と呼ぶ)して、停電時に自動的にシステムを停止するよ
  う連携させる方法について報告します。

  1.はじめに

  IBM-PC 互換機で稼働する OS である Linux は、UNIX と互換であること、様
  々な進歩的な機能を意欲的にとりこんでいること、コピーフリーであることな
  どから近年人気が高まっています。IBM-PC互換機の低価格化ともあいまって、
  家庭で Linux が稼働している PC (Linux-box) を所有する人も増えていま
  す。

  手軽になったとは言え、UNIX には変わりませんから、正しい手順を踏まずに
  マシンを停止させるるとファイルシステムに重大な障害が起こる可能性があり
  ます。特に停電などシステム稼働中に突然電源が切れてしまう状況は、システ
  ムにとって非常に危険なことです。このような危険を回避するには、無停電源
  装置(UPS)から電源を供給することと、停電時に UPS から発せられる信号を利
  用して UPS の電池が消耗する前に正しい手順でシステムを停止するという
  UPSと Linux-box 連携動作が必要となります。

  GS-EE 社製 OUP-400N は小型、軽量、静粛、安価で家庭での利用にも適した
  UPS です。本稿では、筆者が自分の Linux-box に OUP-400N を接続して連携
  動作させるために行なった、ケーブルの自作、容易に入手可能なフリーの UPS
  連携パッケージを用いた連携動作の設定、動作確認について報告します。本報
  告で述べる Linux-box やソフトウェア・パッケージの諸元を以下に示しま
  す。

     ハード:
        Pentium 搭載した自作IBM-PC/AT互換機

     Linuxパッケージ:
        Slackware96 パッケージ (kernel version 2.0.0)

     UPS連携パッケージ:
        genpowerd

  本稿は以下のような構成になっています。2章で Linux における UPS との連
  携の動作原理を説明し、3章で自作ケーブルの接続について述べます。4章では
  UPS連携パッケージのインストールについて述べ、5章で動作確認とその結果に
  ついて報告します。

  なお、ソフトウェア・パッケージの設定やケーブル接続に関し、筆者は自己の
  持ちうる限りの知識と洞察力を動員して安全で汎用的となるように勤めていま
  すが、それでも、本稿はあくまで一事例の報告でしかありません。すなわち、
  本稿で報告する設定がそのままでどのような Linux-box にも適用できること
  を保証するものではありません。また、ケーブルの接続についても動作、安全
  性などいかなる面においても、筆者は保証するものではなく、責任を負うもの
  ではありません。

                                     1
  2.  Linux と UPS との連携

  2.1.  UPSとの連携とは

  Linux と UPS の連携動作とは以下のような動作を言います。

  o  停電時にそれをユーザに通知ししかるべき時間後(一般に 2〜10分)にシス
     テムを停止する。

  o  復電した場合はシステム停止の手続きを中止し、通常の動作に戻る。

  o  上記によりシステムが停止するより以前に UPS のバッティリが消耗した場
     合は緊急にシステムを即時停止する。

  o  システム停止時には、UPSのインバータも停止させる。

  UPS の信号出力や機能によってすべての動作が実現可能とは限りませんが、第
  1項目と第2項目は連携動作としては必須です。なお、OUP-400N は、全動作項
  目を実現するに十分な機能を持っています。

  2.2.連携に必要な要素

  上記連携動作を実現するためには以下が必要です。

      通信機能付きUPS:
        停電、バッテリィの消耗などを Linux-boxに通知できる機能、ま
        た、Linux-box からの信号によりインバータを停止できる機能がつい
        たUPS。一般に各信号は単純なスイッチ(リレー)の ON/OFF または
        RS232C のレベル信号によりますが(dumbモード)、より高機能な機種で
        RS232Cのデータ通信によりきめ細かな通信ができるモード(smartモー
        ド)も持つものもあります。

      ケーブル:
        UPS と Linux-box を接続します。一般に UPS を dumbモードで使うの
        で、UPS からの通知はレベル信号になっています。これらの信号が
        Linux-box のシリアルポートのうちレベル信号を検出できるピン
        (CTS,DCDなど)に接続されるよう配線します。

      UPS監視デーモン:
        シリアルポートに接続されたUPSからの信号を監視して、停電やバッ
        ティリ消耗などの通知があった場合に、状態ファイル
        (/etc/powerstaus)にその状況を記述するとともに init にシグナルを
        (SIGPWR)送ります。また、シリアルポートを制御して、UPSのインバー
        タを停止させる機能も持ちます。

      UPS 対応 init:
        UNIX のすべてのプロセスを司るのが init プロセスです。UPS対応
        init は SIGPWR を受けとると、状態ファイルを参照し、停電であれば
        /etc/inittab の停電用エントリ(pfエントリ)を、復電であれば復電用
        エントリ(pgエントリ)をそれぞれ実行します。それぞれのエントリに
                                     2
        は、一定時間経過後にシステムを停止させるコマンドやシステム停止手
        続きを中断させるコマンドを記述します。これらエントリからスクリプ

        トを呼ぶことにより、より複雑な動作をさせることも可能です。

  Linux の最近の配布パッケージに含まれる init は、SysVinit パッケージの
  もので UPS 対応になっています。また、powerd という最もシンプルな UPS監
  視デーモンも含まれています。本稿では、ケーブル配線に対する柔軟性、バッ
  テリィ消耗時の即時停止のサポート、充実したドキュメントなどの点から、
  powerdの改良版である genpowerd を用います。

  2.3.連携動作の概要

  ここでは、実際に停電が起こった際に上記要素がどのように動作するかを簡単
  に述べます。より詳細には、genpowerd のドキュメントを参照して下さい。

  2.3.1.停電時

  1. 停電すると UPS はバッテリィ運転に切替えると同時に、停電を通知する端
     子のレベルを変更します。これにより、Linux-box のシリアルポートのあ
     る端子のレベルが変化します。

  2. genpowerd は常時シリアルポートの端子のレベルを監視しており、停電に
     よるレベルの変化を検出します。停電を検出すると、状態ファイル
     /etc/powerstatus に "FAIL" と書き込み、また、バッテリィ消耗時の即時
     停止のために使う /etc/upsstatus にも "FAIL"と書き込みます。次
     に、init に対してシグナル SIGPWR を発行します。

  3. init は SIGPWR の受信すると、 /etc/powerstatus を参照して "FAIL" で
     あることから、/etc/inittab の停電用のエントリ pfを実行します。pf に
     は、genpowerd のパッケージに含まれる genpowerfailというスクリプトを
     "start" を引数として実行するように設定しておきます。

  4. genpowerfail スクリプトは "start" を引数として起動される
     と、/etc/upsstatus を参照します。この内容が"FAIL"の場合は、一定時
     間(2〜10分程度;UPSのバックアップ時間より少し短い時間に設定)後にシス
     テム停止するように shutdown コマンドを起動します。

  5. shutdown コマンドは全ユーザにシステム停止を予告するとともに、指定時
     間が経過するとシステムを停止します。shutdown がシステム停止時に実行
     する /etc/rc.0 にインバータ停止のコマンドを記述しておくと、システム
     停止と同時に UPS のインバータも停止します。

  2.3.2.復電時

  1. 復電すると UPS は商用電源運転に切替えると同時に、停電を通知する端子
     のレベルを通常に戻します。これにより、Linux-box のシリアルポートの
     ある端子のレベルが通常に復帰します。

  2. genpowerd は復電によるレベルの変化を検出し、状態ファイル
     /etc/powerstatus に "OK" と書き込み、また、/etc/upsstatusにも "OK"
                                     3
     と書き込みます。次に、init に対してシグナル SIGPWR を発行します。

  3. init は SIGPWR の受信すると、 /etc/powerstatus を参照して "OK" であ
     ることから、/etc/inittab の復電用のエントリ pgを実行します。pg に
     は、genpowerfailスクリプトを "stop" を引数として実行するように設定
     しておきます。

  4. genpowerfail スクリプトは "stop" を引数として起動されると、shutdown
     のキャンセルコマンド(shutdown -c)を実行します。

  5. shutdown はシステム停止の手続きを中止し、システムを通常の稼働状態に
     復帰させます。

  2.3.3.バッテリィ消耗時

  バッテリィ消耗は、すでに停電時の動作は実行されている状態で発生します。

  1. バッテリィの残りが少なくなると バッテリィ消耗を通知する端子のレベル
     を変更します。これにより、Linux-box のシリアルポートのある端子のレ
     ベルが変化します。

  2. genpowerd はバッテリィ消耗を検出すると、状態ファイル
     /etc/powerstatus に "FAIL" と書き込み、/etc/upsstatus には "SCRAM"
     と書き込みます。次に、init に対してシグナル SIGPWRを発行します。

  3. init は SIGPWR の受信すると、 /etc/powerstatus を参照して "FAIL" で
     あることから、/etc/inittab の停電用のエントリ pfにあるように
     genpowerfailスクリプトを "start" を引数として実行します。

  4. genpowerfail スクリプトは /etc/upsstatus を参照し、この内容が
     "SCRAM"の場合は、即時システム停止するように shutdown コマンドを起動
     します。

  5. shutdown コマンドは全ユーザにシステム停止を予告するとともに、即時シ
     ステムを停止します。shutdown がシステム停止時に実行する /etc/rc.0に
     インバータ停止のコマンドを記述してあるので、システム停止と同時に
     UPSのインバータも停止します。

  3.ケーブルの製作

  OUP-400N には WindowsNT との連携のためのケーブルがオプションとして用意
  されていますが、配線を自由に試行錯誤できるよう自作しました。最終的には
  以下の配線としました。

     OUP-400N                               Linux-box
  (9P-DSUB Female)                       (9P-DSUB Male)

  Line Fail(+)     6 --------------------- 8  CTS
  Low Battery(-)   5 --------------------- 1  DCD
  Shutdown UPS(+)  1 --------------------- 4  DTR
  GND              4 --------------------- 5  GND

                                     4

  OUP-400N からの信号は 停電(Line Fail)とバッテリィ消耗(Low Battery)で、

  前者は停電時に High レベル、後者はバッテリィ消耗時に Low レベルになり
  ます。これをそれぞれ、Linux-box の CTS、DCD に接続します。また、
  Linux-box からの制御信号はインバータ停止(Shutdown UPS)で、Highレベルに
  するとインバータが停止します。これを Linux-box の DTR に接続します。
  OUP-400Nのこれら信号線は RS232C レベルなので、抵抗器やプルアップなどは
  一切不要で、直接電線でつなぐだけで良いので製作は容易です。

  4.  UPS連携パッケージのインストールと設定

  まず、genpowerd のパッケージを入手しインストールします。インストールの
  際には、genpwoerd デーモンが正しくシリアルポートを監視するようケーブル
  の配線情報をヘッダファイルに記述する必要があります。コンパイル、インス
  トールが済んだら、inittab、genpowerfailスクリプト、/etc/rc.0 などの設
  定を記述します。以下、それぞれを具体的に説明します。

  4.1.  genpowerdパッケージの入手

  genpowerd は Linux 用ソフトを多く収録している sunsite アーカイブに含ま
  れています。日本では、種々の Linux 配布パッケージや雑誌の付録の CD-ROM
  を探せばまず見つかるはずです。インタネットにアクセスできるなら、archie
  で探せば多くのミラーサイトが検索できるはずです。もちろん本家であるノー
  ス・カロライナ大学から匿名ftpすることも可能ですが、それよりも容易で便
  利な入手法が存在するはずです。筆者が利用したものは Version 1.0.1 で
  す。

  4.2.  genpowerd のインストール

  本来 Linux 用のためインストールは容易ですが、製作したケーブルにあわせ
  て信号のピン配線情報をヘッダファイルに記述してやる必要があります。実は
  上記のケーブル配線は Linux-box 側からみると、genpowerd のパッケージに
  最初から含まれている "apc2-nt" という配線情報と同一です。したがって、
  ヘッダファイルをまったく変更せずに、起動時に引数として与える配線情
  報IDをとしてこれを指定することで正常に動作するはずです。しかし、実際の
  機器の名前と違うIDを指定するのは、あまり気分の良いものではありませんの
  で、きちんと OUP-400N 用のエントリを追加しました。具体的に
  は、genpowerd.h 内で

   struct { ... } *pups, ups[]= { ... }

  と ups という配列の初期化している部分に以下を追加しました。

  /* Takashi Yukawa's OUP-400N */
   {"oup-400n",     {TIOCM_RTS,0}, {TIOCM_DTR,1}, 5, {TIOCM_CTS,1}, {TIOCM_CAR,0}, {0,0}},

  あとは、make および make install で容易にコンパイル、インストールが完
  了します。make すると、genpowerd の他に gentest というプログラムも作ら
  れるはずです。これは動作確認で利用します。
                                     5

  また、ケーブルを接続するシリアルポートのデバイスを /dev/UPS という名前

  にリンクしておくと便利です。

  4.3.設定

  以下の設定を行ないます。

  4.3.1.  /etc/inittab

  /etc/inittab の pfエントリに "/etc/genpowerfailstart" を、 pgエントリ
  に "/etc/genpowerfail stop"をそれぞれ記述します。

  4.3.2.  /etc/rc.d/rc.local

  システム起動時に genpowerd デーモンが起動されるように rc.local に以下
  のような記述を追加します。

  #
  # start UPS daemon
  #
  echo "Starting genpower daemon..."
  if [ -x /sbin/genpowerd ]; then
      /sbin/genpowerd /dev/UPS oup-400n
  fi
  #

  4.3.3.  /etc/rc.d/rc.0

  /etc/rc.d/rc.0 内に UPS のインバータ停止のコマンドを記述します。具体的
  には、rc.0 の末尾である

    # Now halt or reboot.
    echo "$message"
    [ ! -f /etc/fastboot ] && echo "On the next boot fsck will be FORCED."
    $command -f

  の直前に、以下のような記述を追加します。

                                     6

    # See if this is a powerfail situation (genpowerd).

    if [ -r /etc/upsstatus ]; then
      status=`head -1 /etc/upsstatus`
    # Kill power if needed
      if [ $status != "OK" ]; then
        echo "Killing Power..."
        sleep 5
        genpowerd -k /dev/UPS oup-400n
      fi
    fi

  4.3.4.  /etc/genpowerfail

  /etc/genpowerfail スクリプトは本来そのまま利用できるはずですが、
  shutdown がなぜか reboot するように書いてある(深い意味があるのかも知れ
  ませんが)ので、筆者はこれを halt するように変更しました。具体的には、

   shutdown -r ...

  という記述をすべて

   shutdown -h ...

  に変更しました、

  5.動作確認

  どのようなシステムでも同じことですが、動作確認は各要素ごとにステップ・
  バイ・ステップで行ないます。手順としては、以下のようになります。

  1. UPSとLinux-boxの通信の確認

  2. 停電時のシステム停止動作、復電時の停止手続きキャンセルの確認

  3. バッテリィ消耗時の即時停止の確認

  4. 総合確認

  総合確認以外の3ステップでは、Linux-box と UPS 間の信号ケーブルは接続し
  ますが、Linux-boxの電源は UPS につながず直接商用電源からとります。これ
  は設定の不具合などで UPS の予期せぬ停止で被害を受けないようにするため
  です。UPS には負荷として白熱灯の電気スタンドなどをつないでおくと、イン
  バータの動作確認などができて好都合です。

  5.1.  UPSとLinux-boxの通信の確認

  genpowerd を make した際に同時に作られる gentest を使って所望の信号が
                                     7
  得られているかを確認します。また、UPS のインバータ停止についても確認し
  ます。

  1. UPS と Linux-box をケーブルで接続し、UPS の電源を入れておきます。

  2. gentest コマンドを起動します。商用電源運転時には、以下のようになっ
     ていることを確認します。

     DTR = Cleared
     RTS = Cleared

     CAR = High  ( )
     CTS = Low   ( )
     DSR = Low   ( )
     RNG = Low   ( )

  3. UPS のコンセントを抜くか TEST スイッチを押します。するとバッテリィ
     運転に切り替わるとともに、gentest の出力が以下のように変化すること
     を確認します。

     DTR = Cleared
     RTS = Cleared

     CAR = High  ( )
     CTS = High  (*)
     DSR = Low   ( )
     RNG = Low   ( )

  4. 電球などの負荷をかけて UPSのコンセントを抜いたままにしておくとやが
     てバッテリィが消耗し、gentest の出力以下のように変化することを確認
     します。

     DTR = Cleared
     RTS = Cleared

     CAR = Low   (*)
     CTS = High  ( )
     DSR = Low   ( )
     RNG = Low   ( )

  5. UPSを少し充電し再びコンセントを抜きます。gentest を -d オプションで
     起動すると UPS のインバータが停止することを確認します。

  以上のすべてが確認できれば、ケーブルは正しく配線されています。

  5.2.停電時のシステム停止動作、復電時の停止手続きキャンセルの確認

  以下の手順で動作確認を行ないます。

                                     8

  1. Linuxをリブートして、genpowerd が正しく起動されていることを確認しま

     す。

  2. ここで UPS のコンセントを抜くかTESTスイッチを押します。数秒で以下の
     ようなメッセージが表示されます。

     THE POWER IS DOWN! SHUTTING DOWN SYSTEM! PLEASE LOG OFF NOW!
     The system is going DOWN for system halt in 2 minutes !!

  3. そのまま停電状態を続けるとシステムが停止します。この際、UPSのインバ
     ータも停止します。

  4. システムを起動し、上と同様の停電状態を作ります。その後、コンセント
     を差し込んで復電させると、以下のようなメッセージが表示されます。

     THE POWER IS BACK

  5. 数分間様子をみて、システムが停止してしまわないことを確認します。

  以上がすべて確認できれば、システム停止動作、復電時の動作は正しく設定さ
  れています。

  5.3.バッテリィ消耗時の即時停止の確認

  1. システムが起動した状態で、停電状態をつくり出し、以下のメッセージを
     確認します。

     THE POWER IS DOWN! SHUTTING DOWN SYSTEM! PLEASE LOG OFF NOW!
     The system is going DOWN for system halt in 2 minutes !!

  2. shutdown -c とコマンドを入力し、手動で停止手続きを解除します。

  3. バッテリィの消耗を待ちます。

  4. 以下のメッセージが表示され即時にシステムが停止することを確認しま
     す。

     THE POWER IS DOWN! BATTERY POWER IS LOW!  EMERGENCY SHUTDOWN!

  以上で、UPS と Linux-box の連携動作に関して、すべて確認ができたことに
  なります。

                                     9

  6.総合確認

  これまでの確認で正常動作することは間違いないはずですが、念のため実際に
  Linux-box の電源を UPS から採って動作確認を行ないます。UPS のコンセン
  トを抜いて停電状態を作りだしシステム停止を確認します。十分に充電された
  状態にもかかわらずバッテリィ消耗による即時停止に至ってしまう場合は、
  /etc/genpowerfailに記述された停電時のシャットダウンまでの時間を調整し
  ます。筆者の場合は、UPS は 7分程度はもちそうでしたが安全のためシャット
  ダウンまでん時間を2分にしました。また上記同様、手動で停止手続きをキャ
  ンセルし、バッテリィが消耗してシステムが即時停止することも確認します。

  7.まとめ

  GS-EE社製の小型軽量UPSである OUP-400N と Linux-box とを連携動作させた
  事例について報告しました。OUP-400N は安価ながら連携動作のために必要十
  分な信号出力を持っているので、一般的な UPS連携パッケージが想定するすべ
  ての機能、すなわち、停電時の一定時間後のシステム停止、復電時のシステム
  停止手続きのキャンセル、バッテリィ消耗時の即時システム停止、システム停
  止時のUPSインバータの停止、を実現することができました。

  ケーブルは本報告では自作のものを用いましたが、OUP-400N のオプションと
  して設定されているケーブルでも同様の動作が可能と考えられます。この際、
  ピンの配線がここで製作したケーブルと異なっても、genpowerd.h に記述する
  ピン配線情報を変更するだけで容易に対応可能です。

  OUP-400N により、費用を抑えてかつ場所もとらずに、停電に対し安全な
  Linux-boxシステムを構築することができました。

  最後に、OUP-400N に関する情報の提供をはじめ、いろいろと製品に関する相
  談にのって下さった関西蓄電池株式会社の銭谷氏に感謝いたします。

                                    10


この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: