UPSとの連動

停電トラブルの不幸は突然やってくるものです。 そこで、UPSを使うのですが、ただUPS給電しただけでは瞬停には有効ですが、ただそれだけです。 停電時に Linuxマシンをシャットダウンし、瞬停時には自動回復するようにプログラムを組み込みます。



UPSとPCを接続するケーブル製作

橋本さんの 無停電電源装置(UPS)接続記 を参考にケーブルを製作します。(この回路図も転載です。)

この回路の説明です。 RTSを電源の代わりとして使い CTSとDCDをプルアップして、UPSからの Power Fail と Low Battery 状態を PCに取り込みます。 逆に PCから DTRをオンすることにより、Shutdown UPS を使って、UPSを停止させます。

UPS側の信号の説明です 材料費は「9Pオス〜9Pメス RS-232Cストレートケーブル:222円」「小型プラボックス:90円」でした。 抵抗は手持ちのものを使いました。

ケーブルを途中で切って上の回路図通りに配線し直します。 配線部が剥き出しだと格好ワルイので写真のようにプラボックスで被います。



genpower-1.0.2 をインストール

  1. genpower-1.0.2.tgz を sunsite からダウンロードして /usr/local/src ディレクトリに入れます。

  2. カレントディレクトリを /usr/local/src にし、次のコマンドを実行して解凍します。
         # tar zxvf genpower-1.0.2.tgz
         # cd genpower-1.0.2
    
  3. vi で genpowerd.h を編集します。
    以下の青文字のように {-1, NULL} という行の前に、今回使用するUPS用の定義を追記します。
         /* Feb/05/2001 Tripplite Omnismart 450 PNP
            Jhon H. Caicedo  O.S.S.O */
          {6, "omnismart-pnp",  {TIOCM_RTS,1}, {TIOCM_RTS,1},  5, {TIOCM_CTS,0}, {TIOCM_CAR,0}, {0,0}},
         
    
         /* Weli UPS */
          {7, "weli", {TIOCM_RTS,0}, {TIOCM_DTR,1}, 5, {TIOCM_CTS,0}, {TIOCM_CAR,0}, {0,0}},
    
         
          {-1, NULL}
    
  4. genpower をコンパイルします。
         # cd genpower-1.0.2
         # make all
         # make install
    


gentest を使って試験します

  1. MA30H の COM1 と UPS を製作したケーブルで接続します。 (MA30H には COM1 しかありません。)

  2. gentest でインターフェースチェックができます。 インターフェースの信号に変化があるとその状態を表示してくれます。 (/dev/cua0 というのは COM1 のことです。)
         # cd genpower-1.0.2
         # ./gentest -r /dev/cua0
         ---------------
         DTR = Cleared
         RTS = Set
         
         CAR = High  (*)
         CTS = High  (*)
         DSR = Low   ( )
         RNG = Low   ( )
         ---------------
         DTR = Cleared
         RTS = Set
         
         CAR = Low   (*)
         CTS = Low   (*)
         DSR = Low   ( )
         RNG = Low   ( )
    


Linux の設定

  1. 覚えやすいように、/dev/UPS が COM1 であるソフトリンクを張ります。 以降、/dev/UPS が UPSとのインタフェースとなります。
         # ln -s /dev/cua0 /dev/UPS
    
  2. /etc/inittab を以下のように変更します。 青文字の部分が変更箇所です。
    # When our UPS tells us power has failed, assume we have a few minutes
    # of power left.  Schedule a shutdown for 2 minutes from now.
    # This does, of course, assume you have powerd installed and your
    # UPS connected and working correctly.
    # pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
    pf::powerfail:/etc/genpowerfail start
    
    # If power was restored before the shutdown kicked in, cancel it.
    # pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
    pr:12345:powerokwait:/etc/genpowerfail stop
    
  3. /etc/rc.d/rc.local の最後に以下を追加します。
    # ADD support for the UPS
    echo "Starting genpowerd daemon..."
    if [ -x /sbin/genpowerd ]; then
      /sbin/genpowerd /dev/UPS weli
    fi
    
  4. /etc/rc.d/init.d/halt の最後の直前に以下を追加します。 青文字の部分が追加箇所です。
    # 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 weli
       fi
    fi
    
    # Now halt or reboot.
    echo "$message"
    if [ -f /fastboot ]; then
     echo "On the next boot fsck will be skipped."
    elif [ -f /forcefsck ]; then
     echo "On the next boot fsck will be forced."
    fi
    eval $command -i -d -p
    
  5. 以上の設定を有効にするため、PCをリブートします。



総合テスト

  1. 停電から復帰
    UPSの電源コンセントを抜き停電の状態を模擬します。 このとき、2分後にシャットダウンする旨の警告がPCの画面に表示されれば OKです。 次に、シャットダウンが実行される前に、UPSの電源コンセントを再びさして、シャットダウンが中止されることを確認します。

  2. 停電継続
    UPSの電源コンセントを抜き停電の状態を模擬します。 このとき、2分後にシャットダウンする旨の警告がPCの画面に表示されます。 そのまま2分間待っていると、シャットダウンが実行され、UPSのインバータが停止することを確認します。