Windowsマシンに仮想化アプリケーションをインストールすると、Hyper-Vまたは関連するサービスがインストールされている場合には、しばしばエラーが発生します。非Hyper-V仮想化アプリケーションでVMを実行する際に発生するエラーは、重大な問題を引き起こすことがよくあります。このブログ投稿では、これらのエラーの原因、修正方法、およびHyper-Vを搭載したコンピュータで他の仮想化アプリケーションを実行する方法について説明します。
背景と動作原理
WindowsマシンにVMware Workstation、VMware Player、またはOracle VirtualBoxをインストールした後、これらの仮想化アプリケーションでVMを起動する際にエラーが発生することがあります。エラーはその時点でHyper-V VMが実行されていなくても発生します。同じコンピュータにVMware WorkstationとVirtualBoxをインストールし、VMware VMとVirtualBox VMを実行することはできますが、同時には実行できません。では、なぜHyper-Vでこの問題が発生するのでしょうか?詳しく見ていきましょう。
VMware Workstation、VMware Player、およびVirtualBoxはタイプ2ハイパーバイザーですが、Hyper-Vはタイプ1ハイパーバイザーです。タイプ2ハイパーバイザーは、ハードウェアで実行されているオペレーティングシステムにインストールされます。タイプ1ハイパーバイザーは、ハードウェアの上にインストールされます。すべてのハイパーバイザーは、プロセッサ仮想化拡張機能が必要です。これらはハードウェア仮想化のための命令セットであり、Intel VT-xまたはAMD-Vです。Windowsが起動すると、Hyper-Vは仮想化拡張機能を制御します。これらの仮想化拡張機能は、Windowsが読み込まれるときにVMware WorkstationとVirtualBoxで使用できません。一度に1つのソフトウェアコンポーネントしかIntel VT-xまたはAMD-Vを使用できません。
この非互換性は、Hyper-Vによって引き起こされます。これは、Hyper-V役割が有効になっているWindowsマシンにインストールされているタイプ2ハイパーバイザーに仮想化拡張機能が公開されていないためです。
VMware Workstationのエラー:
VMware WorkstationとHyper-Vは互換性がありません。VMware Workstationを実行する前にシステムからHyper-V役割を削除してください。
VMware WorkstationとDevice/Credential Guardは互換性がありません。Device/Credential Guardを無効にした後にVMware Workstationを実行できます。
VirtualBoxのエラー:
SYSTEM_SERVICE_EXCEPTIONなどのBSOD
VT-xが利用できません(VER_VMX_NO_VMX)。E_FAIL(0x80004005)。
A VirtualBox VM works too slowly and uses the paravirtualisation (emulation) mode.
最も興味深い状況は、ユーザーがHyper-Vをインストールせずに、VMware WorkstationまたはVirtualBoxを使用する際に、前述のエラーのいずれかに遭遇する場合です。このエラーは、自動Windowsアップデートが有効になっていると発生します。更新(Windows 10 v1607および適切なWindows Serverバージョン、Windows Server 2016以降)では、Windowsユーザーの同意なしに新しいHyper-V関連の機能が自動的にインストールおよび有効化されます。これらの機能には、Device GuardとCredential Guardが含まれます。Windowsの更新は既知の脆弱性を解決できますが、作業構成を破壊したり問題を追加する可能性があります。そのため、多くのユーザーが自動更新を好みません。
Device Guardは、Windowsのセキュリティ機能の一群です。この機能を実装するアイデアは、悪意のあるコードの実行を強化することです。Device Guardは、Windows 10、Windows Server 2019、およびWindows Server 2019で利用可能です。主な要件は、ネイティブモードで動作するUEFIおよびSecure Bootが有効になっていることです。
Credential Guardは、悪意のあるコードがすでに実行されている場合に攻撃の影響を最小限に抑えるための機能であり、システムとユーザーの秘密情報を分離して保護し、侵害をより困難にします。
仮想セキュアモード(VSM)は、プロセッサの仮想化拡張機能を活用して、メモリの隔離された領域でデータを保護する機能です。HVCIは、ハイパーバイザー保護コードの整合性を示します。LSAは、ローカルセキュリティ権限を示します。
仮想化ベースセキュリティ(VBS)は、VSMを含む仮想化拡張機能を使用して、Windowsでセキュリティを提供する技術の一つです。これらの機能を機能させるには、Hyper-Vロールが必要です(Hyper-V管理ツールは必要ありません)。
ハイパーバイザー(Hyper-V)が最初にロードされ、次にオペレーティングシステム(Windows)がロードされます。Hyper-Vはハードウェアとオペレーティングシステムの間に抽象化レイヤーを提供します。VSMでは、特定の重要なプロセスとそれらによって使用されるメモリを、Hyper-Vによって制御される独立したオペレーティングシステムに属するものとしてタグ付けすることができます。この原則は、それぞれがそれに割り当てられたハードウェアリソースのみを使用できるようにするときに、Hyper-Vホストで実行されている2つのVMを分離するのと同様です。
注: VMwareのタイプ1ハイパーバイザが必要な場合は、VMware ESXiとVMware vSphere環境を使用してください。以下のブログ投稿で詳細を学ぶことができます:Hyper-V vs VMware、VMware Workstation vs VMware Player、およびHyper-VでESXiをインストールする方法。
Hyper-Vと他の仮想化アプリケーションの互換性問題を解決する方法を詳細に探りましょう。
方法1:GUIでHyper-Vをアンインストールする
CMDで以下のコマンドを実行してWindows構成に関するシステム情報を確認します:
msinfo32.exe
A System Information window opens. On the following screenshot, you see that Hyper-V is enabled (a hypervisor has been detected), and Device Guard Virtualization-based security is running. Now you can remove these features.
Hyper-Vを削除した後、以下のHyper-V関連機能が利用できなくなることに注意してください:
- Hyper-V
- Credential GuardおよびDevice Guard
- 仮想マシンプラットフォーム
- Windows Sandbox
- WSL2。
コントロールパネル、役割追加、および機能ウィザードを使用して、グラフィカルユーザーインターフェース(GUI)でHyper-V機能を削除します。
Windows 10では、コントロールパネルを開き、プログラムと機能をクリックし、Windowsの機能の有効化または無効化をクリックします。
ウィンドウズ機能ウィンドウが開きます。
チェックボックスハイパーバをオフにし、OKをクリックします。
ハイパーバを完全に削除するために、コンピュータを再起動します。
Windows 10およびWindows Server 2016でハイパーバを削除する手順は似ています。
Windows Server 2016では、サーバーマネージャーを開き、管理をクリックし、>ロールと機能の削除を選択します。ロールと機能の削除ウィザードで、サーバーロールのステップに進み、ハイパーバをオフにします。各ステップで次へをクリックして続行します。ハイパーバロールの削除を完了するには再起動が必要です。
方法2:PowerShellを使用してハイパーバ機能を無効にする
コマンドラインインターフェイスを使用する代わりに、同様のアクションを実行することができます。
管理者としてPowerShellにログインし、ハイパーバ機能を無効にするコマンドを実行します。
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor
ホストマシンを再起動します。
shutdown -r -t 0
方法3:BCDeditを使用してハイパーバを無効にする
この方法の考え方は、ブート設定データを編集し、ハイパーバロールをアンインストールせずにハイパーバのブートを無効にすることです。
管理者としてPowerShellにログインするか、管理者権限でコマンドプロンプトからハイパーバを無効にするコマンドを実行します。
bcdedit /set hypervisorlaunchtype off
ハイパーバを再び有効にしてデフォルト値を戻す必要がある場合は、このコマンドを実行します:
bcdedit /set hypervisorlaunchtype auto
Windows 10でより細かい制御と便利さを得るために、ファストブートを無効にします。Windowsレジストリエディタを開き、以下の場所に移動します:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power
パラメータHiberbootEnabledを0に設定します
時々Hyper-V VMを使用する必要がある場合は、Windowsブートローダーのエントリを2つ作成します。1つはHyper-Vを使用してWindowsを起動し、もう1つはHyper-Vを使用せずにWindowsを起動します。そして、Windowsを起動する前に必要なオプションを選択してください。この方法は、Hyper-Vを有効にしたり無効にしたりするたびにPowerShellでコマンドを手動で実行する必要がなくなります。
bcdedit /copy “{current}” /d “No Hyper-V”
“The entry was successfully copied to {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.”
値をコピーしてxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxの代わりに貼り付けます
bcdedit /set “{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}” hypervisorlaunchtype off
コンピュータを再起動します。
コンピュータが再起動したら、Windowsブートマネージャに2つのオプションが表示されるはずです。
もしNo Hyper-Vブートエントリを削除したい場合は、bcdeditの/deleteオプションを使用してください。
現在のブートエントリのリストを取得します。
bcdedit /v
A list of all entries with their identifiers is displayed in the output. Copy the ID of the entry which you want to remove, and run the following command:
bcdedit /delete “{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}”
方法4:PowerShellでdism.exeを使用してHyper-Vロールをアンインストールする
この方法の考え方は、コマンドラインインターフェイスでデプロイメントイメージサービスおよび管理ツールを使用してHyper-Vをアンインストールすることです。
管理者としてCMDまたはPowerShellにログインします。Hyper-Vをアンインストールするために以下のコマンドを実行します。
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
もし再びHyper-Vをインストールしたい場合は、このコマンドを使用します。
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
方法5:Windowsで仮想化ベースのセキュリティをオフにする
この方法は、Hyper-V関連機能であるDevice GuardとCredential Guardを無効にするために使用されます。
ローカルマシンのグループポリシーエディターを開きます。グループポリシーエディターはWindows 10 Pro、Enterprise、Educationで利用可能です。コマンドプロンプトでgpedit.mscを実行します。
以下の場所に移動します。ローカルコンピュータポリシー > コンピュータ構成 > 管理用テンプレート > システム > Device Guard
仮想化ベースのセキュリティを有効にするをダブルクリックします。デフォルトで、この設定の状態は未設定です。
開いたウィンドウで、無効を選択し、設定を保存するためにOKを押してウィンドウを閉じます。
レジストリを編集する(代替方法)
Windows 10 Home でグループポリシーエディタが存在しない場合、Windowsレジストリで仮想化ベースのセキュリティを無効にできます。
レジストリ設定を変更する前にWindowsレジストリのバックアップを作成して、エラーや問題を回避してください。
レジストリエディタを開きます。管理者として開かれたコマンドラインでregeditを実行します。
次の場所に移動します。HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > Control > DeviceGuard
エントリが存在しない場合は、EnableVirtualizationBasedSecurityを作成します。新しいエントリを作成するには、DeviceGuardディレクトリの空の場所を右クリックし、コンテキストメニューから新規作成 > DWORD (32ビット) 値をクリックします。このレジストリエントリにEnableVirtualizationBasedSecurityという名前を付けます。デフォルトでは、このエントリのデータは0に設定されています(以下のスクリーンショットを参照)。EnableVirtualizationBasedSecurityをダブルクリックして、0を手動で設定できます。
次の場所に移動します。HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > Control > Lsa
Lsaディレクトリに新しいレジストリエントリを作成します。レジストリエディタの右ウィンドウの空のスペースを右クリックし、コンテキストメニューから新規作成 > DWORD (32ビット) 値をクリックします。
この値にLsaCfgFlagsという名前を付けます。この値は0に設定する必要があります。
レジストリエディタを閉じ、コンピュータを再起動します。
管理者権限でPowerShellで次のコマンドを実行して、次回のWindows起動時にDevice GuardとCredential Guardを無効にすることができます。
ドライブX:にUEFIシステムパーティションをマウントします(使用されていないボリュームを選択してください):
mountvol X: /s
次のようにC:\Windows\System32\SecConfig.efiをX:\EFI\Microsoft\Boot\SecConfig.efiにコピーし、ファイルが存在する場合はオーバーライトするオプションを付けます。このファイルはWindowsセキュリティ構成ツールのブートイメージです。
copy %WINDIR%\System32\SecConfig.efi X:\EFI\Microsoft\Boot\SecConfig.efi /Y
ブートメニューにID{0cb3b571-2f2e-4343-a879-d86a476d7215}と名前DebugToolの新しいオプションを作成します:
bcdedit /create {0cb3b571-2f2e-4343-a879-d86a476d7215} /d “DebugTool” /application osloader
前の手順で作成したブートオプションを\EFI\Microsoft\Boot\SecConfig.efiに設定します:
bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} path “\EFI\Microsoft\Boot\SecConfig.efi”
Windows Boot Managerを次回の再起動時に新しいエントリをデフォルトにするように設定します。その後、Windowsを再起動すると通常のブートに戻るはずです。
bcdedit /set {bootmgr} bootsequence {0cb3b571-2f2e-4343-a879-d86a476d7215}
ブートローダーを、ブートローダーがファイルを起動する際にDISABLE-LSA-ISO,DISABLE-VBSオプションをSecConfig.efiファイルに渡すように設定します。
bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} loadoptions DISABLE-LSA-ISO,DISABLE-VBS
X:ドライブにブートされたドライブのパーティションを設定します:
bcdedit /set {0cb3b571-2f2e-4343-a879-d86a476d7215} device partition=X:
システムからX:ドライブをマウント解除します:
mountvol X: /d
方法6: VMware Workstationをアップデートする
物理コンピューター上でWindows 10バージョン2004(20H1)ビルド19041以降を使用している場合は、VMware WorkstationをVMware Workstation 15.5.6以降にアップグレードし、Hyper-Vおよび仮想化ベースのセキュリティ(VBS)機能(Device GuardおよびCredential Guardを含む)を無効にしたりアンインストールしたりせずに、WindowsマシンでVMware VMを実行できます。
多くのお客様からの苦情により、MicrosoftとVMwareは、Hyper-Vが有効になっているホストでタイプ2ハイパーバイザー(VMware Workstationなど)を実行できるようにするMicrosoft Windowsハイパーバイザープラットフォーム(WHP)APIを採用する共同プロジェクトを開発することに決定しました。これらのAPIを使用すると、アプリケーションはCPUリソースを管理し、レジストリ値を読み書きし、CPU操作を終了し、中断を生成できます。
バージョン15.5.5以前のVMware Workstationは、CPUへの直接アクセスと仮想化命令セット(Intel VT-xまたはAMD-V)を持つ仮想マシンモニタ(VMM)を使用します。VMMは特権モードで動作します。Windowsホストで仮想化ベースのセキュリティ機能が有効になっている場合、ハードウェアとWindowsの間に追加のハイパーバイザーレイヤー(Hyper-V)が追加されます。Hyper-Vは、ハードウェア仮想化のために使用されるCPU機能に直接アクセスでき、VMMはCPU仮想化機能にアクセスできません。
VMwareはVMware Workstation 15.5.6のアーキテクチャに変更を加え、彼らの製品でMicrosoft WHP APIを使用することを許可し、互換性問題を修正しました。VMMは、WHP APIを使用して、特权モードでなくユーザーレベルで実行することができ、CPU仮想化機能に直接アクセスする必要なしにVMを実行することができます。このモードは、User Level Monitor (ULM)またはHost VBSモードと呼ばれます。Windows host上のHyper-V関連の機能をアンインストールした場合、VMware Workstationは自動的に認識し、VMMはCPU仮想化機能への直接アクセス(特権モードでの実行)に切り替わります。
Windows Hypervisor Platform (WHP)は、Hyper-Vを有効にした物理的なWindowsマシンにインストールされていなければならず、VMware WorkstationがこのマシンでVMware VMsを実行することができます。Control PanelからWindows Hypervisor Platform機能をインストールします。Turn Windows features on or offをクリックします。
これにより、Windows 10とVMware Workstationを物理的なマシンに更新し、Hyper-V関連機能とVMware Workstation VMを同一マシン上で実行することができるバージョンに更新することができます。
Host VBSモードの制限:
- Windows Server 2016およびその他のWindows ServerのバージョンとエディションではWindows Hypervisor Platformをサポートしていません。このため、VMware WorkstationはWindows Serverを実行している物理的なマシンでHost VBSモードでVMを実行することはできません。
- 嵌套仮想化はサポートしていません。VMware Workstation VMの中で嵌套VM(VMware Workstation VMのVM)を実行することはできません。
- VMware VMは遅くなる可能性があります。
- x86パフォーマンス監視カウンタ(PMC)はサポートしていません。
- ユーザーモード保護キー(PKU)機能は利用できません。
- 制限されたトランザクションメモリ(RTM)およびハードウェアロック回避(HLE)機能は利用できません。
VirtualBoxとHyper-V
VirtualBoxは、VirtualBox 6.0からHyper-V、Device Guard、およびCredential Guardと共存できます。VirtualBox 6は、Windows 10 v1803 x64上のVMware Workstationと同様にHyper-V APIと連携できます。
これらの機能を使用するには、ホストWindowsマシンで次の機能を有効にする必要があります:
- Hyper-V
- Windows Hypervisor Platform
Hyper-V機能が有効になっているが、Windows Hypervisor Platform機能が無効になっている場合、VM構成サマリーのシステム>アクセラレーションで、パラバーチュアライゼーションモードがオンになっていることが表示されます。VMを起動しようとすると、VirtualBoxはWindows Hypervisor Platformを有効にするように警告し、エラーメッセージを表示します。
エラーメッセージ:
WHvCapabilityCodeHypervisorPresentがFALSEです! ‘Windows Hypervisor Platform’機能が有効になっていることを確認してください。
(VERR_NEM_NOT_AVAILABLE)。
VT-xが利用できません(VERR_VMX_NO_VMX)。
Windowsで必要なHyper-V関連の機能が有効になっている場合、VMのシステムセクションに次の情報が表示されます:
アクセラレーション:VT-x/AMD-v、ネステッドページング、パラバーチュアライゼーションHyper-V
仮想マシンは正常に起動する必要があります。VirtualBoxウィンドウの下部パネルには、緑色の亀のアイコンが表示されます。このアイコンは、通常VirtualBoxがCPU仮想化拡張機能と直接対話するときに使用されるネイティブモードの代わりに、Hyper-VパラバーチュアライゼーションモードでVMが実行されていることを示します。Hyper-Vおよび関連機能が有効になっているマシンでは、VirtualBox VMのパフォーマンスが低下します。Hyper-Vを無効にするか削除して、CPU仮想化拡張機能を直接使用してVirtualBoxでVMをネイティブモードで実行できるようにする方法については、以前に説明した通りです。
VirtualBoxとHyper-Vの比較とVirtualBoxとVMwareの比較もお読みください。
結論
新しいWindows機能(Device GuardやCredential Guardを含む仮想化ベースのセキュリティ、Windows Sandbox、WSLなど)は、Hyper-Vエンジンを使用するため、他のハイパーバイザー(VMware Workstation、VirtualBox、QEMU、Google Android Emulatorなど)を使用するユーザー、管理者、ソフトウェア開発者に多くの問題を引き起こします。これらの非互換性の問題を解決するための2つのアプローチがあります:Hyper-Vを無効にする/アンインストールするか、Windows Hypervisor Platform APIなどのHyper-V APIと連携する新しいバージョンの仮想化アプリケーションを使用すること。これはMicrosoftが提供しているものです。
VirtualBox、VMware Workstation、および他のハイパーバイザーでHyper-Vを備えたマシン上でVMを実行する場合、APIを使用することで非Hyper-V VMのパフォーマンスが低下する可能性があります。仮想化アプリケーションが失敗した場合のデータバックアップは重要です。まだ環境に最適なHyper-Vバックアップソリューションを選んでいない場合は、NAKIVO Backup & Replicationを検討してください。このソリューションは、強力なバックアップ、ランサムウェア保護、災害復旧などを提供しています。ソリューションを実際に試すには、無料版をダウンロードしてください。