
Windows Server 2025ベースのHyper-V環境でUPSのシャットダウン連携を試してみた
はじめに
Hyper-V環境を有効化したWindows ServerにUPSを付けて使うケースは今後徐々に増えてくるのかなぁ?と思いつつ、Hyper-VとUPS連携を実際に試してみました。
2024年11月にWindows Server 2025がリリースされているので、折角なら実績がまだほとんどないであろうWindows Sever 2025ベースのHyper-V環境で試してみようと思い、実際試してみました。
環境
ハードウェア
Dell PowerEdge R650 × 1台
OMRON BU75RW × 1台(ネットワークカードにSC22を搭載)
ソフトウェア
Windows Sever 2025 Standard Edition
サーバーとUPSを1対1で接続している環境です。
Hyper-V環境はクラスタ環境ではなくスタンドアロンのサーバーになります。
Hyper-VホストであるWindows Server 2025とUPSに搭載したネットワークカードとは同一セグメントのネットワーク上に存在しています。
テスト環境のため、仮想マシンは1台だけ(こちらにもWindows Server 2025 Standard Editionを導入)稼働しています。
設定
大まかにですが、以下の設定を行います。
Hyper-Vが動作しているWindows Serverに対してsshを有効化して疎通可能なようにする
Hyper-V ManagerでホストOSがシャットダウンや起動した時の仮想マシンの停止・起動動作について設定をする
SC22でHyper-Vホストのシャットダウン設定をする
Hyper-Vの有効化手順等、Hyper-V環境については触れません。事前に環境が準備できていることを前提に以下内容を記載します。
まず、PowerShellを起動し以下のコマンドを実行して、OpenSSHの状態を確認します。
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
Windows Server 2022まではOpenSSHはインストールが必要でしたが、Windows Server 2025からはOpenSSHはデフォルトでインストールされていいます。まずはインストール状態について確認します。
次にsshサービスを起動します。
Start-Service -Name "sshd"
sshサービスを自動起動するようにしようと思うので、さらに以下のコマンドを実行します。
Set-Service -Name "sshd" -StartupType Automatic
ここまでの実行結果は以下の通りです。

以下のコマンドを実行して、sshサービスがどのような状態を確認します。
Get-Service -Name "sshd" | Select-Object *
StatusがRunning、StartTypeがAutomaticになっていることが確認できます。

UPSのネットワークカードからsshでコマンドを投げて、Hyper-Vホスト及び仮想マシンをシャットダウンするので、Windows Serverにsshで接続できるようにWindows Defendarのファイアーウォールルールを設定します。
サーバーマネージャーのツールメニューを表示します。

受信の規則を定義します。

新しい規則を作成します。

新規作成のウィザードが開始します。

sshのデフォルトポートは22番のため、ポート番号を指定します。

プロファイルを選択します。テスト環境のため、すべて選択していますが、本番環境で利用する場合は、セキュリティレベルに影響する話になるので、プロファイルは利用環境に応じて適切なものに絞って選択してください。

受信規則の名前を付けます。

以下のように受信規則を作成しました。

外部の端末等からsshでHyper-Vホストに接続できることを確認しましょう。

次にHyper-V Managerを操作し、Hyper-V上の仮想マシンに対して、Hyper-Vホストが停止した際の仮想マシンの挙動に対しての設定をします。
今回は電源が喪失した後、サーバーがUPSからの給電を受けてバッテリー稼働状態になり、その後サーバーを停止するという一連の流れを想定していますが、その時にHyper-Vホストが停止するタイミングに合わせて仮想マシンも停止(実際はホストが停止する前に仮想マシンを停止させる)させようと思います。
ということで、Hyper-V Managerを起動して、仮想マシンに対する設定画面を表示します。

ゲストオペレーティングシステムをシャットダウンするを選択し、[適用]を押します。
設備の電源が復旧して復電した際にサーバーを起動しますが、その際の仮想マシンの挙動についての設定を行います。左のメニューから自動開始アクションを選択します。

これでHyper-Vホストの停止や起動に応じて仮想マシンの停止と起動を行うための設定が完了しました。
なお、今回はテスト環境かつ仮想マシンの台数も1台だけであるため、Hyper-V Managerの設定を利用した設定を行っていますが、仮想マシンの台数が多い場合には、Hyper-V Manager上での設定を仮想マシンの数分繰り返すのはつらい作業になりますし、また仮想マシンの停止・起動順序を意識した制御を行ったりするためには、上記のHyper-V Managerの設定では対応ができません。停止・起動順序を意識した制御を行うためには、各仮想マシンに対してsshでログインできるようにした上で、仮想マシンに対する停止・起動のスクリプトを準備し、順番を意識して停止・起動を行うように制御が必要となります。またHyper-V環境がフェイルオーバークラスタ構成を組んでいる場合、接続されている機器(例えばストレージ)に対する停止・起動コマンドを盛り込みながら、UPSがつながっている機器全体に対しての制御をおこなうように準備・設定をする必要があります。
次にUPS側(SC22)に対する設定を行います。
Windows ServerにSSHで接続して、スクリプトによるシャットダウンを行うことになるため、スクリプトシャットダウンのメニューから設定をします。

画面を右にスライドします。

これでUPSの設定は完了です。
シャットダウンテスト
では、動作テストをしてみます。
UPSに給電をしている電源を止め、サーバーがUPSのバッテリー稼働状態となるようにします。
UPSのログには以下のようにバッテリー稼働状態であること、シャットダウンの警告を示すログが記録されます。

数分ほど待つと、Hyper-Vが動作しているWindows Server上に以下のようなメッセージが表示されます。このまま何もせずに停止されることを確認します。

UPSのログを確認するとシャットダウン命令が出て設定したスクリプトが実行されたことが確認できます。

リモートデスクトップで接続して行方を見守っていましたが、以下の通りセッションが切れました。サーバーが完全に停止しました。

UPSのイベント情報を見ると以下のようにログが残っていました。サーバーが停止した後にUPSも正常に停止しています。

ということで、シャットダウンのテストについては無事完了しました。仮想マシンが停止し、その後にホストOSであるHyper-Vが停止する流れで停止したことが確認できました。
復電時の動作について説明は特にしませんが、UPSが接続している電源が復旧して、サーバーへの電力供給が復活した後はサーバーを起動しましょう。サーバーが正常に起動し、Windows Server及びHyper-Vサービスが起動することで、Hyper-V Managerで自動起動するように設定をしている仮想マシンも自動的に起動してきます。
おわりに
今回はWindows Server 2025ベースのHyper-V環境とUPSの連携について触れました。今回UPSはOMRONさんの製品を使いましたが、SC22というネットワークカードが優秀でSC22からsshでコマンドを投げられる点が地味にありがたいところだなと思いました。他社のUPSだとネットワークカードからコマンドを投げることができず、別途UPSの管理ソフトを導入したサーバーを準備して、そのサーバーからのコマンド実行によってサーバーの停止・起動を制御せざるを得ないですが、OMRONさんの製品だとそういう手間もないですし、シャットダウン用のスクリプトも準備されているので、非常に簡単な操作でテストをすることができました。