Windows 虚拟机问题排查


本文档介绍可用于解决以下 Compute Engine Windows 虚拟机 (VM) 实例启动问题的方法和工具:

  • 您无法使用 RDP 连接到虚拟机,并且问题排查未能成功解决连接。

  • 登录屏幕未出现在虚拟机屏幕截图中,并且虚拟机似乎未正常运行或正在执行更新。

  • 您在正常操作期间遇到蓝屏错误、冻结或不正常行为。

如果您在连接到 Windows 虚拟机时遇到问题,请参阅 RDP 问题排查

准备工作

  • 请参阅 Windows 启动问题的 Windows 高级问题排查,了解如何排查 Windows 启动进程问题。
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

使用“高级启动选项”菜单

如果 Windows 未正确启动,请使用“高级启动选项”菜单访问安全模式或完成操作系统的在线修复。如需了解详情,请参阅高级启动选项

如需进入 Windows 虚拟机上的“高级启动选项”菜单,请完成以下步骤:

  1. 为虚拟机启用显示设备(如果尚未启用)。
  2. 连接到虚拟机的交互式串行控制台

  3. 使用以下方法之一重启虚拟机:

    控制台

    1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 点击要重启的虚拟机的名称。虚拟机实例详情页面随即打开。

    3. 点击重置按钮以重新启动虚拟机。

    gcloud

    使用 gcloud compute instances reset 命令重置虚拟机:

    gcloud compute instances reset VM_NAME --zone=ZONE --project=PROJECT_ID
    

    请替换以下内容:

    • PROJECT_ID:包含虚拟机的项目 ID。
    • ZONE:虚拟机所在区域的名称
    • VM_NAME:虚拟机的名称

    命令提示符

    在连接到交互式串行控制台时,打开命令提示符会话并运行以下命令。如需详细了解如何打开命令提示符会话,请参阅在 Windows SAC 中打开命令提示符

    shutdown /r /t 0
    

    系统会打开 Windows 启动管理器菜单:

    Windows 启动管理器菜单

  4. 在倒计时结束之前,完成以下步骤:

    1. 确保交互式串行控制台是您的活动窗口。

    2. 按键盘上的 Esc 键。

    3. 按键盘上的数字键 8

    系统会打开“高级启动选项”菜单:

    “高级启动选项”菜单

  5. 使用键盘上的箭头键选择一个选项,然后按 Enter 键将其打开。

启用 Windows 启动管理器菜单

您可以将 Windows 启动管理器菜单配置为在重新启动 Windows 虚拟机实例时显示。如需启用 Windows 启动管理器菜单,请执行以下操作:

连接到虚拟机,然后使用管理员权限打开命令提示符。 如果您无法连接到虚拟机,请将后续步骤作为值添加到 windows-startup-script-cmdwindows-startup-script-ps1 启动脚本,而不是直接运行它们

命令提示符

  1. 如需在启动时启用 Windows 启动管理器菜单并添加 15 秒超时,请运行以下命令:

    bcdedit /set {bootmgr} displaybootmenu yes
    
    bcdedit /set {bootmgr} timeout 15
    
  2. 如需重新启动虚拟机并使用以下命令显示串行控制台中的 Windows 启动管理器菜单,请执行以下操作:

    shutdown -r -t 0
    

PowerShell

  1. 如需在启动时启用 Windows 启动管理器菜单并添加 15 秒超时,请运行以下命令:

    bcdedit /set '{bootmgr}' displaybootmenu yes
    
    
    bcdedit /set '{bootmgr}' timeout 15
    
  2. 如需重新启动虚拟机并使用以下命令显示串行控制台中的 Windows 启动管理器菜单,请执行以下操作:

    shutdown -r -t 0
    

完成离线修复

如果您的虚拟机无法正常启动,并且使用高级启动菜单无法解决此问题,请尝试使用正常运行的 Windows 虚拟机实例执行离线修复,并借助发生故障的虚拟机的启动磁盘快照进行恢复。使用快照让您可修改备份副本,而不需要更改原始虚拟机的状态。

  1. 为发生故障的虚拟机的启动磁盘创建快照

  2. 使用该快照创建磁盘

  3. 使用新创建的磁盘创建具有附加非启动磁盘的虚拟机。您的恢复虚拟机应满足以下条件:

    • 恢复虚拟机必须与创建的磁盘位于同一可用区。
    • 恢复虚拟机还应使用 Windows Server 映像
    • 恢复虚拟机的启动磁盘的来源映像应与发生故障的虚拟机启动磁盘的来源映像不同。
  4. 您现在可以使用 Windows 工具和实用程序尝试对附加的挂接磁盘进行离线修复。请参阅以下文档,详细了解如何完成虚拟机的离线修复:

  5. 如果离线修复成功完成,请将发生故障的虚拟机的启动磁盘更新为新修复的启动磁盘。

  6. 可选:删除不再需要的附加资源:

排查蓝屏错误

Windows 操作系统可能会遇到停止代码或蓝屏错误,也称为“蓝屏死机”。如果虚拟机遇到蓝屏错误,则虚拟机会停止运行,需要先执行重启,然后才能恢复正常操作。

如果您认为发生了蓝屏错误,请通过以下一种或多种方法识别是否存在错误来进行确认:

串行端口 1

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 点击要查看其日志的虚拟机的名称。虚拟机实例详情页面随即打开。

  3. 日志下,点击串行端口 1

  4. 类似于以下内容的堆栈轨迹转储确认蓝屏错误:

    ntoskrnl.exe [0xFFFFF802C9606000, 0xFFFFF802C9E23000]
    netbios.sys [0xFFFFF80E98430000, 0xFFFFF80E98442000]
    volmgr.sys [0xFFFFF80E97E40000, 0xFFFFF80E97E58000]
    NTFS.sys [0xFFFFF80E98060000, 0xFFFFF80E98293000]
    crashdmp.sys [0xFFFFF80E986C0000, 0xFFFFF80E986D9000]
    pvpanic.sys [0xFFFFF80E99030000, 0xFFFFF80E9903C000]
    myfault.sys [0xFFFFF80E9A570000, 0xFFFFF80E9A578000]
    Dumping stack trace:
    0xFFFFF80E990317C7 (pvpanic.sys+0x17C7)
    0xFFFFF80E990316D3 (pvpanic.sys+0x16D3)
    0xFFFFF802C97D9681 (ntoskrnl.exe+0x1D3681)
    0xFFFFF802C97D8A1F (ntoskrnl.exe+0x1D2A1F)
    0xFFFFF802C97633F4 (ntoskrnl.exe+0x15D3F4)
    0xFFFFF802C9773329 (ntoskrnl.exe+0x16D329)
    0xFFFFF802C976F152 (ntoskrnl.exe+0x169152)
    0xFFFFF80E9A572794 (myfault.sys+0x2794)
    Current Process: notmyfault64.e
    

串行端口 2

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 点击要查看其日志的虚拟机的名称。虚拟机实例详情页面随即打开。

  3. 日志下,展开更多,然后点击串行端口 2(控制台)

  4. 查看实例的串行端口,并查找如下所示的输出:

    !SAC>
    Your PC ran into a problem and needs to restart.
    If you call a support person, give them this info:
    UNEXPECTED_KERNEL_MODE_TRAP
    
    myfault.sys
    
    0x0000000000000008
    0xFFFFC6812AB94F70
    0xFFFFC6812E38EFF0
    0xFFFFF80E9A572794
    
    We're just collecting some error info, and then we'll restart for you.
    100% complete
    

命令提示符

  1. 连接到实例,然后使用管理员权限打开命令提示符。

  2. 如需显示最新的蓝屏事件,请运行以下命令:

    wevtutil qe System "/q:*[System [(EventID=1001)]]" /rd:True /c:1 /f:Text
    
  3. 查看输出,如下所示:

    Event[0]:
      Log Name: System
      Source: Microsoft-Windows-WER-SystemErrorReporting
      Date: 2021-04-14T08:53:52.933
      Event ID: 1001
      Task: N/A
      Level: Error
      Opcode: N/A
      Keyword: Classic
      User: N/A
      User Name: N/A
      Computer: WINDOWS
      Description:
    The computer has rebooted from a bugcheck.  The bugcheck was: 0x1000007f (0x
    0000000000000008, 0xffffc6812ab94f70, 0xffffc6812e38eff0, 0xfffff80e9a572794
    ). A dump was saved in: C:\Windows\Minidump\041421-12656-01.dmp. Report Id:
    a5710c98-a577-4b3e-a3c9-2fc0aa4e5d83.
    

如需了解如何自定义 wetutil 查询,请参阅 wevtutil

磁盘快照

如果虚拟机不再运行,或者其他方法已失败。您可以使用辅助虚拟机检查可疑蓝屏虚拟机的启动磁盘。使用快照让您可修改备份副本,而不需要更改原始虚拟机的状态。

  1. 创建可疑蓝屏虚拟机的启动磁盘的快照

  2. 使用该快照创建磁盘

  3. 使用可疑虚拟机的新创建磁盘创建具有附加非启动磁盘的虚拟机。您的恢复虚拟机应满足以下条件:

    • 恢复虚拟机必须与创建的磁盘位于同一可用区。
    • 恢复虚拟机还应使用 Windows Server 映像
    • 恢复虚拟机的启动磁盘的来源映像应与发生故障的虚拟机启动磁盘的来源映像不同。
  4. 浏览附加磁盘并找到以下文件:

    %SystemRoot%\Memory.dmp
    %SystemRoot%\Minidump\DATE-TIME-NUM.dmp
    

    文件的日期和时间可以帮助您确定可疑实例是否遇到蓝屏错误。这些文件也可以用于分析和诊断。

  5. 可选:删除不再需要的附加资源:

获得蓝屏错误信息并根据需要获取内存转储文件的访问权限后,请按照 Microsoft 提供的诊断步骤和建议执行操作:

许可问题

Windows 操作系统通过连接到密钥管理服务 (KMS) 服务器,每七天续订一次许可。如果您收到有关许可到期的消息或与 Windows 虚拟机上的许可相关的任何其他问题,请执行以下操作:

  1. 确认您的 Windows 虚拟机的 VPC 网络已配置为允许与 KMS 通信

  2. 确认 Windows 防火墙允许与 KMS 服务器建立出站连接:

    • IP 地址:35.190.247.13
    • 端口:1688
    • 协议:TCP

    如需详细了解如何配置 Windows 高级防火墙规则,请参阅创建出站端口规则

  3. 通过运行以下命令,测试与 KMS 服务器的连接成功:

    powershell.exe Test-NetConnection 35.190.247.13 -Port 1688
    
  4. 运行以下命令来确认许可的当前状态,设置 KMS 的服务器 IP 地址,然后强制激活:

    cscript \windows\system32\slmgr.vbs /dlv
    
    cscript \windows\system32\slmgr.vbs /skms 35.190.247.13:1688
    
    cscript \windows\system32\slmgr.vbs /ato
    

排查交互式串行控制台问题

  1. 确保您满足访问串行控制台的要求

  2. 启用紧急管理服务。如果 EMS 已关闭,串行控制台不会接受任何键盘输入,只会显示空白屏幕(闪烁光标)。

    命令提示符

    1. 使用 RDP 连接到虚拟机,并以管理员身份打开 Command Prompt。如果您无法使用 RDP,请将后续步骤作为值添加到 windows-startup-script-cmd 启动键中。

    2. 将全局 EMS 重定向设置设为使用 COM2(波特率 115200),并启用 EMS。

      bcdedit /emssettings EMSPORT:2 EMSBAUDRATE:115200
      bcdedit /ems on
      
    3. 重新启动虚拟机以应用更新后的配置。如果您要使用元数据脚本,请勿添加关停命令。

      shutdown -r -t 0
      

    PowerShell

    1. 通过 RDP 连接,并以管理员身份打开 Powershell。如果您无法使用 RDP,请将后续步骤作为值添加到 windows-startup-script-ps1 启动键中。

    2. 将全局 EMS 重定向设置设为使用 COM2(波特率 115200),并启用 EMS。

      bcdedit /emssettings EMSPORT:2 EMSBAUDRATE:115200
      bcdedit /ems on
      
    3. 重新启动虚拟机以应用更新后的配置。如果您要使用元数据脚本,请勿添加关停命令。

      shutdown -r -t 0
      

后续步骤