開発PCの1台では、Hyper-V VMでLinuxを動作させています。Windows側から localhost
でアクセスできない欠点はあるものの、それ以外は大きな不便もなく、クセが強いWSL2よりも使いやすいです。
発生した問題
ある日、PC再起動後にVMを復元しようとしたところ、「復元中(99%)」のまま5分待っても進まなくなってしまいました。
ああたまにあるやつね、別にメモリのデータ消えてもいいからたまにはVM再起動するか、位に考えていたのですが、
- 「復元中の取り消し」をしても何も起きない
- シャットダウンやリセット、「保存された状態を削除」のボタンが表示されない
- ホストOSを再起動しても状態が変わらない
で困ってしまいました。
軽くググった感じでは、 vmwp.exe
を停止すると直るというのがあったのでやってみましたが、アクセスが拒否されてしまいます。もちろん管理者権限のPowerShellです。
PS C:\WINDOWS\system32> tasklist /FI "IMAGENAME eq vm*"
(結果からvmwp.exeを探す)
PS C:\WINDOWS\system32> taskkill /f /t /pid 17144
エラー: PID 8648 のプロセス (PID 17144 の子プロセス) を終了できませんでした。
理由: アクセスが拒否されました。
どうやらこの場合は親プロセスの vmcompute.exe
をkillすると良いらしい。が、それを消しても同じエラーや別のエラー(実行中のタスクのインスタンスが見つかりませんでした)が出続け、完全に止められません。
Hyper-Vマネージャー画面上では、「仮想マシン管理サービスは利用できません」になったり、読み込み中が終わらなかったり。
ホストOSを再起動しても毎回「復元中」になってしまうため、一度VMを削除して再インポートすることも、 .vmrs
ファイルを削除することもできません。
また、Hyper-V Vritual Machine Managementサービスを停止しようとしても、停止中にエラーが出てしまい、ファイルハンドルを手放してくれません。
対処
セーフモードでゴニョゴニョするしかないのかな?と思ったのですが、結局、以下の手順で対応しました。
Hyper-V Vritual Machine Managementを自動起動しないようにする
services.msc
で当該サービスの起動を「自動」ではなく「手動」にし、PCを再起動します。これで再起動時に勝手に起動しなくなります。
VMを作り直す
.vmrs
ファイルだけを削除してみたところ、起動できそうに期待させて、やはりエラーになってしまいました。
「保存された状態を削除」が押せたので実行したところ「操作に失敗しました」とだけ表示され、よくわかりません。
ここから少し頑張ればきれいに復元できそうな気もしますが、それほど高度なVM設定があるわけでもないしVMの登録解除→再インポートで良いだろう、ということにしました。
ここで誤算 :マネジメントコンソールでVMを消すと、メタ情報ファイルが削除されて再インポートできないのですね。製品によって「削除」と「登録解除」が似たような用語で違う動作をするので間違えました。バックアップ取っておけばよかった。
VHDXは無事なので、気を取り直してVMの再作成です。CPUコアやメモリの割当、NICとVLANの設定なんて覚えていませんが、適当に再設定して、どうにか元の開発環境に近いものが取り戻せました。
めでたしめでたし。