在安装了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 机器上安装了类型 2 的 Hypervisor,虚拟化扩展没有暴露出来。
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 以原生模式运行,并启用安全启动。
凭据保护是一项功能,旨在通过将系统和用户机密隔离,使恶意代码已经在运行时攻击的影响最小化,从而更加困难地进行破坏。
虚拟安全模式(VSM)是一项利用处理器虚拟化扩展的功能,用于在内存的一个隔离区域中保护数据。HVCI是Hypervisor-protected code integrity(超级监控器保护的代码完整性)。LSA是Local Security Authority(本地安全性机构)。
基于虚拟化的安全性(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与VMware对比,VMware Workstation与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
- 凭据保护和设备保护
- 虚拟机平台
- 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虚拟机,请为Windows启动加载器创建两个条目:一个用于启动带有Hyper-V的Windows,另一个用于启动不带Hyper-V的Windows。然后,在启动Windows之前选择所需选项。这种方法可以避免您每次需要在启用或禁用Hyper-V时手动运行PowerShell命令。
bcdedit /copy “{current}” /d “无Hyper-V”
“条目已成功复制到{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}。”
复制并粘贴您的值以替换xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
bcdedit /set “{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}” hypervisorlaunchtype off
重新启动计算机。
计算机重新启动后,您应该在Windows启动管理器中看到两个选项。
如果您想要删除无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:使用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专业版、企业版和教育版中可用。在命令提示符下,运行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
如果您的物理计算机上安装了Windows 10版本2004(20H1)构建19041或更新版本,您可以将VMware Workstation升级到VMware Workstation 15.5.6或更新版本,并在不关闭/卸载Hyper-V和基于虚拟化的安全性(VBS)功能(包括设备防护和凭证防护)的情况下,在Windows机器上运行VMware虚拟机。
由于许多客户的投诉,微软和VMware决定开展一个联合项目,该项目采用微软Windows Hypervisor平台(WHP)API,允许类型2的虚拟机监视器(如VMware Workstation)在启用Hyper-V的主机上运行。这些API允许应用程序管理CPU资源,读取/写入注册表值,终止CPU操作,并产生中断。
VMware Workstation 15.5.5之前的版本使用具有直接访问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 APIs 并解决兼容性问题。VMM 现在可以在用户级别(而不是在特权模式下)使用 WHP APIs 运行,并在没有直接访问 CPU 虚拟化扩展的情况下运行 VM。此模式称为用户级监视器(ULM)或主机 VBS 模式。如果您从 Windows 主机中卸载了与 Hyper-V 相关的功能,VMware Workstation 将自动检测到,并将 VMM 切换到直接访问 CPU 虚拟化扩展(在特权模式下运行)。
Windows Hypervisor Platform(WHP)必须安装在启用了 Hyper-V 的物理 Windows 机器上,以允许 VMware Workstation 在此机器上运行 VMware VM。通过单击控制面板中的启用或关闭 Windows 功能来安装Windows Hypervisor Platform功能。
因此,您可以在物理机器上更新 Windows 10 和 VMware Workstation 的版本,以支持在同一台机器上运行 Hyper-V 相关功能和 VMware Workstation VM。
主机 VBS 模式的限制:
- Windows Hypervisor Platform 在 Windows Server 2016 和其他 Windows Server 版本和版本中不受支持。因此,VMware Workstation 无法在运行 Windows Server 的物理机器上以主机 VBS 模式运行 VM。
- 不支持嵌套虚拟化。您无法在 VMware Workstation VM 中运行嵌套 VM(VMs inside VMware Workstation VMs)。
- VMware VMs 可能运行较慢。
- 不支持 X86 性能监视计数器(PMC)。
- 用户模式保护键(PKU)功能不可用。
- 受限事务内存(RTM)和硬件锁消除(HLE)功能不可用。
VirtualBox和Hyper-V
VirtualBox可以与Hyper-V、设备保护和凭据保护共存,从VirtualBox 6.0开始。VirtualBox 6可以与Hyper-V API类似地工作,就像VMware Workstation在Windows 10 v1803 x64上一样。
必须在主机Windows机器上启用这些功能,以允许VirtualBox与Hyper-V API一起工作:
- Hyper-V
- Windows Hypervisor平台
如果启用了Hyper-V功能,但Windows Hypervisor平台功能被禁用,在VM配置摘要的系统 > 加速中,您可以看到折半虚拟化模式已开启。如果尝试启动虚拟机,VirtualBox会提醒您应该启用Windows Hypervisor平台并显示错误消息。
错误消息:
WHvCapabilityCodeHypervisorPresent为FALSE!确保已启用“Windows Hypervisor平台”功能。
(VERR_NEM_NOT_AVAILABLE)。
VT-x不可用(VERR_VMX_NO_VMX)。
如果在Windows中启用了所需的Hyper-V相关功能,则在系统部分为VM显示以下信息:
加速:VT-x/AMD-v,嵌套分页,折半虚拟化 Hyper-V
虚拟机应该成功启动。在VirtualBox窗口的底部面板中显示一个绿色的海龟图标。该图标表示虚拟机正在以Hyper-V的半虚拟化模式而不是通常与CPU虚拟化扩展直接交互时VirtualBox使用的本地模式下运行。在启用了Hyper-V及相关功能的计算机上,VirtualBox虚拟机的性能会降低。您可以像之前解释的那样禁用或删除Hyper-V,以便在本地模式下使用CPU虚拟化扩展直接运行虚拟机。
还请阅读VirtualBox与Hyper-V的比较和VirtualBox与VMware的比较。
结论
新的Windows功能,如虚拟化安全(设备保护和凭据保护)、Windows沙箱、WSL使用了Hyper-V引擎,这给使用其他虚拟化软件,如VMware Workstation、VirtualBox、QEMU和Google Android模拟器的用户、管理员和软件开发人员带来了许多问题。解决这些不兼容性问题有两种方法:禁用/卸载Hyper-V或使用支持与Hyper-V API一起工作的新版本虚拟化应用程序,如由Microsoft提供的Windows Hypervisor Platform API。
在运行VirtualBox、VMware Workstation和其他虚拟化管理程序的机器上使用API来运行VMs,可能会降低非Hyper-V VMs的性能。当虚拟化应用程序出现故障时,数据备份至关重要。如果您仍然没有为您的环境选择最佳的Hyper-V备份解决方案,请考虑使用NAKIVO备份与复制。该解决方案提供强大的备份、勒索软件保护、灾难恢复等功能。下载免费版本以查看解决方案的运行情况。