2008年4月 6日アーカイブ

昨日の朝停電があって、サーバ系がみんな落ちていた。
目覚ましの止まっていた時間からすると1分とか2分とからしいんだけど、一度落ちたサーバは再起動しない。
まあ、自動で再起動しないのは良いんだけど、HDDの書き込み中に落ちたりしてdiskが読めなくなってしまったりすると困るので、UPSの導入を検討する。
検討すると言っても、真面目に調べたわけではなくて、ヨドバシ.comのページを価格の安い順にソートして、適当に選ぶ。候補はオムロンとAPCの500VA/300Wの奴。
APCのページを見ると、真面目に容量を計算しろみたいなことが書いてある。
TeraStationが57Wで、サーバPCが・・・わからない。最大300Wくらいの電源だったと思うけど・・。
で、APCの方はportsにsysutils/apcupsdってのがあるので、APCのes500って奴にした。
後で調べたら、オムロンの方もFreeBSD用のソフトがフリーで存在した&TeraStation対応だった&安かったので、オムロンでも良かったかも。
しかし、どちらにしろUPSのUSB出力は一つなので、FreeBSDのサーバとTeraStationの両方にshutdownを送ることはできない。
apcupsdについて調べていたら、NIS(Network Information Serverだと。ypではない)とか言う機能があって、UPSと直接通信するマシンをサーバにして、電源供給を受けるマシンをクライアントにして連携プレイができるらしい。
TeraStationでapcupsdをclientモードで入れることができれば、うまくshutdownさせられそうだ。
landiskはそう言うことはできなさそうなので、バッテリーがなくなる前に停電が復旧しなければ今までと同じ。
と、言うことでUPSが届く前にapcupsdをインストール。
FreeBSDの方は、portsからsysutils/apcupsdをインストールするだけ。あとは、/usr/local/etc/apcupsd/apcupsd.confを修正する。
細かいところは後で調整が必要だと思うけど、変更点は以下のような感じ。
UPSCABLE usb
UPSTYPE usb
DEVICE
#NISIP 192.168.0.1
※ NISIPを限定しようとしたら、apcaccessコマンドとか、cgiとかが127.0.0.1にアクセスするので、デフォルトに戻した。アクセス制限はipfで。cgiはパラメータでIP指定ができる。
続いて、TeraStationの方。
FreeBSDの方をportsでインストールしたのでFreeBSDの/usr/ports/distfilesにapcupsdのソースがある。
こいつを、TeraStationにコピーして、
# ./configure --prefix=/opt/usr/local --exec-prefix=/opt/usr/local --enable-powerflute
とconfigureを実行してみたけど、どうもprefixとexec-prefixは効かないっぽい。
あと、mailがないと言う警告が出て、wallがないと言うエラーが出る。
警告は無視する。
TeraStationは人がログインして使うマシンではないので、wallは必要ないので、/usr/local/bin/にwallと言う名前のダミースクリプトを作成した。
さらに、--enable-powerfluteを入れると、ncursesのライブラリを要求されるので、
  • ncurses-5.4-0vl2.ppc.rpm
  • ncurses-devel-5.4-0vl2.ppc.rpm
  • gpm-1.20.1-35vl2.ppc.rpm
の3つのrpmを持ってきてインストールした。
で、再度configure。結果は以下のような感じ。(これを見る限り、prefixは効いていない)
  Host:                       powerpc-unknown-linux-gnu -- unknown unknown
  Apcupsd version:            3.14.2 (15 September 2007)
  Source code location:       .
  Install binaries:           /sbin
  Install config files:       /etc/apcupsd
  Install man files:          /usr/share/man
  Nologin file in:            /etc
  PID directory:              /var/run
  LOG dir (events, status)    /var/log
  LOCK dir (for serial port)  /var/lock
  Power Fail dir              /etc/apcupsd
  Compiler:                   g++ 3.3.6
  Compiler flags:             -g -O2 -Wall
  Linker:                     gcc
  Linker flags:               -g -O
  Host and version:           unknown unknown
  Shutdown Program:           /sbin/shutdown
  Port/Device:                /dev/ttyS0
  Network Info Port (CGI):    3551
  UPSTYPE                     apcsmart
  UPSCABLE                    smart

  drivers (no-* are disabled): apcsmart dumb net no-usb no-snmp pcnet no-test

  enable-nis:                 yes
  with-nisip:                 0.0.0.0
  enable-cgi:                 no
  with-cgi-bin:               /etc/apcupsd
  with-libwrap:
  enable-nls:                 no
  enable-libintl:             no
  enable-powerflute:          yes
  enable-pthreads:            yes
  enable-dist-install:        yes
  enable-gapcmon:             no
そしてmake。
make -n installすると、やっぱり/sbin/と/etc/apcupsdにインストールされるようだ。
そこで、
# DESTDIR=/opt/usr/local make install
でインストールして、必要なファイルのリンクをはった。
# ln -s /opt/usr/local/etc/apcupsd /etc/
# ln -s /opt/usr/local/sbin/apcupsd /sbin/
# ln -s /opt/usr/local/sbin/powerflute /sbin/
後は、/etc/apcupsd/apcupsd.confを修正。修正箇所は、
UPSCABLE ether
UPSTYPE net
DEVICE 192.168.0.1:3551
NETSERVER on

と言ったところでUPSが届いたので、早速つないでみた。
サーバPC、TeraStation、光終端装置をUPSにつなぎ、サーバとUPSをUSBで繋ぐ。
で、FreeBSDでapcupsdを起動。
apcaccessを実行してみると、なんかずらずらと表示される。
で、cgiをwebサーバ上の実行できるところにリンクして、multimon.cgiとかupsstats.cgiを実行してみる。
multimon.cgiは、hosts.confを見るようで、ここにIPアドレスを書いてあげたら、FreeBSDとTeraStationのapcupsdの監視ができるようになった。
試しにUPSのコンセントを抜いてみたら、FreeBSDの/var/log/apcupsd.eventsに電源が落ちたとのログが出て、UPSが結構な音量でピーピー言う。
で、TeraStationの方のログを見てみたら、Communications with UPS lost.とか出てる。
hubの電源が落ちたのが問題なようだ。
しょうがないので、光終端装置の方を諦めて、hubの電源をUPSに繋ぐ。

これで、一応バッテリによるサーバ電源のバックアップまではできるようになったはず。
後は、バッテリー残何%でshutdownさせるかとか、shutdown開始してから何分でバッテリーをoffにするかとかのパラメータを調整する必要があるけど、力つきたので今日はここまで。
さらに、snmpに対応していた気がするので、cactiでグラフ化できるようにしたい。
さらに、TeraStationのapcupsdを起動スクリプトに組み込まないとなあ。
と、言うわけでcactiでグラフ表示。
apcupsdのsnmp対応と言うのは、snmpを出すUPSの出力を取れると言うものらしく、シリアルやUSBで繋がったUPSの情報をapcupsdがsnmpで出してくれると言うものではないらしい。
久しぶりにcactiを触ると、グラフの追加の仕方とか覚えてなくて泣く。
ネットで調べた感じだと、net-snmpのexec機能を使うパターンが多いみたいだけど、今回は以前CPU(pentium-m)の周波数をグラフ化したときと同じ方法を使った。
  1. データ収集スクリプトを用意する。(とりあえず、電源電圧、バッテリー%、負荷%を取ってみた)
    /usr/local/share/cacti/scripts/apcups.pl
    #!/usr/bin/perl
    
    open(FILE, "/usr/local/sbin/apcaccess|");
    while() {
        if (/^LINEV/) {
            /([0-9\.]+)/;
            $linev = $1;
        }
        if (/^LOADPCT/) {
            /([0-9\.]+)/;
            $loadpct = $1;
        }
        if (/^BCHARGE/) {
            /([0-9\.]+)/;
            $bcharge = $1;
        }
    }
    close(FILE);
    
    print "linev:$linev loadpct:$loadpct bcharge:$bcharge";
    
  2. cactiのコンソールから、Data Input Methodを追加する
  3. cactiのコンソールから、Data Sourcesを追加する
  4. cactiのコンソールから、Graph Managementを追加する
これで、グラフができた。
2008年4月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      

このアーカイブについて

このページには、2008年4月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年3月27日です。

次のアーカイブは2008年4月11日です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1