Hyper-V VMがシャットダウンや起動を拒み、通常のボタンが反応しなかったりエラーが表示されたりした経験があるなら、かなりイライラするでしょう。VMが停止、起動、バックアップなどの状態で固まってしまい、管理ツールが何もできないこともあります。もちろん、Windowsは物事を複雑にするのが好きなので、ここではすべてを再起動せずに強制的に正常な状態に戻す方法をご紹介します。必要がないのにサーバー全体の再起動を待つ人はいませんから。
- Hyper-V VM が奇妙な状態で停止する
- Hyper-V でハングした VM を強制的にシャットダウンする方法
- PowerShell を使用してフリーズした VM プロセスを強制終了する
- バックアップ状態のスタックVMの処理
- Hyper-V が VM の状態を変更しない場合のトラブルシューティングのヒント
Hyper-V VM が停止、起動、またはバックアップ状態で停止している
まず、VMが「停止中」または「バックアップ中」のステータスで固まり、なかなか動かない場合は、ゲストOSも応答していない可能性があります。電源を切る、シャットダウン、リセットなどのボタンがグレー表示になり、次のようなエラーが表示されます。
The application encountered an error while attempting to change the state of VM. Failed to change state. The operation cannot be performed while the object is in its current state.
また、Hyper-Vマネージャーで「仮想マシン管理サービスに接続しています」というエラーが表示されたり、仮想マシンが全く表示されなかったりしても、慌てる必要はありません。Hyper-V管理サービス(vmms.exe)を再起動するだけで解決します。これは通常安全で、このプロセスを再起動することで、ホスト全体を再起動することなくスタック状態を修復できる場合がよくあります。簡単に再起動するには、以下の手順に従ってください。
- 実行(Win + R)を開いて、次のように入力します。
services.msc - リストからHyper-V 仮想マシン管理またはvmmsを見つけます
- 右クリックして「再起動」を選択します
サービスの再起動が機能しない、または変更が見られない場合は、PowerShell で実行できます。
Get-Service vmms | Restart-Service
あるいはもっと残酷な方法として、直接止めることもできます。
Stop-Service vmms -Force
理由は分かりませんが、サービスを強制終了して再起動するだけで、すべての状態がリセットされることがあります。試してみる価値はあります。
Hyper-V でハングした VM を強制的にシャットダウンする方法
サービスを再起動しても問題が解決しない場合は、VMのワーカープロセスを強制終了するのが次のステップです。すべてのVMはvmwp.exe(Virtual Machine Worker Process)というプロセスで実行されます。このプロセスを終了するには、まずVMのGUIDを取得する必要があります。通常、これはディスクに保存されているVMの構成ファイルに記載されています。Server設定の「File Location」で構成ファイルがどこに保存されているかを確認してください。おそらくD:\VMstoreなどです。
そのフォルダに移動し、スタックしたVMのフォルダを見つけて、 で終わる設定ファイル名からGUIDをコピーします.vmcx。長い文字列のように見えます。
次に、タスクマネージャー(Ctrl + Shift + Esc)を開き、詳細タブに移動して、vmwp.exeプロセスをすべて見つけます。ユーザー名列にGUIDが埋め込まれている場合もありますが、後ほどコマンドライン情報に基づいて照合することもできます。
VMのGUIDを持つプロセスを探し、右クリックしてタスクの終了を選択します。これは少し強引ですが、効果的です。VMは即座にシャットダウンし、その後、新しい状態に戻すことができます。
あるいは、より高度なツールとして、Process Explorer を使用することもできます。
- プロセス エクスプローラー を管理者として実行します。
- Ctrl + Fを押すか、[検索] > [ハンドルまたは DLL] を選択します。
- 関連するプロセスを見つけるには、VM のディスク ファイル (*.vhdx) へのパスまたは GUID を入力します。
- 見つかったら、プロセスを右クリックし、[プロセスの強制終了] を選択します。
これにより、Windows の通常の安全対策が回避され、スタックした VM プロセスが強制終了されます。設定によっては、ハングした VM から回復する最速の方法となる場合があります。
PowerShell を使用してフリーズした VM プロセスを強制終了する
スクリプトを使いたい場合やリモートで実行したい場合は、PowerShell が面倒な作業を代行してくれます。ただし、少し注意点があります。標準のStop-VM -Force は、VM またはホストが異常な状態にある場合、ハングすることがあります。そこで、プロセスを直接強制終了する機能が登場します。
まず、VM の名前で VM の GUID を取得します。
$VMGuid = (Get-VM "YourVMName").ID
その VM に関連付けられているプロセスを見つけるには、すべてのvmwp.exeプロセスを一覧表示し、コマンド ラインで GUID を一致させます。
$VMProcess = Get-WmiObject Win32_Process | Where-Object { $_. Name -eq 'vmwp.exe' -and $_. CommandLine -match $VMGuid }
何も表示されない場合は、VM名とGUIDを確認してください。その後、プロセスを強制終了するには、以下の手順を実行してください。
Stop-Process -Id $VMProcess. ProcessId -Force
これにより、VMが強制終了され、スタックしたプロセスがクリアされます。ただし、これによりVMは正常なシャットダウンを行わずに強制終了されるため、必要な場合にのみ実行してください。
バックアップ状態のスタックVMの処理
スナップショットやバックアップ中に、VMが「バックアップ中」状態のままになることがあります。VMは動作を継続しますが、通常の方法で停止または起動することはできません。まず、VSSライターのステータスを確認してください。
vssadmin list writers
正常に動作する場合は、Hyper-V管理サービス(vmms.exe)を再起動します。管理者権限でPowerShellプロンプトを開き、以下を実行します。
Get-Service vmms | Stop-Service
拒否された場合は、プロセスを直接探して強制終了する必要があるかもしれません。
Get-Process -Name vmms | Stop-Process -Force
終了したら、再起動します。
Start-Service vmms
これにより、バックアップ中のデッドロックの問題が解消されることがよくあります。ただし、これを行うと、Hyper-V の管理に依存する他の仮想マシンやサービスが一時的に無効になる場合があることに注意してください。
VMの状態が変化しない場合のトラブルシューティングのヒント
それでも VM が起動または停止しない場合は、いくつかの一般的な原因を確認してください。
- VM ファイルが保存される場所に十分なディスク領域があることを確認してください。領域がない場合は実行できません。
- 仮想 DVD ISO がマウントされている場合は、パスが実際に存在し、アクセス可能であることを確認します。
- ネットワーク アダプターを確認します。有効な仮想スイッチに接続されており、「構成エラー」アイコンが表示されない必要があります。
- VMMS サービスがハングアップせずに実行されていることを確認します。
- ログを調べます。手がかりについては、イベント ビューアー > アプリケーションとサービス ログ > Microsoft > Windows > Hyper-V-Worker を開いてください。
- Windows Defenderなどのアンチウイルスソフトウェアをご利用の場合は、VMフォルダとVMディスクファイルをホワイトリストに登録してください。アンチウイルスソフトウェアによっては、アクセスをブロックしたり、必要なファイルを削除したりすることがあります。
- 最後に、ゲスト OS のスリープまたは休止状態を無効にします。重要な操作中に VM OS がスリープ、サスペンド、または休止状態を試行すると、Hyper-V が停止することがあります。
これらすべてがうまくいかない場合は…再起動が必要かもしれません。Hyper-V は当然のことながら、必要以上に状況を複雑にし続けているからです。
プロセスを強制終了してサービスをリセットするというこの方法を使えば、ホスト全体を再起動することなくVMのスタックを解消できるはずです。少しだけ非同期の混乱を起こせば、制御を取り戻すことができます。