HN 日本語サマリー

← 一覧へ戻る
インフラ・DevOps

LinuxでNUTを使用してUPSを設定する方法

Configure a UPS on Linux with NUT (linuxjunkies.org)

9 pointsby eustoria0 コメント

要約

UPS(無停電電源装置)は突然の停電からシステムを保護しますが、ソフトウェアによる監視がなければバッテリー切れ時にシステムがクラッシュする可能性があります。Network UPS Tools (NUT) は、数百種類のUPSモデルに対応し、バッテリー状態を監視してクリーンなシャットダウンをトリガーするオープンソースソリューションです。この記事では、ホームラボや小規模サーバーで最も一般的な、単一マシンで自身のUPSに直接接続するNUTの設定方法を解説します。

全文翻訳

LinuxでNUTを使用してUPSを設定する方法

A UPS(無停電電源装置)は、サーバーやワークステーションを突然の停電から保護しますが、ハードウェアだけでは十分ではありません。UPSを監視するソフトウェアがないと、バッテリーが切れたときにシステムは依然としてクラッシュします。Network UPS Tools (NUT) は、標準的なオープンソースソリューションであり、数百種類のUPSモデルと通信し、バッテリー状態を監視し、バッテリーが切れる前にクリーンなシャットダウンをトリガーします。このガイドでは、ホームラボや小規模サーバーで最も一般的な、単一マシンで自身のUPSに直接接続するNUTの設定方法を説明します。

前提条件と用語

設定ファイルに触れる前に、NUTの3つの主要なコンポーネントを理解する必要があります。

  • upsd — UPSデータを読み取り、ソケット経由で提供するデーモン
  • upsmon — UPSの状態を監視し、シャットダウンコマンドをトリガーする
  • driver — UPSハードウェア(USB、シリアル、SNMPなど)と実際に通信する、モデルごとのバイナリ

単一マシンでは、これら3つすべてが同じホストで実行されます。UPSはUSB(コンシューマーおよびプロシューマーユニットで最も一般的)またはシリアルポート経由で接続されます。

NUTのインストール

Debian / Ubuntu
sudo apt update
sudo apt install nut nut-client nut-server
Fedora / RHEL 9 / Rocky Linux
sudo dnf install nut

RHELファミリーのシステムでは、パッケージにサーバーとクライアントの両方のコンポーネントが一緒に含まれています。

Arch Linux
sudo pacman -S nut

インストール後、NUTの設定ファイルはすべてのディストリビューションで /etc/nut/ に保存されます。

UPSの検出

UPSをUSBで接続し、スキャナーを実行します。これはUSBおよびその他のバスをプローブし、必要なドライバーブロックを出力します。

sudo nut-scanner -U

出力は以下のようなものになります(お使いの環境とは異なる場合があります)。

[nutdev1]
    driver = "usbhid-ups"
    port   = "auto"
    vendorid = "051d"
    productid = "0002"
    product  = "Back-UPS ES 700"
    vendor   = "American Power Conversion"

このブロックをコピーし、ほとんどを ups.conf に貼り付けます。nut-scanner が何も検出しない場合は、USBケーブルがデータ通信可能(充電専用ではない)であることを確認し、sudo でコマンドを実行したか確認してください。

ドライバーの設定 — ups.conf

/etc/nut/ups.conf を編集します。プレースホルダーの内容を検出されたブロックに置き換え、UPSに短い名前(ここでは myups)を付けます。

sudo nano /etc/nut/ups.conf
[myups]
    driver = usbhid-ups
    port   = auto
    desc   = "APC Back-UPS ES 700"

nut-scanner が vendorid と productid を返した場合、それらも追加してください。これにより、複数のUPSユニットを接続した場合でも、NUTが間違ったUSBデバイスを掴むのを防ぐことができます。

[myups]
    driver    = usbhid-ups
    port      = auto
    vendorid  = 051d
    productid = 0002
    desc      = "APC Back-UPS ES 700"

一般的なドライバーには、usbhid-ups(APC、Eaton、CyberPowerのほとんどのUSB HID準拠ユニットをカバー)、blazer_usb(Mecer、Voltronic、およびリブランド品の安価なUSBユニットの多くをカバー)、nutdrv_qx(Q-seriesプロトコルユニットをカバー)があります。NUTのハードウェア互換性リスト(networkupstools.org)でモデルとドライバーをマッピングできます。

オペレーティングモードの設定 — nut.conf

この単一のファイルは、このマシンがどのような役割を果たすかをNUTに指示します。

sudo nano /etc/nut/nut.conf
MODE=standalone

standalone は、1台のマシン、1台のUPS、ネットワークスレーブなしを意味します。他のマシンがネットワーク経由でこのUPSを監視する場合にのみ netserver を使用してください。

サーバーの設定 — upsd.conf および upsd.users

upsd.conf は、upsd がどのインターフェースでリッスンするかを制御します。スタンドアロン設定では、localhost で十分です。

sudo nano /etc/nut/upsd.conf
LISTEN 127.0.0.1 3493
LISTEN ::1 3493

次に、upsd.users で少なくとも1つのユーザーを定義します。upsmon が認証するために admin タイプユーザーが必要です。

sudo nano /etc/nut/upsd.users
[upsmon_local]
    password  = changeme_strong_password
    upsmon master

実際のパスワードを選択してください。これはlocalhostでのみリッスンしますが、平文ファイルに保存される資格情報であるため、その権限を制限してください。

sudo chmod 640 /etc/nut/upsd.users
sudo chown root:nut /etc/nut/upsd.users

モニターの設定 — upsmon.conf

upsmon は、バッテリーがクリティカルレベルに達したときに実際に shutdown を呼び出すものです。

sudo nano /etc/nut/upsmon.conf

重要な行は MONITOR です。その形式は upsname@host powervalue username password type です。

MONITOR myups@localhost 1 upsmon_local changeme_strong_password master

MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYFLAG ONLINE  SYSLOG+WALL
NOTIFYFLAG ONBATT  SYSLOG+WALL
NOTIFYFLAG LOWBATT SYSLOG+WALL
NOTIFYFLAG COMMOK  SYSLOG
NOTIFYFLAG COMMBAD SYSLOG
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 25
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

SHUTDOWNCMD は、バッテリーがクリティカルレベルで低くなったときに実行されるコマンドです。/sbin/shutdown -h +0 は即座にシャットダウンします。2分間の猶予期間を設けたい場合は、shutdown -h +2 に調整してください。powervalue 1 は、このUPSからこのホストが生存するために1つの電源供給が必要であることを意味します。これは標準的なデスクトップまたはサーバーで正しい値です。

サービスの開始と有効化

Debian / Ubuntu / Arch
sudo systemctl enable --now nut-server nut-monitor

Debian/Ubuntuでは、以下も必要になる場合があります。

sudo systemctl enable --now nut-driver@myups
Fedora / RHEL / Rocky
sudo systemctl enable --now ups nut-server nut-monitor

RHELファミリーは、ドライバーとサーバーをグループ化する ups ターゲットを使用します。お使いのリリースでサービス名が異なる場合は、systemctl list-units 'nut*' を使用して利用可能なサービスを確認してください。

すべてが機能しているか確認する

upsc を使用してライブUPSデータをクエリします。

upscU myups@localhost

多数の変数が出力されるはずです。重要なのは以下の通りです。

  • ups.status: OL — オンライン(商用電源供給中)
  • battery.charge: 100 — バッテリー満充電
  • battery.runtime: 1800 — 推定ランタイム(秒)

OB はバッテリー稼働中、LB はバッテリー低下(シャットダウン間近)を意味します。upsmon が接続されているか確認してください。

sudo upsc myups@localhost ups.status
sudo systemctl status nut-monitor

実際のシャットダウンをトリガーせずにドライバー通信をテストするには、UPSの主電源ケーブルを一時的に抜いて、ループする upsc の出力でステータスが OB に切り替わるのを観察します。

watch -n 2 upsc myups@localhost ups.status

トラブルシューティング

ドライバーが起動しない — USBデバイスへのアクセス拒否

nut ユーザーはUSBデバイスノードにアクセスする必要があります。ほとんどのディストリビューションでは、NUTパッケージは /lib/udev/rules.d/62-nut-usbups.rules にudevルールを配布しており、これが処理を行います。もしこれが欠落している場合は、udevをリロードしてUPSを再接続してください。

sudo udevadm control --reload-rules
sudo udevadm trigger
upsc が「Error: Driver not connected」を返す

ドライバーが起動していないか、クラッシュしています。そのジャーナルを確認してください。

sudo journalctl -u nut-driver@myups -n 50

一般的な原因としては、ups.conf の driver = 値が間違っている、UPS名のタイプミス、またはUSB権限の問題が挙げられます。

upsmon が「COMMBAD」を報告し、何も行わない

upsd に到達できない場合、upsmon は COMMBAD をログに記録しますが、DEADTIME 秒が経過するまでシャットダウンしません。nut-server が実行されていること、および upsmon.conf の資格情報が upsd.users と正確に一致していること(大文字・小文字を含む)を確認してください。

設定直後にシステムがシャットダウンする

MINSUPPLIES が 1 に設定されていること、およびサービス開始前に upsc myups@localhost ups.status が OL を表示していることを確認してください。NUTが起動時にUPSに到達できない場合、供給を失ったとみなし、シャットダウンをトリガーする可能性があります。