ページ更新: 2010-01-24 (日) (3603日前)
関連: 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/
なお、少なくとも、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 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エントリの意味:
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=+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値について。
動作確認 #[編集]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! |