デスクトップLinuxマシンにUPSを追加する

 無停電電源装置(UPS)とは、商用電源が失われたときに一定時間だけコンピュータを動かし続けることができるようにする装置である。これにより短時間(1~5分)の電力消失をUPSバッテリの電力でやり過ごすことができる。UPSバッテリが低下すると、UPSはシグナルを送ってコンピュータを安全に停止させることができる。UPSがあれば、突然の電源断によるファイルシステムやRAIDのチェックに時間を取られなくて済む。以下、UPSに関する全般的なヒントと、Linuxマシンを保護するためにUPSをどうセットアップすればよいかを説明する。Linuxのサポートを謳っていないモデルについても触れる。

 今日、デスクトップシステム用のUPSは、機能にもよるが、100ドルから200ドルで手に入れることができる。低価格のUPSでもコンピュータに4~5分程度は電力を供給するので、短時間の電源断や停電に対応でき、電力の消失が長時間にわたる場合は、コンピュータシステムを安全に停止させることもできる。この安全停止はRAID-5を運用しているとき特に重要なポイントとなる。RAIDの個々のディスクの同期が崩れた場合、対処を誤るとデータの消失を起こす恐れがあるからだ。

 UPSの購入時に検討すべき主な事項は、初期費用のほかにバッテリ交換費用とバッテリ交換頻度、UPSの管理と監視をLinuxから行えるかどうか、そして供給ワット数とボルトアンペアである。

 UPSのバッテリは経時劣化してUPSの電力供給能力は低下する。恐らく、3年から5年でバッテリを交換する必要があるだろう。マシンを5分間動かせばよいとして、7分動かす能力のあるUPSと10分動かす能力のあるUPSのどちらかを選ぶとき、容量の大きいUPSを選べば、それだけバッテリの交換頻度は少なくなるが、容量の大きなUPSのバッテリはより高価でもある。

 必要なボルトアンペア(VA)とワット数を自分ではじき出すのは正直それほど簡単でない。こちらが意図するより多くのVAおよびワット数をUPSが供給できることを確認しなければならないからだ。必要なVAとワット数を簡単に算定するには、APC(American Power Conversion)の提供するWebフォームを使うとよい。APCのWebフォームのマイナス面は、システムで使うグラフィックカードを選べないことである。3Dゲームに使うマシンをUPSで保護することはないにしても、ハイエンドのグラフィックカードを装備したLinuxマシンをUPSで保護できるか知っておいて悪くはないだろう。

 UPSの管理および監視機能は絶対に必要というものでもないが、あれば便利である。Linuxをソフトウェア的にサポートしていないUPSでも自前の方式で商用電源の消失を検出できる。次の方法は、ソフトウェアサポートのないUPSでサーバを保護しなければならなかったRobert Murphy氏が教えてくれたものだ。この方法の元々の形は、商用電源につないだモデムをLinuxマシンに接続し、LinuxマシンからモデムのDSR(Data Set Ready)線を監視するというものであった。商用電源が失われてもLinuxマシンはUPSとつながっているので、まだ動いている。一方、UPSにつながっていないモデムは電源を失う。Linuxマシンは、次にDSR線へのポーリングをかけた時点でモデムの電源が失われたことを検知し、UPSバッテリがまだ電力を残している間にシャットダウンのプロセスを開始するという次第である。

 しかしながら、昨今のUPSはLinuxをサポートしていると考えてまず間違いない。そのソフトウェアは、UPSのバッテリ状態や現在の負荷状況を教えてくれるはずである。こうした情報を利用すれば、UPSの残りの電力が後2分というところまで実行を続けるようにマシンをセットアップしたり、「電源が回復しなければ、後N分でシステムを停止します」といったメッセージを出したりすることができる。

ups_thumb.png
KNutClient

 apcupsdはAPCの多くのUPS装置に対応しており、OpenUPSdはBelkinのUPSに対応している。また、Network UPS Tools(NUT)は、さまざまな種類のUPSを扱うことができる。NUTには多くのクライアントが存在する。たとえば、KDE用のクライアント(図を参照)はその1つであり、さらにスタンドアロンのクライアントと、GKrellM プラグインもある。NUTを使えば、さまざまな種類のUPS装置と通信することができる。また、もう1台のUPSをネットワークに追加するのも簡単である。同じソフトウェアを用いてネットワーク経由で両方の装置を操作したり監視したりできるからだ。NUTを使うことには、UPSのセットアップや管理のノウハウが特定のベンダ寄りにならないという利点もある。他方、特定のUPSのすべての機能や情報をNUTでは扱えない可能性もある。

 本稿では、NUTを使い、APCのSmart-UPS SC620をセットアップしてみよう。

 インストールできるNUTパッケージにはUbuntu Gutsy用、Fedora 8用、openSUSE用がある。KDEのNUTクライアントであるknutclientは、Ubuntu用パッケージと一部のMandriva用パッケージにのみ含まれている。Fedoraマシンでは、これらのパッケージのNUTとNUTクライアントをインストールしてもよい。

 UPSハードウェアを設置するには、UPSバッテリの端子を接続し、UPSを商用電源につなぎ、UPSとコンピュータをRS-232シリアルインタフェースかUSBで接続する必要がある。慎重を期すため、UPSからコンピュータにすぐ電力を供給しないで、まずはオフラインの電源障害シミュレーションを実施すべきだろう(詳細は後述)。

 NUTデーモンには複数の設定ファイルが存在し、それらはNUTのパッケージ方法に応じて/etc/nutか/etc/upsに置かれる。面倒だが、UPSを利用するためには4つの設定ファイルを変更する必要がある。これらのファイルはいずれも十分なコメントが付記されているので、ここでは必要な変更の概要だけを述べる。

 最初のファイルups.confだが、ここにはUPSとの通信に使うドライバの名前とポートを指定するセクションがある。ファイルupsd.confで主に変更すべき点は、NUTデーモンに接続できるようにACLを設定することだ。少なくともlocalhostから接続できるようにする必要があるだろう。ファイルupsd.usersでは、ユーザー名とパスワードをセットアップし、各ユーザーの実行できるアクションを割り当てる。少なくとも1人のユーザーをセットアップして監視デーモンが接続できるようにする必要がある。最後の設定ファイルupsmon.confでは、監視対象のUPS装置を指定する。ここではupsd.usersで指定した監視ユーザーの名前とパスワードを使う必要がある。

# vi /etc/ups/ups.conf
...
[ups]
  driver = apcsmart
  port   = /dev/ttyS0
# vi /etc/ups/upsd.conf
...
ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32
ACL localnet  192.168.7.0/24
ACCEPT localhost
ACCEPT localnet
REJECT all
...
# vi /etc/ups/upsd.users
...
[monuser]
        password = xxx
        allowfrom = localhost
        upsmon master
...
# vi /etc/ups/upsmon.conf
...
MONITOR ups@localhost 1 monuser xxx master
...

 最後の3つの設定ファイルについては、パッケージ化の段階で変更しなくて済むような状態にしておくこともできたはずである。デフォルトでlocalhostのupsという名前のUPSを監視することにしておけば、localhostからそのUPSを監視できるようにパスワード、ユーザー名およびACLをセットアップできる。UPSを監視するユーザーのパスワードを手動で使うことはまずないので、パッケージ化の際にパスワードとしてランダムな文字列を用い、それをupsd.usersとupsmon.confの両方で使えばよいわけだ。しかし、現状ではつまらぬ作業が必要で、ups.confに装置とポートを指定するだけでは済まない。

 NUTのマニュアルを見ると、/etc/killpowerに関する記述が至る所にある。このファイルの主な目的は、コンピュータが自分の電源を落とす前にUPS自体を停止させることである。Fedoraでは、/etc/killpowerファイルが存在すれば、/etc/init.d/haltスクリプトが必要な処理を行うようにセットアップされている。その他のディストリビューションでは、/etc/init.d(またはこれに相当するディレクトリ)でkillpowerという文字列をgrep検索してそれが見つかれば、このファイルが適切に設定されているはずである。/etc/killpowerが停止スクリプトに設定されていないと、コンピュータの停止後もUPSは動き続ける。これは重大な問題ではないが、UPSはバッテリがなくなるまで電力をゆっくり使い続けることになる。

 設定ファイルを準備すれば、「service ups start」でNUTデーモンを開始できる。また、UPSハードウェアの電源が入っていて、それがコンピュータに接続されていれば、「upsc ups」でUPSの設定を問い合わせることができる(UPSの名前を"ups"と仮定)。以下は出力の抜粋である。UPSのバッテリがなくなりかけたときだけ警告を発するようにバッテリアラームを変更してある。デフォルトの設定では、商用電源が失われると警告音が鳴るようになっている。

# upsc ups
battery.alarm.threshold: L
ups.load: 049.4
ups.model: Smart-UPS SC620

 最初の段階でコンピュータをUPSにすぐ接続しない理由はオフラインテストを実施するためである。このテストではコンピュータの電源はまだ壁のコンセントから取られるが、コンピュータはUPSを監視しており、UPSからバッテリの電力低下の警告を受けると、正常に停止するように設定されている。UPSがコンピュータに停止するよう警告を発するのはバッテリの電力低下のときだけなので、オフラインテストの間にUPSの電力を消費するような何かを用意する必要がある。多分、古いCRTモニタを1台か2台接続するのがよいだろう。モニタをUPSに接続し、UPSとコンピュータをシリアルまたはUSBケーブルでつなぎ、コンピュータの電源をUPSから取らないようにセットアップしたら、オフラインテストを開始できる。UPSデーモンが動いていることを確認した上で、「tail -f /var/log/messages」を実行する。UPS自体の電源を抜く。UPSの商用電源が失われ、バッテリで動作していることを知らせるメッセージが表示される。ここで定期的に「upsc ups」を実行してbattery.chargeを監視することができる。モニタがUPSのバッテリを消費すると共に値が徐々に下がっていく。ある点まで来ると、UPSはバッテリの電力低下の限界に達したことをコンピュータに知らせる。この段階でNUTが作動し、「shutdown -h now」を実行する。

 ファイル/var/log/messagesには、オフラインテストの間に次のような内容が記録される。

... upsmon[29384]: UPS ups@localhost on battery
...
... upsmon[29384]: UPS ups@localhost battery is low
... upsmon[29384]: Executing automatic power-fail shutdown
... upsmon[29384]: Auto logout and shutdown proceeding
... shutdown[32512]: shutting down for system halt

 オフラインテストは、コンピュータとUPSが正しく通信していることを確認するために非常に重要な意味を持つ。コンピュータがUPSの要求に応じて正常に停止することが確認されれば、コンピュータの電源をUPSから安心して取ることができる。コンピュータの電源がまだ切れている間に電源をUPSから取るようコンピュータを接続するとよい。なお、NUTデーモンが自動的に起動するよう、コンピュータの起動後にコマンド「chkconfig ups on」を実行すること。

 UPSは短時間の電力消失がコンピュータに影響しないようにするものだ。UPSと上述の技法を使えば、電源に起因するコンピュータの停止後もファイルシステムのチェックやRAID-5の再検証を回避できる。

Ben Martinは、10年越しでファイルシステムと取り組んできた。博士課程終了。現在、libferris、ファイルシステム、サーチソリューションを中心にコンサルタント業務を展開している。

Linux.com 原文