Windows 8 和 Windows 2012 Server 或更高版本虚拟机在重新引导时出现故障
search cancel

Windows 8 和 Windows 2012 Server 或更高版本虚拟机在重新引导时出现故障

book

Article ID: 301378

calendar_today

Updated On:

Products

VMware vCenter Server VMware vSphere ESXi

Issue/Introduction

Symptoms:
免责声明:本文为 Windows 8 and Windows 2012 Server or later virtual machines fail upon reboot (2092807) 的翻译版本。尽管我们会不断努力为本文提供最佳翻译版本,但本地化的内容可能会过时。有关最新内容,请参见英文版本。

在虚拟机硬件版本为 10 (vmx-10) 的 ESXi 5.5 上运行时,可能遇到以下症状:
  • 在 Microsoft Windows 引导初始屏幕时,重新引导 Windows 8 或 2012 Server 或更高版本虚拟机失败。
  • 重置或者关闭然后再打开虚拟机之后,虚拟机引导成功。
  • 虚拟机可能在数个小时或几天之后恢复引导。
  • 在定时器到期的数个小时或数天后,内存转储分析显示线程拦截。
  • PciStallForPowerChange() 期间拦截线程可能停滞在 KeDelayExecutionThread() 中。

注意:在以下情况下会出现此问题:
  • 虚拟机有两个月以上未进行完全关闭然后重新打开(关闭电源/打开电源)。
  • 虚拟机配置了多个 vCPU。


Environment

VMware vSphere ESXi 5.5
VMware vSphere ESXi 6.0
VMware vCenter Server 5.5.x
VMware vCenter Server 6.0.x

Cause

自 Windows 8 或者 Windows Server 2012 或更高版本开始,在引导过程中,操作系统检测到 CPU0 上的TSC(TimeStampCounter,每个传递周期加1)等于或大于 0x40000000000000 时,会将其重置。操作系统不会重置其他 vCPU 上的TSC,两个vCPU TSC值之间产生的差异可能会导致“症状”部分所描述的问题。这仅适用于虚拟机硬件版本 10,因为 Windows 会重置使用旧版硬件(不支持 hypervisor.cpuid.v2 )的虚拟机上所有 CPU 上的 TSC。

对于使用旧版 BIOS 的虚拟机:

在硬件版本最高为 10 (vmx-10) 的虚拟机上,通过在断言INIT期间软重置完成 Windows 的重新引导。与硬重置(断言CPURSTPCIRST# RSTDRV)之后不同,操作系统不应在软重置后将TSC重置为0x0。可使用配置选项改变软重置时不重置 TSC 的默认行为。

对于使用 EFI 的虚拟机:

这是 VMware EFI 固件的一个已知问题。在 VMware EFI 固件中好像可以使用硬重置,但实际执行软重置。

Resolution

该问题在以下版本中已解决:
此外,要在 vSphere 6.0 中解决此问题,请将虚拟机升级到硬件版本 11。

注意:对于安装了 Windows 8 或者 Windows Server 2012 或更高版本但未将客户机操作系统设置为Windows 8 或者 Windows Server 2012 或更高版本的虚拟机,修复不会解决此问题。
要临时解决此问题,更新 vSphere Web Client 中的高级配置。

在 vSphere Web Client 中,要将 monitor_control.enable_softResetClearTSC = TRUE 添加到虚拟机高级配置,请执行以下操作:
  1. 登录到 vSphere Web Client。

    注意:继续操作前,请确保虚拟机已关闭电源。

  2. 右键单击虚拟机,然后单击编辑设置打开“虚拟机编辑设置”窗口。
  3. 单击虚拟机选项
  4. 从左侧的列表中,展开“高级选项”。
  5. 单击编辑配置
  6. 单击添加行
  7. 在新的“名称”列中键入 monitor_control.enable_softResetClearTSC。
  8. 在新的“值”列中键入TRUE。
  9. 单击确定保存对虚拟机的更改。
  10. 打开虚拟机电源。
有关详细信息,请参见 Monitoring software shows incorrect system uptime for Windows 2008 R2 or later on hardware version 10 (2082042)

或者,可以将此 PowerCLI 脚本用于多个虚拟机:

注意
  • 运行此脚本后,必须对虚拟机执行 vMotion 操作,或者关闭虚拟机后再打开电源,以使更改生效。
  • 对于安装了 Windows 8 或者 Windows Server 2012 或更高版本但未将客户机操作系统设置为Windows 8 或者 Windows Server 2012 或更高版本的虚拟机,此脚本不会临时解决该问题。

ForEach ($vm in (Get-VM)){
$vmv = Get-VM $vm | Get-View
$name = $vmv.Name
$guestid = $vmv.Summary.Config.GuestId
$vmx = New-Object VMware.Vim.VirtualMachineConfigSpec
$vmx.extraConfig += New-Object VMware.Vim.OptionValue
$vmx.extraConfig[0].key = "monitor_control.enable_softResetClearTSC"
$vmx.extraConfig[0].value = "TRUE"
if ($guestid -like "windows8*Guest") {
($vmv).ReconfigVM_Task($vmx)
}
}


Additional Information

要计算在重新引导时硬件版本为 10 的 Windows 8 或者 Windows Server 2012 或更高版本虚拟机最后一次完整重新启动之后挂起的时长,请执行以下操作:

0x40000000000000(Windows TSC 重置值)-> 0n18014398509481984 /86400(周期天数)/1000000000(Hz 到 GHz)

GHz:
/2 -> 104 天
/3 -> 69 天
7Windows 8 and Windows 2012 Server or later virtual machines fail upon reboot