電力不足で突然停電とか御免なのでUPSを買った。OMRON BW55Tという機種で、ざっくり17000円ぐらいの至って普通な正弦波出力のUPSだ。
APC買うのはなんか癪だったのと、ユタカ電機はLinuxで雑に使えるかが不明すぎて怖かったのでOMRONにした。 接点出力でシャットダウンとかでもまあ十分だろうけど、電源バックアップと同時に商用電源の周波数監視もやりたいのである程度賢いインターフェースで繋がってくれるならそれに越したことはない。
OMRONのUPSがLinux機の自動シャットダウンに対応しているとは言っても付属の謎ソフトを入れる気は全くない。Network UPS Tools (nut) というapcupsd的なものがOMRONのUPSに対応しているらしく、BW55Tそのものの設定例は出てこないが旧製品?のBYシリーズとかの設定例がそれなりにあったので行けるだろうと踏んで選定した。
結果としては満足に動くようになったので、メモとして設定を残しておく。設定後1ヶ月半ぐらい放置してからこの記事を書いているので、いろいろ抜け漏れがあるかもしれないが、何か気づいたことがあればそのうち追記する。

サーバの脇で静かに頑張るUPSくん
目次
前提
- Ubuntu 22.04
- Docker CE 20.10.17
- Prometheus 2.31.2
- aptで入れた
- 公式配布バイナリ直で入れた2.17.xでも同じ設定で動いてた
- Grafana 9.0.5
- Grafanaについてはあんまり触れないので適当にやってください
各種インストール+udevルール投入
最終的に/dev/upsから/dev/bus/usb下の適当なバスにリンク張れてて、適当なバスにnutグループから書き込めそうな感じになればOK
BW55T以外を使う場合はidVendor/idProductをlsusbで良い感じに調べて置き換えてね
$ sudo apt install nut prometheus
$ echo 'ATTR{idVendor}=="0590", ATTR{idProduct}=="00d0", MODE="664", GROUP="nut", SYMLINK+="ups", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/ups/devices/ups"' | sudo tee /etc/udev/rules.d/50-nut-ups.rules
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger
$ ls -la /dev/ups
lrwxrwxrwx 1 root root 15 6月 28 16:23 /dev/ups -> bus/usb/003/004
$ ls -la `realpath /dev/ups`
crw-rw-r-- 1 root nut 189, 259 8月 3 02:08 /dev/bus/usb/003/004
Network UPS Tools
設定ぶち込み
注記なき場合、当該ファイルの内容を丸ごと示したとおりに置き換える
ups.conf
BW55T以外を使う場合はvendorid/productidをlsusbで良い感じに調べて置き換えてね
[bw55t]
driver = blazer_usb
port = /dev/ups
desc = "Omron BW55T"
vendorid = 0590
productid = 00d0
subdriver = ippon
default.battery.voltage.high = 13.6
default.battery.voltage.low = 11.6
# Set maxretry to 3 by default, this should mitigate race with slow devices:
#maxretry = 3
ondelay = 0
upsd.users
SUPER_PASSWORD
は適当に置き換えること
[upsmon]
password = SUPER_PASSWORD
upsmon master
upsmon.conf
SUPER_PASSWORD
は適当に置き換えること
# 末尾に追記
MONITOR bw55t@localhost 1 upsmon SUPER_PASSWORD master
動作チェック
nutの設定を投入したらnut-server再起動してupscコマンドでテスト
電圧とか取れてそうならOK
$ sudo systemctl restart nut-server.service
$ upsc bw55t
Init SSL without certificate database
battery.charge: 100
battery.voltage: 13.60
battery.voltage.high: 13.6
battery.voltage.low: 11.6
device.type: ups
driver.name: blazer_usb
driver.parameter.ondelay: 0
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ups
driver.parameter.productid: 00d0
driver.parameter.subdriver: ippon
driver.parameter.synchronous: no
driver.parameter.vendorid: 0590
driver.version: 2.7.4
driver.version.internal: 0.12
input.frequency: 50.0
input.voltage: 104.5
input.voltage.fault: 0.0
output.voltage: 104.4
ups.beeper.status: disabled
ups.delay.shutdown: 30
ups.delay.start: 0
ups.load: 26
ups.productid: 00d0
ups.status: OL BYPASS
ups.temperature: 31.1
ups.type: offline / line interactive
ups.vendorid: 0590
Prometheus
思いつきでセットアップしたのをそのまま使っているためホスト直だったりDocker上で動いてたりいろいろめちゃくちゃ。
Prometheus本体はホスト直、exporter類はDockerコンテナ上というポリシーで既になんとなく動いてしまっているので今回もその通りにする。
/etc/prometheus/prometheus.conf
# scrape_configs: を探し、以下のように項目を追加する
scrape_configs:
- job_name: nut-exporter
metrics_path: /ups_metrics
scrape_interval: 10s
static_configs:
- targets: ['localhost:9199']
labels:
ups: "bw55t"
- job_name: ...
/etc/systemd/system/nut-exporter.service
nut_exporter のDockerイメージを良い感じにpullしてきて起動させるまでを全部systemd unitでやる。
ExecStart行の SUPER_PASSWORD
はupsd.users等で設定したパスワードに書き換えること。いろいろめんどいので --net host で動かしてるが気になるなら良い感じにしてください
NUT_EXPORTER_VARIABLESは渡さないと電源周波数とかが取れなくてちょっと悲しい
[Unit]
Description=nut-exporter
Requires=docker.service network.target nut-server.service
After=docker.service network.target nut-server.service
[Service]
TimeoutStartSec=0
Restart=always
ExecStartPre=-/usr/bin/docker rm nut-exporter
ExecStartPre=-/usr/bin/docker pull druggeri/nut_exporter
ExecStart=-/usr/bin/docker run --net host --name nut-exporter --env NUT_EXPORTER_VARIABLES=battery.charge,battery.voltage,battery.voltage.nominal,input.voltage,input.voltage.nominal,ups.load,ups.status,input.frequency,output.voltage,ups.temperature --env NUT_EXPORTER_USERNAME=upsmon --env NUT_EXPORTER_PASSWORD=SUPER_PASSWORD druggeri/nut_exporter
ExecStop=-/usr/bin/docker kill nut-exporter
[Install]
WantedBy=multi-user.target
動作チェック
$ sudo systemctl daemon-reload
$ sudo systemctl start nut-exporter
$ sudo systemctl enable nut-exporter
$ sudo systemctl restart prometheus
Grafana
Prometheusが起動したらデータは取れてるはずなんで、Grafanaで取れたデータが見えれば完璧に動いたと言えるはずだ。
PromQLで network_ups_tools_input_voltage{ups="bw55t"}
とクエリを突っ込んでやれば、UPSに供給されている商用電源の電圧が取れるはずなのであとは好き勝手にグラフをダッシュボードに追加していけば最強の電源監視環境が完成する。

network_ups_tools_ までクエリを入力しても何も出ないようなら何かがおかしいので頑張って直そう

大した精度はない値でも記録が見られると満足感がある
自動シャットダウン
aptで入れた状態でまあまあ良い感じにしてくれるような設定が入ってる気がする。
/etc/nut/upsmon.conf
に SHUTDOWNCMD
とかの記述があるんでその辺りを調整するとよさそう。
自分の環境では、aptで入れたそのままの設定ではUPSの電池切れは検知できてるのにシャットダウンコマンドの勢いが足らないせいでdaemon終了待ちとかどうでもいいことをやり、その間にバッテリーが息絶えて電源が雑に切れてしまった。何の意味もねえ…
SHUTDOWNCMD "/sbin/poweroff -f"
とかに置き換えてみたけど、フル充電から完全放電まで30分ぐらいバックアップが保ってしまう 1 せいでテストがだるいので試してない。
新品状態でなら30分保つことがわかったので、30分間でなんとかすることにして気にしない方針とした。
余談
Prometheus入れようと思ったらBootstrapがラリった
結論: /usr/share/nodejs/bootstrap/
を消し飛ばす
$ sudo apt install prometheus
...
処理中にエラーが発生しました:
/tmp/apt-dpkg-install-s0xnWM/03-libjs-bootstrap4_4.6.0+dfsg1-4_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
$ sudo apt autoremove libjs-bootstrap4
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
パッケージ 'libjs-bootstrap4' はインストールされていないため削除もされません
これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
prometheus : 依存: libjs-bootstrap4 しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt --fix-broken install' を実行してみてください (または解法を明示してください)。
$ sudo apt install libjs-bootstrap4
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
libjs-bootstrap4 (4.6.0+dfsg1-4) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/libjs-bootstrap4_4.6.0+dfsg1-4_all.deb の処理中にエラーが発生しました (--unpack):
'/usr/share/nodejs/bootstrap/dist/css/bootstrap-grid.css.dpkg-new' をオープンできません: No such file or directory
処理中にエラーが発生しました:
/var/cache/apt/archives/libjs-bootstrap4_4.6.0+dfsg1-4_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
$ sudo rm -r /usr/share/nodejs/bootstrap/
$ sudo apt install libjs-bootstrap4
# 何事もなく入る クソ
$ sudo apt install prometheus
-
Ryzen 5 3500, RAM 32GB, HDD4発(SATAx3, SASx1), RAIDカード(D2616-A22)と10GNIC(Mellanox ConnectX-3)それぞれ1枚ずつといった具合のPCをバックアップした場合 ↩︎