Hyper-V仮想マシン管理サービスの復旧


# 事象

仮想マシンをシャットダウンしないままWindows 10 Anniversary Updateを適用後、Hyper-Vマネージャーから再度当該の仮想マシンを起動しようとしたところ、「オブジェクトが現在の状態である間はこの操作を実行できません」と表示され操作不能になりました。

イベントビューアー->Hyper-V-VMMSを覗くとイベントID19060で
「'当該仮想マシン名' は、'開始中' 操作を実行できませんでした。仮想マシンは現在次の操作を実行中です: '開始中'。(仮想マシン ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)」とログがありました。

[Event ID 19060 — Virtual Machine Save Operation](https://technet.microsoft.com/en-us/library/dd582280(v=ws.10).aspx)

# 対応

検索しても情報がなかったので、「キャッシュ削除すればいいんじゃねえの？」くらいの軽い気持ちでc:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines Cache 下の仮想マシンIDに該当する設定情報を消そうとするも当然サービスが握っていて削除できないため、「じゃあサービス一回殺してから消して再起動だ」とこれまた軽い気持ちでHyper-Vマネージャーからサービスを停止しました。

すると「停止中」のまま応答しなくなったため慌ててPC自体を再起動したものの、今度はサービスが自動起動から即クラッシュ→停止中のまま無応答（サービス一覧から停止も開始もできない）という状態になり完全に詰みました。

※なおこの時のPC再起動が再起動中のまま小一時間全く応答がなかったため、やむをえず強制電源断しています

サービス一覧でHyper-V Virtual Machine Management->プロパティ->スタートアップの種類->無効 に変更し、もう一度PCを再起動後サービスが動いていないのを確認して上記キャッシュを削除、再度サービス一覧からスタートアップの種類->自動にした上で手動起動したところ無事復旧しました。

# 対応その後

（2016/8/10追記）

その後もPC再起動毎にこの状況（仮想機が「起動しています」から状態が変わらず、「開始中の取り消し」を行うと再現）が続き頭を抱えていましたが、ふとプロセス一覧を見てみました。

起動直後

```console
C:\WINDOWS\system32>tasklist /FI "IMAGENAME eq vm*"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
vmms.exe                      2380 Services                   0     41,388 K
vmcompute.exe                 3400 Services                   0      8,116 K
```

何らかの仮想機を起動したとき（ここで「起動しています」で固まってしまう）

```console
C:\WINDOWS\system32>tasklist /FI "IMAGENAME eq vm*"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
vmms.exe                      2380 Services                   0     42,328 K
vmcompute.exe                 3400 Services                   0      9,252 K
vmconnect.exe                 6056 Console                    1     57,836 K
vmwp.exe                      1492 Services                   0      5,356 K
```

「開始中の取り消し」を行ったとき（接続ウィンドウは閉じてます）

```console
C:\WINDOWS\system32>tasklist /FI "IMAGENAME eq vm*"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
vmms.exe                      2380 Services                   0     42,444 K
vmcompute.exe                 3400 Services                   0      9,328 K
vmwp.exe                      1492 Services                   0      5,304 K
```

ワーカープロセスが残ったまま（当然）になっていますのでtaskkillしてみます。

```console
C:\WINDOWS\system32>taskkill /F /PID 1492
成功: PID 1492 のプロセスは強制終了されました。
```

Hyper-Vマネージャーのほうでも仮想機がシャットダウンできていることを確認できました。ここで再度仮想機を起動すると無事に起動して接続することができました。

起動成功時

```console
C:\WINDOWS\system32>tasklist /FI "IMAGENAME eq vm*"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
vmms.exe                      2380 Services                   0     34,488 K
vmcompute.exe                13216 Services                   0     10,500 K
vmwp.exe                     13284 Services                   0     41,532 K
vmconnect.exe                13304 Console                    1    121,020 K
```

仮想機シャットダウン後接続ウィンドウを閉じた後

```console
C:\WINDOWS\system32>tasklist /FI "IMAGENAME eq vm*"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
vmms.exe                      2380 Services                   0     34,648 K
vmcompute.exe                13216 Services                   0     10,420 K
```

ちなみに1回操作すると別の仮想機もきちんと起動しました。

別の仮想機を起動したとき

```console
C:\WINDOWS\system32>tasklist /FI "IMAGENAME eq vm*"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
vmms.exe                      2380 Services                   0     35,264 K
vmcompute.exe                13216 Services                   0     10,732 K
vmconnect.exe                 4116 Console                    1    123,704 K
vmwp.exe                     12976 Services                   0     43,976 K
```

前述の「対応」よりはスマートですが、やはりPC起動毎にやらないとダメなので何か根本的解決方法があれば…

***
（2016/8/10更に追記）

wmwp殺しただけだとダメな場合もあったため、手っ取り早く起動直後にvmcompute殺す→vmms殺すのが確実でした。

PC起動直後

```console
C:\WINDOWS\system32>tasklist /FI "IMAGENAME eq vm*"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
vmms.exe                      2488 Services                   0     41,228 K
vmcompute.exe                 4316 Services                   0      8,140 K

C:\WINDOWS\system32>taskkill /F /PID 4316
成功: PID 4316 のプロセスは強制終了されました。

C:\WINDOWS\system32>taskkill /F /PID 2488
成功: PID 2488 のプロセスは強制終了されました。
```

vmms再起動後

```console
C:\WINDOWS\system32>tasklist /FI "IMAGENAME eq vm*"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
vmms.exe                      7872 Services                   0     38,024 K
vmcompute.exe                 8264 Services                   0      7,856 K
```