ページ更新: 2010-01-24 (日) (3038日前)

関連: PC/UPS#Nipron_eNSP-300P-S20-11S, PC/Asustek CUBX, PC/GIGABYTE EP45-UD3P#discypus.jpサーバ

(2005-08-12 新規作成)

genpower は、RS-232C 経由で UPS を制御するソフトウェア。

genpower は、「RS-232C の各種信号線の電圧だけで制御」できる UPS なら、たいてい使えると思われる。

(逆に「RS-232C を持っていても、データ信号線でデータの送受信を行う」ような UPS には使用できない。APC の UPS なら apcupsd を試してみること)

この文書では、genpower 1.0.5(Debian パッケージ版) を設定したときのメモを記述している。

なお、以下の機材も使っている。同じ手順で使えるので、特に追記なし。(別途マザーボード側にRS-232Cブラケットを増設したが):

目次

[編集]

情報源 #

[編集]

SourceForge.net #

http://genpower.sourceforge.net/

  • リリースファイルがない
    • いっそ、Slackware の「genpower-1.0.5.tar.gz」とか、Debian, Ubuntuの「genpower_1.0.5.orig.tar.gz」を拾ってくる?
  • CVSには入ってる: http://sourceforge.net/projects/genpower/develop
    • 変更履歴: /genpower/Change.Log
      • 最新版のバージョンは 1.0.5 (2005-01-04) (2009-09-12に確認)

なお、少なくとも、Debian, Ubuntu, Slackware にはパッケージとして入っているようだ。

[編集]

その他 #

[編集]

BIOSの設定 #

サーバに使うので、停電が終わってACが供給されたとき、電源ボタンを押さなくても起動するように設定する。

CUBXでは、 BIOSの Power → Power Up Control → AC PWR Loss RestartでDisabled / Enabled / Previous Stateのうち「Enabled」を選ぶ。

PCをshutdownし、電源ケーブルを抜き、再度ケーブルをさして、PCが起動することを確認しておく。

[編集]

genpowerパッケージをインストール #

# apt-get install genpower
: (略)
Setting up genpower (1.0.5-1) ...
Installing new version of config file /etc/init.d/genpower ...
Installing new version of config file /etc/init.d/powerfail ...
- Edit /etc/init.d/genpower to set cable type, port, and to enable UPS monitor.
- Edit /etc/init.d/powerfail to set shutdown delays for this system.
- Note that genpower will not work with the smart-signalling mode supported by
  most UPS systems.  You will likely have to build a special cable to make use
  of the UPS's dumb-signalling mode (if it has one).  Information on this can
  can be found in the /usr/doc/genpower/cables directory.  If you have an APC,
  unit you should be able to use the 'apc-pnp' cable type with the Windows-95
  PNP (plug-n-play) cable that came with your UPS.  This cable should come
  with all APC Backups Pro, Smart-Ups, and Matrix-Ups systems.
# 
  • /etc/init.d/genpowerを編集せよ、とのこと。このスクリプトの中身を見れば判るが、'代わりに /etc/genpowerd.conf を編集すればよい。
  • シャットダウンの遅延を設定するには/etc/init.d/powerfailを編集せよ、とある。
  • genpowerは'smart-signalling mode'では動作しない、とのこと。 smart-signalling modeは、高度なプロトコルを使ってUPSとの通信を行うモードのこと。 (例えばAPC SmartUPSシリーズでは、このモードであれば電源電圧やバッテリの容量、内部温度などを取得できる)。 'dumb-signaling mode'はRS-232C制御線の電圧(High, Low)で制御を行うモード。 これらのモードは接続ケーブルの結線で切り替えられることが多い。そこで、'dumb-signaling mode'用のケーブルを使え、とのこと。
    • 補足。ちなみにAPCのUPSならapcupsdが'smart-signalling mode'に対応している。

デーモン起動コマンドのオプションをチェック

$ /etc/init.d/genpower 
Usage: /etc/init.d/genpower {start|stop|restart|force-reload|poweroff}

停電時に実行されるコマンドのチェック

$ /etc/init.d/powerfail
Usage: /etc/init.d/powerfail {start|now|stop}
 start: shutdown in +7 minutes due to power failure
 now:   shutdown NOW due to eminent UPS battery failure
 stop:  cancel shutdown because power is back online
 (note that this script is usually called only by 'init')

inittabのエントリをチェック

$ grep powerfail /etc/inittab
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
[編集]

gentestで信号を調べる #

gentest コマンドで、信号の変化を調べておく。

なお、Nipron_eNSP-300P-S20-11S に使うRS-232Cケーブルには電源供給は不要なので、 gentest -r(RTSで電源供給)や-d(DTSで電源を供給) は試さなくて良い。

# /usr/sbin/gentest /dev/ttyS0
---------------
★gentestを起動した直後
DTR = Cleared    ★shutdown 信号 [PC -> UPS]
RTS = Cleared

CAR = High  (*)  ★battery low 信号 [UPS -> PC]
CTS = High  (*)  ★power fail 信号 [UPS -> PC]
DSR = Low   ( )
RNG = Low   ( )
---------------
★電源ケーブルを抜いた
DTR = Cleared
RTS = Cleared

CAR = High  ( )
CTS = Low   (*) ★Power fail信号を検出
DSR = Low   ( )
RNG = Low   ( )
---------------
★電源ケーブルを接続した
DTR = Cleared
RTS = Cleared

CAR = High  ( )
CTS = High  (*) ★復帰した
DSR = Low   ( )
RNG = Low   ( )
---------------
★RS-232Cケーブルを抜いた
DTR = Cleared
RTS = Cleared

CAR = Low   (*) ★
CTS = Low   (*) ★
DSR = Low   ( )
RNG = Low   ( )
---------------
★RS-232Cケーブルを接続した
DTR = Cleared
RTS = Cleared

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

うっかり、BATTERY LOWのテストを忘れてた。これは本番の試験 (genpowerの設定完了後)に行う。

[編集]

設定ファイルを書く #

/etc/以下のファイルをリストアップ。

$ dpkg -L genpower | grep etc
/etc
/etc/init.d
/etc/init.d/genpower
/etc/init.d/powerfail
/etc/genpowerd.conf
/etc/init.d/ups-monitor

修正が必要なファイルは/etc/genpowerd.confと/etc/init.d/powerfailの2つ。

[編集]

/etc/genpowerd.conf #

/etc/genpowerd.confを次のように修正する

# The port and device used can be configured here.

ENABLED=true             ★コメントを外す
UPSPORT=/dev/ups         ★コメントを外す。別途/dev/upsを作成するか、あるいは /dev/ttyS0 に書き換える
UPSSTAT=/var/run/upsstat ★コメントを外す
UPSTYPE=nipron           ★コメントを外し、用意したnipronエントリを指すように

# UPS types. You can add your own using the same syntax.
# Inverted lines are preceded with '/'.

#<ups-type>      cablep. kill  t powerok battok cableok
#------------------------------------------------------

# Nipron
nipron            ---    /DTR  5  CTS     CAR    ---   ★nipronエントリを用意

nipronエントリの意味:

  • cablep. (cable power)は使わない (---)
  • kill (shutdown) は DTRをLOWに (/DTR)
  • shutdown 信号は10ms以上 だが、このエントリの単位がよくわからないので 秒単位だが、他のエントリと同じ値に設定 (5) (2005-08-24)
  • Powerok 信号はCTS=HIGH (CTS)
  • Battery OK信号はCAR=HIGH (CAR)
  • cable OK信号(ケーブル接続の検出)は使わない (---)

RS-232C(COM0)を使ったので、それに対してシンボリックリンクを作っておく

# ln -s /dev/ttyS0 /dev/ups

再度、/dev/upsで動作確認

# /usr/sbin/gentest /dev/ups
(略)
[編集]

2005-08-19 kill timeの単位は? #

docによると、kill timeの単位は秒(in seconds)とのこと(以下/usr/share/doc/genpower/genpower.docs.gzより引用):

2.2.2.3.4.  Kill Time

This section defines how long the inverter kill signal, as
defined in the previous section, is to be sent.  Some UPSs
require that the signal is maintained for a minimum period of
time before they will act upon it.

This section is composed of a single integer value that defines
how long, in seconds, the inverter kill signal is to be sent.  As
a default, five (5) seconds seems to work well for most UPSs.  If
the your UPS/cable combination does not support shutting down the
UPS's inverter, this value should be set to zero.

In our example, Miquel's cable is configured with the following
value in this section:

     0

This means that Miquel's cable does not support the inverter kill
function (the signal will be held for 0 seconds).

しかし、/usr/share/doc/genpower/changelog.gzによると(以下引用):「インバータ停止信号を修正(パラメータはミリ秒単位であり、1/10秒単位ではない)」

1.0.5 (2005-01-04)
Fixed kill-inverter signal (parameter is in milliseconds, not deciseconds) -- bcwhite

さらに /usr/share/doc/genpower/changelog.Debian.gzによると(以下引用):「インバータ停止時間が設定した時間の1/100になっていたのを修正」

genpower (1.0.5-1) unstable; urgency=low

  * Fixed problem with kill-inverter time being 1/100 of specified time (closes: #280731)

 -- Brian White <bcwhite@pobox.com>  Tue,  4 Jan 2005 17:18:24 -0500

単位はいったい何? ミリ秒? 1/10秒? 秒?

数回動作試験したときにはこのエントリが5でもちゃんとshutdownできたので、 このエントリはそのままにしておくことにした。

本来、ソースコードを当たるべきだろうけど。

[編集]

2005-08-20 kill timeの単位は? : ソースコードを調査 #

ソースコードを当たってみた。apt-get source genpower で取得。 (CVSなら SourceForge.net CVS Repository - markup - cvs: genpower/genpower/genpowerd.c)

genpowerd.cのparse_entry(char *s) でstrcut upsdef (genpowerd.hで定義) のint killtimeに読み込み。

genpowerd.c:712:    r.killtime = strtoul(s, &end, 10);

mainで、tcsendbreak, あるいはsleepに渡す。

genpowerd.c:263:            if (pups->kill.line == TIOCM_ST) {
genpowerd.c:264:                /* Send BREAK (TX high) to kill the UPS inverter. */
genpowerd.c:265:                tcsendbreak(ups_fd, 1000 * pups->killtime);
genpowerd.c:266:            } else {
genpowerd.c:267:                /* Force high to send the UPS the inverter kill signal. */
genpowerd.c:268:                setlevel(ups_fd, pups->kill.line, pups->kill.inverted);
genpowerd.c:269:                sleep(pups->killtime);
genpowerd.c:270:            }

(pups->kill.line == TICOM_ST)になるのは、設定ファイルで 'ST' を指定したとき。 tcsendbreak(fd, duration), durationの単位は他を当たらないと判らないが、killtimeを1000倍して与えている。

If duration is not zero, it sends zero-valued bits for some implementation-defined length of time.

'ST'以外の時(DTR,RTS,SR,CTS,CAR...)では、sleepが使われる。

#defineも調べたが、sleepがusleepに置き換えられているわけでもない。 よって、この場合の単位は秒。

これ以上はソースコードブラウザで追うか、トレース(straceやltrace)を使った方が確実のようだ。

[編集]

2005-08-24 kill timeの単位は? : CVSで差分を確認 #

http://cvs.sourceforge.net/viewcvs.py/genpower/genpower/genpowerd.c?r1=1.10&r2=1.11 を見ると、

tcsendbreak(ups_fd, 10 * pups->killtime);

tcsendbreak(ups_fd, 1000 * pups->killtime);

に変えてるだけなので、手持ちのUPSNipron_eNSP-300P-S20-11Sの 別売りRS232CケーブルではDTRを使うので無関係。

[編集]

/etc/init.d/powerfail (OSのシャットダウン処理) #

停電を検出したときに起動されるスクリプト。

先頭付近に次の設定があるので、必要であれば修正する。

  • failtime: 停電後に自動シャットダウンするまでの時間(分)
  • sdnotify: 停電後自動シャットダウンを行うまでの時間に通知を行う時間(分)の設定
    (残り時間がここの値以下になると、全ユーザのコンソールに1分ごとに通知を送る)
failtime=+7     # shutdown delay from initial power failure   ★5->7に変更
btrytime=now    # shutdown delay from low-battery warning

failmsg="LINE POWER FAILURE -- SWITCHED TO BATTERY BACKUP"
btrymsg="BACKUP BATTERY LOW -- EMERGENCY SHUTDOWN"
okaymsg="LINE POWER RESTORED -- RESUMING NORMAL OPERATION"

sdnotify=15     # maximum time shutdown that sends notices    ★1分ごとの通知を残りN分で行う設定
logprio="daemon.warn"   # facility.level for logger program
program=`basename $0`
: (略)

failtime値について。

  • 今回テストしたバッテリは20分以上持ったので、failtimeは20分以下にする。バッテリが消耗したときはこれより短くなる。
  • 長すぎても意味がない。長時間停電するなら重大な事故が起こったのだろうから、復帰するとは限らないので、バッテリ消費を避けるためにさっさと落としたい。
  • 典型的な停電時間より短いと、すぐにシャットダウンされるので、不便。
  • よって、典型的な停電時間より少し長め、バッテリが消耗した(1/2)ときを考えて、20×1/2で10分、これを安全係数 1.5で割って、7分にする。
    • もっともこのUPS自体も他のUPSから電源を得ているので、数分の停電ならこのUPSの出番はない。 電源電圧の安定化には寄与するだろうが。
[編集]

動作確認 #

[編集]

AC入力があるときにshutdownされないこと #

このUPSは、AC入力がある場合にはSHUT DOWN信号を送っても電源は切れない(PC/UPS#pc66a6ab)ので、 実際に確かめてみる。

# /etc/init.d/genpower 
Usage: /etc/init.d/genpower {start|stop|restart|force-reload|poweroff}
# sync; sync; sync 

# /etc/init.d/genpower poweroff
Sending power-down signal to the UPS...

# sync

この状態でも確かに電源は切れない。 でも、この状態で電源ケーブルを抜くと即座に電源が切れる。 genpowerがSHUTDOWN信号を送り続けているか、あるいはUPSがSHUTDOWN信号を受けたことを覚えているようだ。

[編集]

停電の動作確認 #

shutdown開始までの時間を1分に設定 (/etc/init.d/powerfail)し、テスト。

電源ケーブルを抜いて、再度接続。設定時間内なら元に戻ることを確認。

★電源ケーブルを抜いた
Broadcast message from root (Wed Aug 17 18:11:52 2005):

LINE POWER FAILURE -- SWITCHED TO BATTERY BACKUP
The system is going DOWN for system halt in 1 minute!

★電源ケーブルを接続した
Broadcast message from root (console) (Wed Aug 17 18:12:19 2005):

LINE POWER RESTORED -- RESUMING NORMAL OPERATION 

電源ケーブルを抜く。設定時間が経過した後shutdownされること、電源が完全に停止(ファンも停止)することを確認。

★電源ケーブルを抜いた
Broadcast message from root (Wed Aug 17 18:12:30 2005):

LINE POWER FAILURE -- SWITCHED TO BATTERY BACKUP 
The system is going DOWN for system halt in 1 minute!

★1分経過 → shutdown が開始された
Broadcast message from root (Wed Aug 17 18:13:30 2005):

LINE POWER FAILURE -- SWITCHED TO BATTERY BACKUP 
The system is going down for system halt NOW!

電源ケーブルを接続し、電源ボタンを押さなくても、OSが起動することを確認。

[編集]

パッテリ電圧不足時の動作確認 #

shutdown開始までの時間を10分に設定 (/etc/init.d/powerfail)し、テスト。

Broadcast message from root (Wed Aug 17 18:19:53 2005):

LINE POWER FAILURE -- SWITCHED TO BATTERY BACKUP 
The system is going DOWN for system halt in 10 minutes!

 : (略。毎分通知が来る)

LINE POWER FAILURE -- SWITCHED TO BATTERY BACKUP 
The system is going DOWN for system halt in 1 minute!

Broadcast message from root (Wed Aug 17 18:29:53 2005):

LINE POWER FAILURE -- SWITCHED TO BATTERY BACKUP 
The system is going down for system halt NOW!

10分だと、BATTERY LOWにならなかった。数回試したところ、やっとBATTERY LOWになり、EMERGENCY SHUTDOWN が開始された。

Broadcast message from root (Wed Aug 17 19:06:49 2005):

BACKUP BATTERY LOW -- EMERGENCY SHUTDOWN 
The system is going down for system halt NOW!