APC UPS Daemon(apcupsd) から Network UPS Tools(NUT) に変更

NAS を追加したから当然、停電に対応させないといけない。今までは停電すると apcupsd で Proxmox の各ノードをシャットダウン、UPS もシャットダウンできていたから無駄にバッテリーを消費しなかった。で、DS118 でも同じように UPS をシャットダウンできるだろうと思っていた。

ところが Synology DiskManager(DSM)7.0 になってから、シャットダウンできる UPS はオムロン製だけになったらしい。DSM6.2 までは APC 製の UPS でも(動作保証対象外ではあるものの)大丈夫だったから、NAS を UPS 管理サーバーにしようと思っていたけど方針変更。

目次

時間設定の概要

最終的に、Proxmox のノードに UPS の通信線を USB 接続した NUT の master を1台、残りのノード2台と NAS はネットワークで master から UPS 情報をもらう slave として、それぞれ自身をシャットダウンできるようにした。
UPS は master から送出されるシャットダウン信号で一番最後に電源断にするから、3ノードのうちシャットダウンに一番時間を要するノードに接続している。ups.conf で電源断までの遅延時間を他のノード(slave)がシャットダウンするまでの十分な時間を確保するように設定した。

  • PVE01(master)
    バッテリー駆動後120秒でシャットダウン開始。運用中の仮想マシンが他より多いためか、シャットダウンに一番時間を要するノード。UPS と通信している。
  • PVE02(slave)
    バッテリー駆動後120秒でシャットダウン開始。
  • PVE03(slave)
    バッテリー駆動後120秒でシャットダウン開始。
  • NAS(slave)
    バッテリー駆動後120秒でスリープモードに移行開始。
  • UPS
    master のシャットダウン後、しばらくしてから停止。
  • HUB
    UPS と同時に停止。
  • バッテリー駆動中に復電したらタイマーのカウントはキャンセルされる。
  • master だけ300秒とか開始を遅らせると、その間に停電が回復したとき、slave が自動起動しないかも。
  • 最初、バッテリー駆動に切り替わってから60秒後にシャットダウンを開始する設定にしていた。でも、電力会社は樹木接触などによる配電線故障発生時、停電時間60秒程度の低速度再閉路で復電しているらしい。なので、余裕をみて120秒間はバッテリー駆動で我慢することにした。

DS118 に apcupsd をインストールする(諦めた)

Synology の NAS は NUT で管理しているけど、自鯖環境は apcupsd 。ならやっぱり統一したいと考えるのが人の常。こちらの方を参考に apcupsd をインストールしてみた。

entware-ng を使って apcupsd を動作させるということで、インストール自体は問題なく終えられた。その後、いざ UPS の AC コンセントプラグを抜いて模擬停電をやってみたら・・・NAS はシャットダウンされず、いきなり電源断になってしまった。
コマンド apcaccess で UPS 情報は正しく取得できていたから、シャットダウン処理のコマンドが違っているのだろうとは思いつつ、それ以上の詮索は諦めた。

DS118 を NUT の master にする(諦めた)

仕方がないから DS118 に合わせて Proxmox のクラスタも NUT に統一することにして、各ノードに nut-client をインストールした。この時はまだ、冒頭に書いた DSM7.0 では APC 製 UPS を停止できないことに気づいていなかったから、最後には NAS が UPS を停止してくれるだろうと考えていた。
再び模擬停電をやってみたら・・・NAS と UPS は動作したままだけど各ノードはシャットダウン完了。
こうなると、UPS のAC コンセントプラグを差し込んでも各ノードは「UPS は停止していないから電源断になっていない」ため「AC 電源が回復したら自動起動する」ことができず、ずうっと停止したままになってしまった。
バッテリーは NAS や HUB の電源が入ったままだから、時間はかかるけどいずれ空っぽになる。
Synology のナレッジページその他、DSM6.2 の情報が多いから大丈夫だろうという思い込みが失敗の原因なのでどうしようもない、諦めよう。

PVE のノードを NUT の master にする

最終的にこうなった。DSM7.0 でも NUT の slave として動作させることができるのは確認済み。Proxmox のノードを NUT の master にできることも確認済み。なら最初からこうすれば良かったのにと言われればそのとおりです、ハイ。

master にするノードの設定

UPS と通信するノードの PVE には、apt で nut-server と net-client をインストールする。
と、その前に次のコマンドで apcupsd を設定ファイルごと削除しておく。

apt remove --purge apcupsd
apt -y autoremove
apt install -y nut-server nut-client

/etc/nut/ に nut.conf、ups.conf、upsd.conf、upsd.users、upsmon.conf、upssched.conf が作成されるので修正する。
コメントを除いた行だけ内容を書くと、

MODE=netserver
maxretry = 3

[ups]
  driver = usbhid-ups
  port = auto
  desc = "APC RS 550VA(BR550S-JP)"
  offdelay = 60  #見直し箇所
  ondelay = 70   #見直し箇所
LISTEN 127.0.0.1 3493
# masterのノード(自身)のアドレス
LISTEN 192.168.1.3 3493
[monadmin]
        password  = secret
        upsmon master

# 以下の行だけでも良さげ
# DS118のUSER,PW(/etc/ups/upsd.users)に合わせる
[monuser]
        password  = secret
        upsmon slave
RUN_AS_USER root
MONITOR ups@localhost 1 monadmin secret master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYCMD /usr/sbin/upssched
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYMSG ONLINE        "UPS %s on line power"
NOTIFYMSG ONBATT        "UPS %s on battery"
NOTIFYMSG LOWBATT       "UPS %s battery is low"
NOTIFYFLAG ONLINE       SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT       SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT      SYSLOG+WALL+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /etc/nut/upssched.pipe
LOCKFN /etc/nut/upssched.lock
AT ONBATT * START-TIMER upsgone 120
AT ONLINE * CANCEL-TIMER upsgone
AT LOWBATT * START-TIMER upsgone 5

続いて、upssched.conf で設定するスクリプトファイルを作成する。

vi /etc/nut/upssched-cmd
#!/bin/sh
 case $1 in
        upsgone)
                logger -t upssched-cmd "The UPS has been gone for awhile"
                upsmon -c fsd
                ;;
        lowbatt)
                logger -t upssched-cmd "The UPS became lowbattery"
                upsmon -c fsd
                ;;
        *)
                logger -t upssched-cmd "Unrecognized command: $1"
                ;;
 esac
# 実行権の付与を忘れずに
chmod +x /etc/nut/upssched-cmd

nut-server , nut-client ともリスタートする。

service nut-server restart
service nut-client-restart

UPS 停止をテストしてみる。オプションを忘れなければ UPS を実際に停止する訳じゃないから大丈夫。

upsdrvctl -t shutdown
Network UPS Tools - UPS driver controller 2.7.4
*** Testing mode: not calling exec/kill
   0.000000
If you're not a NUT core developer, chances are that you're told to enable debugging
to see why a driver isn't working for you. We're sorry for the confusion, but this is
the 'upsdrvctl' wrapper, not the driver you're interested in.

Below you'll find one or more lines starting with 'exec:' followed by an absolute
path to the driver binary and some command line option. This is what the driver
starts and you need to copy and paste that line and append the debug flags to that
line (less the 'exec:' prefix).

   0.000096     Shutdown UPS: ups
   0.000113     exec:  /lib/nut/usbhid-ups -a ups -k

slave にするノードの設定

master のノードと同じく apcupsd を削除してから、nut-client だけインストールする。
/etc/nut/ の nut.conf、upsmon.conf、upssched.conf の3つを編集、upssched-cmd を追加する。

MODE=netclient
RUN_AS_USER root
MONITOR ups@192.168.1.3 1 monuser secret slave

# 以下masterと同じ
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYCMD /usr/sbin/upssched
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYMSG ONLINE        "UPS %s on line power"
NOTIFYMSG ONBATT        "UPS %s on battery"
NOTIFYMSG LOWBATT       "UPS %s battery is low"
NOTIFYFLAG ONLINE       SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT       SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT      SYSLOG+WALL+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
# masterと同じ
CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /etc/nut/upssched.pipe
LOCKFN /etc/nut/upssched.lock
AT ONBATT * START-TIMER upsgone 120
AT ONLINE * CANCEL-TIMER upsgone
AT LOWBATT * START-TIMER upsgone 5

master と同じくコマンドを作成する。

vi /etc/nut/upssched-cmd
#!/bin/sh
 case $1 in
        upsgone)
                logger -t upssched-cmd "The UPS has been gone for awhile"
                upsmon -c fsd
                ;;
        lowbatt)
                logger -t upssched-cmd "The UPS became lowbattery"
                upsmon -c fsd
                ;;
        *)
                logger -t upssched-cmd "Unrecognized command: $1"
                ;;
 esac
# 実行権の付与を忘れずに
chmod +x /etc/nut/upssched-cmd

nut-client をリスタートする。

service nut-client-restart

DS118 の設定(slave)

DSM 管理画面にログインして、「コントロールパネル」の「ハードウェアと電源」から「UPS」をクリック。
「UPS サポートの利用」をチェックして、UPS タイプに「Synology UPS サーバー」を選択。
「時間のカスタマイズ」はノードに準じて設定。
「ネットワーク UPS サーバー IP」は master のアドレスを入力。
「適用」をクリックしてから「デバイス情報」を見ると以下の画像のとおり、UPS 情報のダイアログが表示される。

最後に

すべての設定が終わってから UPS の AC コンセントプラグを抜いて模擬停電試験を実施。AC コンセントプラグを抜いてから UPS が停止するまで約6分だった。負荷の状況に因るけど、DeskMini 3台と NAS、HUB、Wi-Fi ルーターくらいならバッテリーはまだまだ元気だし余裕をもってシャットダウンできる。

参考にしたサイト

コメント

コメントする

目次