OMRONのUPS、BY50Sを購入しました。
これにLinuxマシンを接続し、UPSがバッテリーモードになったら自動的にシャットダウンするようにしたい。さらにウチではメインマシンの他にraspiも動いており、こちらも同じUPSに繋ぎバッテリーモードになったらシャットダウンさせたい。というわけでNUT(Network UPS Tools)を導入することにしました。
NUTについて色々サイトを回ってみたのですが、日本語のサイトではstandaloneでの設定,つまりUPSに繋いだ1台のPCだけの場合の設定方法が殆どのようです(もちろん探し方が悪いのかもしれませんが・・・)。それ以外には、バッテリーモードになった時に起動させるスクリプトでリモートマシンをssh経由でシャットダウンさせる、というものも有りました。
しかし「ネットワーク」UPSツール、というからにはもっとサーバ・クライアントタイプ的な起動方法もあるのでは・・・?実際、apcupsd(APC社・現シュナイダーエレクトリック社製のUPSに特化したUPS監視ソフト)では、UPSに直接繋がったPCをサーバにしてクライアントがサーバにUPSの状態を尋ねる、という事が結構簡単な設定で出来るようになっています。
で、色々と試した結果、NUTでサーバ・クライアントタイプ的な感じで起動させることに成功したようなのでその備忘録としてこの記事を書きます。
メインマシンは ubunut 16.04, raspiはRaspbian Stretchです。
UPSとメインPCとの間は、付属してきたUSBケーブルでつないでいます。
まずはununutでnutのインストール
$ sudo apt-get install nut
すると /etc/nut に色々な設定ファイルがインストールされます。また /etc/init.d以下には
nut-server
nut-client
が作成されます。
このスクリプトをちょっと眺めてみると、nut-serverで upsd の起動、nut-client で upsmonの起動を行っているようです。そこで
● サーバマシンでupsd起動(nut-server実行)
● サーバマシン自身を含むクライアントでupsmonを起動(nut-client実行)
という流れになりそうです。
サーバマシン(ubuntu 16.04)での設定
1. /etc/nut/nut.conf: MODEを以下に変更
MODE=netserver
2. /etc/nut/ups.conf: 以下を追記(BY50Sの場合)
[by50s]
driver=blazer_usb
port=auto desc="OMRON BY50S"
vendorid=xxxx
productid=oooo
subdriver=ippon
OMRON BY50Sはdriver=blazer_usb, subdriver=ipponで動くとのこと(下記参照)
http://d.sunnyone.org/2011/05/omron-by50subuntu-1104.html
またvendorIDとproductIDは lsusbで以下のようにして調べられます。
$ lsusb | grep -i omron
Bus 008 Device 002: ID xxxx:oooo Omron Corp.
3. /etc/nut/upsd.conf: 以下を追記
LISTEN 127.0.0.1 3493
LISTEN 192.168.xx.xx 3493
192.168.xx.xxはサーバマシンのIPアドレスです。
3493はデフォルトのポート番号です。ファイアーウォールを用いている場合はこのポートを開ける必要が有ります。
4. /etc/nut/upsd.users
[monmaster]
password=pass010
upsmon master
[monslave]
password=pass011
upsmon slave
masterとslave用のユーザ名、パスワード(適当な文字列で可)を設定しておきます。
/lib/udev/rules.d/52-nut-usbups.rules
の編集、udevadmでルールの読み込み、UPSへトリガーをかけて
$ sudo service nut-server start
で起動。
サーバのupsmon関連の設定
5. /etc/nut/upsmon.conf
MONITOR by50s@192.168.xx.xx 1 monmaster pass010 master
NOTIFYCMD /sbin/upssched
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC
by50s は2.で設定したUPSの名前。
192.168.xx.xx はサーバマシンのIP。ここはlocalhostでも可?
monmaster pass010 は、4.で指定したマスター用のユーザ名とパスワードです。
あと
SHUTDOWNCMD "/sbin/shutdown -h +0"
はデフォルトのままいじっていません。
NOTIFYCMDに /sbin/upssched を指定しているので、その設定も変更します。
6. /etc/nut/upssched.conf: 以下を追記(ここの記事のまま)
PIPEFN /var/run/nut/upssched.pipe
LOCKFN /var/run/nut/upssched.lock
AT ONBATT * START-TIMER upsgone 120
AT ONLINE * CANCEL-TIMER upsgone
赤字の数字(秒)が、UPSがバッテリーモードになった時、シャットダウンするまでの時間です。
あと、やはりここの記事の通り/bin/upssched-cmdを編集してupsmon -c fsd を追加
7. /bin/upssched-cmd
case $1 in
upsgone)
logger -t upssched-cmd "The UPS has been gone for awhile"
upsmon -c fsd
;;
*)
logger -t upssched-cmd "Unrecognized command: $1"
;;
esac
以上ができたら
$ sudo service nut-client start
クライアント側の設定
クライアントPCではupsmonだけを起動します。
まずはraspiにnutをインストール
$ sudo apt-get install nut
8. /etc/nut/nut.conf: MODEを以下に変更
MODE=netclient
9. /etc/nut/upsmon.conf
MONITOR by50s@192.168.xx.xx:3493 1 monslave pass011 slave
NOTIFYCMD /sbin/upssched
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC
:3493 は3. で指定したポート番号です。
monslave pass011 は4.で指定したslave用ユーザ名、パスワードです。
10. /etc/nut/upssched.conf と /bin/upssched-cmd をサーバの6. 7.と同様に編集
$ sudo service nut-client start
で起動。
尚 /etc/nut 以下のファイルはパーミッションが640になっているため、
$ ls -l /etc/nut/*
としてみて、全てのファイルのグループが nut となっていることを確認して下さい。