當您在已安裝 Hyper-V 或相關服務的 Windows 機器上安裝虛擬化應用程式時,通常會出現錯誤。在非 Hyper-V 虛擬化應用程式上執行虛擬機器時出現的錯誤會導致重大問題。這篇部落格文章解釋了造成這些錯誤的原因,如何修復它們,以及如何在安裝了 Hyper-V 的電腦上運行其他虛擬化應用程式。
背景和工作原理
在 Windows 機器上安裝 VMware Workstation、VMware Player 或 Oracle VirtualBox 後,您可能在這些虛擬化應用程式中啟動虛擬機器時遇到錯誤。即使在此時沒有運行 Hyper-V 虛擬機器,錯誤也會發生。您可以在同一台計算機上安裝 VMware Workstation 和 VirtualBox,並運行 VMware 虛擬機器和 VirtualBox 虛擬機器,但不能同時運行。什麼導致了這個 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 是不可用的。一次只能有一個軟體元件使用 Intel VT-x 或 AMD-V。
這種不相容性是由於 Hyper-V 引起的,因為虛擬化擴展沒有暴露給在啟用了 Hyper-V 角色的 Windows 機器上安裝的第二型虛擬化監視器。
VMware Workstation 錯誤:
VMware Workstation 和 Hyper-V 不相容。在運行 VMware Workstation 之前,請從系統中移除 Hyper-V 角色。
VMware Workstation 和裝置/憑證防護不相容。在停用裝置/憑證防護後,可以運行 VMware Workstation。
VirtualBox 錯誤:
藍屏,例如出現 SYSTEM_SERVICE_EXCEPTION 的藍屏
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 開始),一些新的與 Hyper-V 相關的功能會自動安裝並啟用,而不需要 Windows 用戶同意。這些功能包括裝置防護和憑證防護。Windows 更新已知的漏洞,但可能會增加問題並破壞現有的配置。這就是為什麼許多用戶不喜歡自動更新的原因。
裝置防護是 Windows 中的一組安全功能。實施此功能的想法是加強對惡意代碼的執行。裝置防護可在 Windows 10、Windows Server 2019 和 Windows Server 2019 中使用。主要要求是:在本機模式下運行的 UEFI 和啟用了安全啟動。
Credential Guard 是一項功能,旨在最大程度地減少攻擊的影響,即使惡意代碼已經在運行,通過將系統和用戶密鑰隔離開來,使其更難被破壞。
虛擬安全模式(VSM) 是一項利用處理器虛擬化擴展來保護位於內存隔離區域的數據的功能。HVCI 是 Hypervisor 保護的代碼完整性。LSA 是本地安全性權威。
基於虛擬化的安全性(VBS) 是一類利用虛擬化擴展,包括 VSM,在 Windows 中提供安全性的技術。需要 Hyper-V 角色才能使這些功能正常工作(不需要 Hyper-V 管理工具)。
虛擬機監視器(Hyper-V)首先加載,然後操作系統(Windows)加載。Hyper-V 在硬件和操作系統之間提供了一個抽象層。VSM 允許對特定關鍵進程進行標記,並將它們使用的內存視為屬於由 Hyper-V 控制的獨立操作系統。這個原則與在 Hyper-V 主機上運行的兩個虛擬機的隔離類似,每個虛擬機只能使用為其配置的硬件資源。
備註:如果您需要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沙箱
- WSL2。
通過使用控制面板、添加角色和功能嚮導在圖形用戶界面(GUI)中移除Hyper-V功能。
在Windows 10中,打開控制面板,點擊程序和功能,然後點擊開啟或關閉Windows功能。
開啟Windows功能視窗。
取消勾選Hyper-V核取方塊,然後點擊確定。
為了完成移除Hyper-V,重新啟動電腦。
在Windows 10和Windows Server 2016上移除Hyper-V的步驟相似。
在Windows Server 2016中,開啟伺服器管理員,然後點擊管理 > 移除角色和功能。在移除角色和功能精靈中,前往伺服器角色步驟,並取消勾選Hyper-V。在每一步點擊下一步以繼續。重新啟動是完成移除Hyper-V角色所必需的。
方法2:使用PowerShell停用Hyper-V功能
您可以通過使用命令行界面而不是圖形用戶界面來執行類似的操作。
以管理員身份登錄到PowerShell,並運行命令以停用Hyper-V功能:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor
重新啟動您的宿主機器:
shutdown -r -t 0
方法3:使用BCDedit停用Hyper-V
此方法的背後想法是編輯啟動配置數據並停用Hyper-V的啟動而不卸載Hyper-V角色。
以管理員身份登錄到PowerShell,或從提升權限的命令提示符運行命令以停用Hyper-V:
bcdedit /set hypervisorlaunchtype off
如果您需要重新啟用Hyper-V並將默認值設置回來,請運行此命令:
bcdedit /set hypervisorlaunchtype auto
為了獲得更多的控制和便利,請在Windows 10中禁用快速啟動。打開Windows註冊表編輯器,並前往:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power
將HiberbootEnabled參數設置為0
如果您偶爾需要使用Hyper-V VM,請為Windows啟動加載器創建兩個條目:一個用於啟動帶有Hyper-V的Windows,另一個用於啟動不帶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啟動管理器中看到兩個選項。
如果您想刪除No Hyper-V啟動條目,請使用/delete選項為bcdedit。
獲取當前啟動條目的列表:
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:使用dism.exe在PowerShell中卸載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中關閉基於虛擬化的安全性
這種方法用於禁用Device Guard和Credential Guard,這些是與Hyper-V相關的功能。
打開本地機器的組策略編輯器。組策略編輯器在Windows 10 Pro、Enterprise和Education中可用。在命令提示符下,運行gpedit.msc
前往本地計算機策略 > 計算機配置 > 管理模板 > 系統 > 設備防護
雙擊啟用基於虛擬化的安全性。默認情況下,此設置的狀態為未配置。
在打開的窗口中,選擇已禁用,然後點擊確定保存設置,並關閉窗口。
作為替代方案編輯註冊表
在Windows 10家庭版中,由於沒有群組原則編輯器,您可以透過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}
將引導加載程序設置為在啟動SecConfig.efi文件時將選項DISABLE-LSA-ISO,DISABLE-VBS傳遞給該文件:
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
如果您在實體電腦上使用的是Windows10版本2004(20H1)build19041或更新版本,您可以將VMware Workstation升級到VMware Workstation15.5.6或更新版本,並在Windows機器上運行VMware VM,而無需禁用/卸載Hyper-V和基於虛擬化的安全性(VBS)功能,包括Device Guard和Credential Guard。
由於許多客戶的投訴,微軟和VMware決定開發一個聯合項目,採用微軟Windows Hypervisor Platform(WHP)API,允許第2類虛擬機管理程序,如VMware Workstation,在啟用了Hyper-V的宿主上運行。這些API允許應用程序管理CPU資源,讀/寫註冊表值,終止CPU操作,並產生中斷。
版本15.5.5之前的VMware Workstation使用具有直接訪問CPU和虛擬化指令集(Intel VT-x或AMD-V)的虛擬機監視器(VMM)。VMM在特權模式下運行。如果Windows宿主上啟用了基於虛擬化的安全性功能,則在硬件和Windows之間添加了一個額外的hypervisor層(Hyper-V)。Hyper-V具有對用於硬件虛擬化的CPU功能的直接訪問權限,而VMM則無法訪問CPU虛擬化功能。
VMware 在 VMware Workstation 15.5.6 的架構中進行了變更,以允許其產品使用 Microsoft WHP APIs 並修復相容性問題。VMM 現在可以在使用 WHP APIs 的使用者層級運行(而不是在特權模式下),並在沒有直接訪問 CPU 虛擬化擴展的情況下運行 VM。此模式稱為使用者層級監控(ULM)或主機 VBS 模式。如果從 Windows 主機中刪除與 Hyper-V 相關的功能,VMware Workstation 將自動檢測到,並將 VMM 切換為直接訪問 CPU 虛擬化擴展(在特權模式下運行)。
必須在啟用了 Hyper-V 的物理 Windows 機器上安裝 Windows Hypervisor Platform(WHP),以允許 VMware Workstation 在此機器上運行 VMware VMs。通過在控制面板中點擊「打開或關閉 Windows 功能」來安裝 Windows Hypervisor Platform 功能。
因此,您可以在物理機器上更新 Windows 10 和 VMware Workstation 到支持運行 Hyper-V 相關功能和 VMware Workstation VMs 的版本。
主機 VBS 模式的限制:
- 不支持 Windows Server 2016 和其他 Windows Server 版本和版本。因此,VMware Workstation 不能在運行 Windows Server 的物理機器上以主機 VBS 模式運行 VMs。
- 不支持巢狀虛擬化。您無法在 VMware Workstation VMs 內運行巢狀 VMs(VMs)。
- VMware VMs 可能運行更慢。
- 不支持 X86 性能監控計數器(PMC)。
- 用戶模式保護密鑰(PKU)功能不可用。
- 限制性交易記憶體(RTM)和硬體鎖定省略(HLE)功能不可用。
VirtualBox 和 Hyper-V
VirtualBox 可與 Hyper-V、Device Guard 和 Credential Guard 共存,從 VirtualBox 6.0 開始。VirtualBox 6 可與 Windows 10 v1803 x64 上的 Hyper-V API 類似地工作,就像 VMware Workstation 一樣。
這些功能必須在主機 Windows 機器上啟用,才能允許 VirtualBox 使用 Hyper-V API:
- Hyper-V
- Windows Hypervisor 平台
如果啟用了 Hyper-V 功能,但未啟用 Windows Hypervisor 平台功能,在 VM 配置摘要的 系統 > 加速 中,您可以看到 Paravirtualisation 模式 已啟用。如果嘗試啟動 VM,VirtualBox 會提醒您應該啟用 Windows Hypervisor 平台並顯示錯誤消息。
錯誤消息:
WHvCapabilityCodeHypervisorPresent 為 FALSE!請確保您已啟用「Windows Hypervisor 平台」功能。
(VERR_NEM_NOT_AVAILABLE)。
VT-x 不可用 (VERR_VMX_NO_VMX)。
如果在 Windows 中啟用了所需的 Hyper-V 相關功能,則在系統部分會顯示以下信息:
加速:VT-x/AMD-v、巢狀分頁、Paravirtualization Hyper-V
VM 應該成功啟動。VirtualBox 視窗底部面板顯示綠色烏龜圖示。此圖示表示 VM 是在 Hyper-V 虛擬化模式下運行,而不是通常在直接與 CPU 虛擬化擴展進行交互時由 VirtualBox 使用的本機模式。在啟用了 Hyper-V 和相關功能的計算機上,VirtualBox VM 的性能會降低。您可以像之前解釋的那樣停用或移除 Hyper-V,以使用 CPU 虛擬化擴展直接在 VirtualBox 上運行 VM 以本機模式。
也閱讀 VirtualBox 與 Hyper-V 的比較和 VirtualBox 與 VMware 的比較。
結論
新的 Windows 功能,如基於虛擬化的安全性(設備保護和憑證保護)、Windows 沙箱、WSL 等,使用 Hyper-V 引擎會對使用其他虛擬化軟件(如 VMware Workstation、VirtualBox、QEMU 和 Google Android 模擬器)的用戶、管理員和軟件開發人員在 Windows 機器上造成許多問題。解決這些不相容性問題有兩種方法:停用/卸載 Hyper-V 或使用支持與 Hyper-V API 一起工作的虛擬化應用的新版本,例如由 Microsoft 提供的 Windows Hypervisor Platform API。
執行 VM 在 VirtualBox、VMware Workstation 和其他使用 Hyper-V 機器的 hypervisors 上使用 API 可以降低非 Hyper-V VM 的性能。當虛擬化應用程序失敗時,數據備份至關重要。如果您仍未為您的環境選擇最佳的 Hyper-V 備份解決方案,請考慮 NAKIVO 備份與複製。該解決方案提供強大的備份、勒索軟件保護、災難恢復等功能。下載免費版本來查看解決方案的運行情況。