新しもの好きプログラマの耳より情報ブログ

仕事でもあるプログラミングについて役に立ちそうな情報を発信していこうというブログです。役に立たなそうな情報はfacebookで。

hypervisorlaunchtype=offでHyper-VをOFFできない問題の解決方法

概要

他の仮想化ソフトを使うなどの理由で、一時的にHyper-VをOFFにしたい場合がある。BlueStacksとか。一般的なテクニックとして、bcdeditでhypervisorlaunchtype=offに設定したエントリを作るというのがよく使われているが、これが効かない環境があった。その解決方法を書く。

結論

Windowsの「コア分離(Core Isolation)」の設定を全てOFFにする必要がある。

詳細

現象としては、hypervisorlaunchtype=offのエントリでOSを起動しても、Hyper-Vが使える状態になってしまう。Hyper-Vと共存できないソフトは、その状態ではやはりエラーを出す。

hypervisorlaunchtype=off自体については説明しないので、他のサイトを参照のこと。 例:Hyper-Vとサードパーティー製仮想マシン環境を共存させる:Windows 10 Hyper-V入門(1/2 ページ) - @IT

原因は、Windowsの「コア分離(Core Isolation)」の機能がHyper-Vを使用していることだった。この設定をhypervisorlaunchtype=offで無効化することはできないようで、この設定がONだと必ずHyper-Vも有効になる。この設定をOFFにした状態だと、hypervisorlaunchtypeの値によってHyper-Vの有効・無効を切り替えることができる。

設定方法

設定はGUIで容易に可能だが、これはセキュリティ機能の一つをOFFにするということなので、リスクを許容できるかを考えて自己責任で実施すること。

スタートメニューから、「コア分離」を検索すると、「コア分離(システム設定)」というメニューが見つかる。(英語環境ではCore Isolation) ここで出てくる設定を全てOFFにすれば良い。 試した環境では「メモリ整合性」「ファームウェアの保護」が表示されていて、両方ともOFFにする必要があった。

f:id:suusanex:20220217230420p:plain
コア分離の設定画面

ちなみにそれぞれ次のレジストリ値に対応しているようだ。1が有効、0が無効。

  • HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity\Enabled
  • HKLM\System\CurrentControlSet\Control\DeviceGuard\Scenarios\SystemGuard\Enabled

おまけ

次の2つのバッチファイルを作ることで、容易に切り替えができるようになってだいぶ便利になった。再起動が必要なのは仕方ない。

Hyper-V&コア分離をOFFする

bcdedit /set hypervisorlaunchtype off
reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v "Enabled" /t REG_DWORD /d 0 /f
reg add "HKLM\System\CurrentControlSet\Control\DeviceGuard\Scenarios\SystemGuard" /v "Enabled" /t REG_DWORD /d 0 /f
shutdown -r -t 0

Hyper-V&コア分離をONする

bcdedit /set hypervisorlaunchtype auto
reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v "Enabled" /t REG_DWORD /d 1 /f
reg add "HKLM\System\CurrentControlSet\Control\DeviceGuard\Scenarios\SystemGuard" /v "Enabled" /t REG_DWORD /d 1 /f
shutdown -r -t 0