2009/03/05

[Server]Apcupsd で UPS(APC Smart-UPS) を制御する



UPS(無停電電源装置) とは、停電や瞬断(瞬間停電)などの電力障害時でも、パソコンやサーバなどのコンピュータに電力を安定供給するための装置です。


UPS がない場合、システムの稼働中に停電が発生するとシステムが強制シャットダウンされ、ファイルが破損したり機器が故障したりする可能性があります。


そんなわけで、サーバには欠かせない UPS ですが、 通常、UPS とシリアルケーブルでつないだ 1台のサーバしか安全にシャットダウンすることができません。しかしながら、1台の UPS を複数のサーバで共有している場合、それでは困ります。


そこで、Apcupsd というソフトを使い、ネットワークでつながっている他のサーバも安全にシャットダウンできるようにします。



Apcupsd とは


Apcupsd とは、APC SmartUPS を制御、監視するソフトウェアで、Linux, Mac OC/X, Windows などの OS で動作可能です。



Apcupsd のインストール


今回は、NIS (Network Information Server) mode で構成します。この構成は、UPS と接続された NIS Server と、ネットワーク経由で情報を共有する NIS Client で構成されます。

従来の Master/Slave mode に置き換わるものです。


今回は、CentOS 4 の Linux サーバを NIS Server に、Windows マシンを NIS Client として構成します。



CentOS 4 へのインストール


SourceForge.net から、rpm パッケージをダウンロードします。CentOS 4 は、Red Hat Enterprise Linux (RHEL) のクローンですので、el4 の rpm をダウンロードし、インストールです。



$ wget http://jaist.dl.sourceforge.net/sourceforge/apcupsd/apcupsd-3.14.5-1.el4.i386.rpm
$ sudo rpm -ivh apcupsd-3.14.5-1.el4.i386.rpm


Windows へのインストール


SourceForge.net から、Windows バイナリをダウンロードします。インストールは、画面の指示に従い、すべてデフォルトでOKです。




Apcupsd の設定


設定ファイルである、 /etc/apcupsd/apcupsd.conf (Windows は C:\apcupsd\etc\apcupsd\apcupsd.conf) を各モードに合わせて編集します。


UPSTYPE や、UPSCABLE の設定は、各環境により異なります。詳しくはマニュアルを参照してください。


NIS Server/Client 共通の設定




UPSNAME SMART-UPS_700

ログ等に使用される UPS 識別名

UPSMODE net

ネットワーク機能を有効

NETACCESS true

ネットワークアクセスを有効



NIS Server の設定





UPSCABLE 940-0024C

SmartUPS 付属のケーブルを指定

UPSTYPE apcsmart

UPS の接続タイプを指定

DEVICE /dev/ttyS0

シリアルポートのデバイス名

KILLDELAY 180

apcupsd がシステムの再起動をコントロールできない時、UPS 自体をシャットダウンさせる

NETSERVER on

NIS を有効

NISIP 0.0.0.0

リクエストを受け付ける IP アドレス

NISPORT 3551

NIS Server の Port 番号
Firewall の設定で指定ポート(TCP)を開いてください

UPSCLASS standalone

APC ShareUPS を使用している場合以外は、通常 standalone

UPSMODE disable

APC ShareUPS を使用している場合以外は、通常 disable



NIS Client の設定





UPSCABLE ether

ネットワーク経由の設定

UPSTYPE net

UPS の接続タイプを指定

DEVICE 192.168.0.80:3551

NIS Server の IP:Port を指定

NETSERVER on

NIS を有効

UPSCLASS standalone

APC ShareUPS を使用している場合以外は、通常 standalone

UPSMODE disable

APC ShareUPS を使用している場合以外は、通常 disable



Apcupsd の起動および、動作確認



NIS Server の確認


起動は下記コマンドから。ついでに自動起動も設定します。


$ sudo /etc/rc.d/init.d/apcupsd start
$ sudo /sbin/chkconfig apcupsd on


設定の確認は、下記コマンドを実行します。下記のようにズラズラと出てくれば接続成功です。


$ apcaccess status
APC : 001,052,1243
DATE : Fri Feb 06 17:40:30 JST 2009
HOSTNAME : example
RELEASE : 3.14.5
VERSION : 3.14.5 (10 January 2009) redhat
UPSNAME : UPS_IDEN
CABLE : APC Cable 940-0024C
MODEL : SMART-UPS 700
.
.
.


NIS Client の確認


Windows の場合は、自動的に起動時に apcupsd サービスが起動するようになっています。


タスクトレイにあるアイコンをダブルクリックすると、状態を確認できます。



Apcupsd をブラウザから管理


Apcupsd には、CGI で UPS の状態を参照できるスクリプトが用意されています。このスクリプトを利用し、Web 経由で状態を確認できるようにします。


SourceForge.net から、rpm パッケージをダウンロードします。apcupsd-multimon-x.x.x.rpm をダウンロードし、インストールです。



$ wget http://jaist.dl.sourceforge.net/sourceforge/apcupsd/apcupsd-multimon-3.14.5-1.el4.i386.rpm
$ rpm -ivh apcupsd-multimon-3.14.5-1.el4.i386.rpm


次のようなエラーが出た場合は、gd を更新 します。


エラー: Failed dependencies:
gd >= 2.0 is needed by apcupsd-multimon-3.14.5-1.i386
libgd.so.2 is needed by apcupsd-multimon-3.14.5-1.i386
Suggested resolutions:
/home/buildcentos/CENTOS/en/4.0/i386/CentOS/RPMS/gd-2.0.28-5.4E.i386.rpm

$ wget ftp://mirror.switch.ch/pool/3/mirror/centos/4.6/os/i386/CentOS/RPMS/gd-2.0.28-5.4E.i386.rpm
$ sudo rpm -Uvh gd-2.0.28-5.4E.i386.rpm


インストール後は、 /var/www/cgi-bin にある次のファイルを、Web サーバの cgi ディレクトリにコピーします。



  • multimon.cgi

  • upsfstats.cgi

  • upsimage.cgi

  • upsstats.cgi


ブラウザから http://example/cgi-bin/multimon.cgi へ Web 経由でアクセスし、次のような画面が表示されれば成功です。



Apcupsd をテストする



最後に、実際に電源障害があった事態を想定しテストをしてみます。


テストのため、設定ファイル (/etc/apcupsd/apcupsd.conf) の下記ディレクティブの TIMEOUT を変更しておきます。

BATTERYLEVEL, MINUTES, そして TIMEOUT は、どれか早い方の条件が満たされた場合にシャットダウンが開始されます。

設定変更後は、 Apcupsd の再起動を忘れずに。


なお、電源復旧時にマシンが自動的に起動するためには、BIOS 設定が必要になります。デフォルトでは、電源復旧時に自動起動する設定は OFF になっていることが多いので、確認が必要です。



BATTERYLEVEL 5

バッテリ残量が指定値以下(%)

MINUTES 3

バッテリ駆動が可能な予想残り時間が指定値以下(分)

TIMEOUT 300

バッテリ駆動となってからの時間が指定値経過(秒)




短期停電


UPS がバッテリ駆動となり、サーバがシャットダウンが開始される前に電源が復旧した場合を想定します。



  1. UPS の電源コードを引っこ抜きます

    • UPS の警告音が鳴り響き、UPS がバッテリ駆動になります

    • ログに Power failure on UPS UPSNAME. Running on batteries. と表示されます



  2. UPS の電源コードを接続します

    • UPS が商用電源モードに復旧します

    • ログに Power is back. UPS running on mains. と表示されます




apcupsd[3505]: Power failure.
apcupsd[3505]: Running on UPS batteries.

Broadcast message from root :

Power failure on UPS SMART-UPS_700. Running on batteries.
wall[15799]: wall: user root broadcasted 1 lines (59 chars)

Broadcast message from root :

Power has returned on UPS SMART-UPS_700...
apcupsd[3505]: Mains returned. No longer on UPS batteries.
apcupsd[3505]: Power is back. UPS running on mains.
wall[15861]: wall: user root broadcasted 1 lines (44 chars)

上記の Apcupsd からのメッセージは、root 宛てにメールでも送信されます。



長期停電


UPS がバッテリ駆動となり、サーバがシャットダウンが開始された後に電源が復旧した場合を想定します。



  1. UPS の電源コードを引っこ抜きます

    • UPS の警告音が鳴り響き、UPS がバッテリ駆動になります

    • ログに Power failure on UPS UPSNAME. Running on batteries. と表示されます



  2. 設定したシャットダウン条件を満たすまで放置します

    • ログに Reached run time limit on batteries. と表示されます

    • 接続されたマシンがシャットダウンされます



  3. 接続されたマシンがすべてシャットダウンした後に、UPS もシャットダウンされるまで放置します

    • UPS がシャットダウンされます

      ※Smart-UPS では、フロントパネルの LED が連続的に点灯する状態になります



  4. UPS の電源コードを接続します

    • UPS が再起動します

    • UPS が商用電源モードに復旧します

    • 接続されたマシンが再起動します

      ※自動で再起動しない場合は、BIOS の設定を見直してください。




apcupsd[3280]: Power failure.
apcupsd[3280]: Running on UPS batteries.
wall[4761]: wall: user root broadcasted 1 lines (59 chars)
apcupsd[3280]: Reached run time limit on batteries.
apcupsd[3280]: Initiating system shutdown!
apcupsd[3280]: User logins prohibited
wall[5185]: wall: user root broadcasted 1 lines (67 chars)
wall[5188]: wall: user root broadcasted 1 lines (47 chars)
shutdown: shutting down for system halt


参考:


2009/03/04

WebObjects 5.2.4 を Apache 2.2 (CentOS 5.2) で動かす

アップル - WebObjects

WebObjects とは、アップル社が開発した、Java による Webアプリケーションフレームワークで、強力なWebサービスを簡単に構築することができる素晴らしいツールです。


Apple社自身でも、Apple Store, MobileMe(旧.Mac), iTunes Store などを WebObjects で構築しています。


そんな WebObjects ですが、弊社で使用している WebObjects 5.2 は、Linux の場合 Apache 1.3 でないと動いてくれません。


しかしながら、最近の OS はより高機能な Apache 2.2 系が搭載されており、できれば Apache 2.2 系で動作させたいものです。

これまで何度かチャレンジしたものの、なかなかうまく動いてくれませんでした・・・。


今回やっとうまくいったのでメモしておきます。



Java のインストール


WebObjects 5.2.4 では、Java 1.4 系を使用します。


$ chmod +x j2re-1_4_2_19-linux-i586-rpm.bin
$ ./j2re-1_4_2_19-linux-i586-rpm.bin
inflating: j2re-1_4_2_19-linux-i586.rpm
Done.

$ sudo rpm -ihv j2re-1_4_2_19-linux-i586.rpm
########################################### [100%]

$ sudo vi /etc/profile.d/java.sh
# Java
export JAVA_HOME=/usr/java/j2re1.4.2_19
export PATH=$PATH:$JAVA_HOME/bin

$ sudo chmod +x /etc/profile.d/java.sh
$ source /etc/profile.d/java.sh

$ java -version
java version "1.4.2_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04)
Java HotSpot(TM) Client VM (build 1.4.2_19-b04, mixed mode)

$ java -version -server
java version "1.4.2_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04)
Java HotSpot(TM) Server VM (build 1.4.2_19-b04, mixed mode)


WebObjects 5.2 のインストール


さて、本体のインストールです。インストールCDの Deployment/SOLARIS フォルダを ftp でアップしています。


はじめに install.sh を修正します。修正内容は、"-pxZf" を "-pxzf" に修正します。(3か所あります)


$ sudo ./install.sh -license X-NNN-XXX-NNN-XXX-NNN-XXX-NNN-XXX-NNN -adaptorsOnly NO -minimalInstall NO -cgibin /var/www/cgi-bin -docroot /var/www/html -woroot /opt/Apple

INSTALLATION:
Beginning WebObjects 5.2 full installation:

. Creating WebObjects installation directory ...
. Creating WebObjects' Applications and Frameworks directories ...
. Installing WebObjects Adaptor source ...
. Installing WebObjects Deployment ...
. Installing WODocumentRoot frameworks into document root ...
. Creating startup scripts ...
. ... Done.

WebObjects 5.2 Deployment, Full Install is now installed.

$ sudo chmod +x /etc/profile.d/webobjects.sh
# WebObjects
export NEXT_ROOT=/opt/Apple

$ sudo chmod +x /etc/profile.d/webobjects.sh
$ source /etc/profile.d/webobjects.sh


WebObjects 5.2 を WebObjects 5.2.4 へ


WebObjects 5.2 の最終バージョンは 5.2.4 ですので、アップデートします。アップデートファイルはこちらから。


$ wget http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/MultiCountry/Enterprise/webobjects/patches/5.2/WO524Solaris.tar.gzip
$ wget http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/MultiCountry/Enterprise/scripts/patcher.sh
$ vi patcher.sh
# COMPRESS=Z # gnutar compress flag: 'Z' or 'z' or ''
# Z を z に修正
COMPRESS=z # gnutar compress flag: 'Z' or 'z' or ''

$ chmod 511 patcher.sh
$ sudo ln -s /bin/tar /bin/gnutar
$ sudo ./patcher.sh -install WO524Solaris.tar.gzip -next_root $NEXT_ROOT
No errors, extracting patch

Install of wo524/WO524Solaris.tar.gzip successful

$ sudo cp -rf $NEXT_ROOT/Library/WebObjects/WODocumentRoot/WebObjects /var/www/html/

$ sudo vi $NEXT_ROOT/Library/Frameworks/JavaWebObjects.framework/Resources/WebServerConfig.plist
//DocumentRoot = "/Library/WebServer/Documents";
DocumentRoot = "/var/www/html";



アダプタの作成


いよいよ本番、Apache 2.2 対応のアダプタを作成します。ソースは Project Wonder から取得します。


$ sudo yum install httpd-devel
$ wget http://webobjects.mdimension.com/wonder/releases/Wonder-5.0.0.8972-Source.tar.gz
$ tar -zxvf Wonder-5.0.0.8972-Source.tar.gz
$ cd Wonder/Utilities/Adaptors/

$ vi make.config
#ADAPTOR_OS = MACOS
ADAPTOR_OS = LINUX
CC = gcc

$ make
$ cd Apache2.2/
$ sudo /usr/sbin/apxs -i -a -n WebObjects mod_WebObjects.la

$ vi apache.conf
LoadModule WebObjects_module modules/mod_WebObjects.so
#LoadModule WebObjects_module modules/mod_WebObjects.so

$ sudo cp apache.conf /etc/httpd/conf.d/webobjects.conf
$ sudo chmod 644 /etc/httpd/conf.d/webobjects.conf

$ sudo vi /etc/httpd/conf/httpd.conf
#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

$ sudo /usr/sbin/httpd -M
Loaded Modules:
WebObjects_module (shared)
Syntax OK

$ sudo /etc/rc.d/init.d/httpd restart


SELinux


SELinux を使っている場合は、httpd よる 1085 ポート(wotaskd)への接続が拒否されてしまいます。


setroubleshoot: SELinux は http デーモンによるネットワークポート 1085 ヘの接続を阻止しています。 For complete SELinux messages.

次のようにして httpd がネットワークポートに接続するのを許可します。


$ sudo /usr/sbin/setsebool -P httpd_can_network_connect=1


動作確認


最後に、起動スクリプトの作成と自動起動です。


$ sudo vi /etc/rc.d/init.d/WOServices
#!/bin/sh
#
# Startup script for the WebObjects
#
# chkconfig: 345 85 15
# description: WebObject services
#

# Source function library.
. /etc/rc.d/init.d/functions

export PATH=/usr/java/j2re1.4.2_19/bin/:$PATH
WOSERVICES_SCRIPT="/opt/Apple/Library/WebObjects/Executables/WOServices"

# See how we were called.
case "$1" in
start)
echo -n "Starting WebObjects: "
daemon ${WOSERVICES_SCRIPT} start
echo
touch /var/lock/subsys/WebObjects
;;
stop)
echo -n "Shutting down WebObjects: "
${WOSERVICES_SCRIPT} stop
echo
rm -f /var/lock/subsys/WebObjects
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac

exit 0


$ sudo chmod +x /etc/rc.d/init.d/WOServices
$ sudo /etc/rc.d/init.d/WOServices start
Starting WebObjects: Beginning WebObjects services startup...
[ OK ]
$ sudo /sbin/chkconfig --add WOServices


root より JavaMonitor が起動できればOKです。


# $NEXT_ROOT/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor -WOPort 56789 &

Monitor for WebObjects 5

参考: