Windows 停止错误 - 状态无内存

适用于:✔️ Windows VM

本文提供了解决 Windows 无法启动并显示状态或错误代码 #0xC0000017(也称为“无内存状态”)的问题的步骤。

症状

使用启动诊断查看虚拟机(VM)的屏幕截图时,你将看到屏幕截图显示错误代码: 0xC0000017 根据运行的 Windows 版本,你可能会看到此代码显示在 Windows 启动管理器或恢复屏幕

Windows 引导管理器

Windows 启动管理器中0xC0000017错误代码的屏幕截图。

恢复屏幕

恢复屏幕中0xC0000017错误代码的屏幕截图。

原因

操作系统的磁盘已满、太碎片,或者操作系统(OS)无法访问内存或页面文件,或者两者都无法访问。

解决方案

流程概述

提示

如果 VM 有最近的备份,可以尝试 从备份 还原 VM 以修复启动问题。

  1. 创建并访问修复 VM
  2. 释放磁盘上的空间
  3. 从 BCD 存储中清除错误的内存
  4. 将页面文件还原到其默认位置
  5. 启用串行控制台和内存转储收集
  6. 重新生成 VM

注意

遇到此错误时,来宾操作系统无法正常运行。 需要在脱机模式下进行故障排除来解决此问题。

创建和访问修复 VM

  1. 使用 VM 修复命令的步骤 1-3 来准备一个修复 VM。
  2. 使用远程桌面连接来连接到修复 VM。

对于第 2 代 VM,请向可扩展固件接口(EFI)分区分配一个字母

如果使用第 2 代 VM,则附加磁盘的 EFI 分区可能未向其分配一个字母。 在继续执行此故障排除指南之前,需要遵循以下步骤将字母分配给分区。

  1. 在 Windows 搜索中,输入 diskmgmt 并打开 磁盘管理控制台

  2. 确定附加到修复 VM 的损坏磁盘。 通常,此磁盘在控制台中最后列出,并且具有最高的数值。

  3. 请注意,如果该磁盘中有一个包含 EFI 系统分区的分区,该分区也没有分配给它的字母值(如驱动器 F:)。 如果分配了所有分区,可以跳到前面以释放磁盘上的空间。 否则,请继续为此磁盘分配一个字母。

    磁盘管理窗口的屏幕截图,其中显示了保存 E F I 系统分区的分区。

  4. 以管理员身份打开提升的命令提示符并输入 diskpart 以启动 DISKPART 工具。

  5. 输入以下命令:

    list disk
    sel disk <NUMBER OF THE ATTACHED DISK>
    list partition
    sel partition <NUMBER OF THE SYSTEM (EFI) PARTION>
    assign
    
    • 在命令中,将替换为 <NUMBER OF THE ATTACHED DISK> 在步骤 2 中标识的磁盘编号。
    • 在命令中,替换为 <NUMBER OF THE SYSTEM PARTION> EFI 系统分区的分区号。 此分区尚未分配字母,但它应为 System 类型,大小约为 100MB。

    注意

    将磁盘管理控制台中的分区与 DISKPART 工具中列出的分区进行比较可能有助于确定哪个分区号对应于附加磁盘中的 EFI 系统分区。

  6. 关闭命令提示符窗口。

释放磁盘上的空间

损坏的磁盘已附加到修复 VM 后,应验证该磁盘上的 OS 是否有足够的空间正常运行。

  1. 右键单击附加磁盘的驱动器并选择“属性,检查磁盘是否已满。

  2. 如果磁盘 的可用空间少于 300 Mb, 请使用 PowerShell 将其扩展到最多 1 Tb。

  3. 磁盘大小为 1 Tb 后,需要执行磁盘清理。 可以使用 磁盘清理工具 释放空间。

  4. 打开提升的命令提示符(以管理员身份运行)实例,并在驱动器上执行碎片化:

    defrag <LETTER ASSIGNED TO THE OS DISK>: /u /x /g

    • 根据碎片级别,去碎片可能需要几个小时。
    • 在命令中,替换为 <LETTER ASSIGNED TO THE OS DISK> OS 磁盘的字母(如驱动器 F:)。

从启动配置数据(BCD)存储中清除错误的内存

  1. 打开提升的命令提示符(以管理员身份运行)。

  2. 使用以下命令查询启动配置文件以获取错误的内存标志:

    bcdedit /store <LETTER ASSIGNED TO THE OS DISK>:\boot\bcd /enum {badmemory}

    • 在命令中,替换为 <LETTER ASSIGNED TO THE OS DISK> OS 磁盘的字母(如驱动器 F:)。
  3. 如果查询未显示错误的内存块,请跳到下一个任务。 否则,请继续执行步骤 4。

  4. 如果识别了错误的内存块,这些块将阻止创建 ramdisk,并应使用以下命令删除:

    bcdedit /store <LETTER ASSIGNED TO THE OS DISK>:\boot\bcd /deletevalue {badmemory} badmemorylist

    • 在命令中,替换为 <LETTER ASSIGNED TO THE OS DISK> OS 磁盘的字母(如驱动器 F:)。

将页面文件还原到其默认位置

页面文件存储计算机随机访问内存(RAM)无法保存的数据作为溢出/备份的形式。 该文件可能托管在 VHD 中,而不是临时驱动器,这是默认的 Azure 位置。 如果为 true,则可能无法访问该文件,应还原到默认位置。

在执行任何步骤之前,应在正常运行的 磁盘上创建 \windows\system32\config 文件夹的副本。 此步骤可确保可以撤消任何不需要的更改。 你将处理重要的系统文件,因此强烈建议使用此预防措施。

  1. 在 Windows 搜索中,输入 regedit 并打开注册表编辑器应用程序。

  2. 在注册表编辑器中,突出显示键 HKEY_LOCAL_MACHINE 并从菜单中选择“ 文件 > 加载配置单元...”

    屏幕截图显示了在注册表编辑器中加载 Hive 的步骤。

  3. 在“加载 Hive”对话框中,选择 \windows\system32\config\SYSTEM ,然后单击“打开”。

    1. 系统会提示输入一个名称,应输入 BROKENSYSTEM。 在进行故障排除时,此名称有助于区分受影响的 Hives。
    2. 展开 HKEY_LOCAL_MACHINE 以查看已添加的新 BROKENSYSTEM 密钥。
  4. 使用注册表编辑器,确定从中启动计算机的 ControlSet。

    1. 导航到 HKEY_LOCAL_MACHINE >> BROKENSYSTEM >> Select
    2. 在列出的键中,记下 Current 的数据值。 例如,如果此值为 10x00000001 (1),则控件集为 ControlSet001。
  5. 检查配置 PageFile 创建的位置。

    1. 在 HKEY_LOCAL_MACHINE\BROKENSYSTEM 中,展开与步骤 4 中标识的 ControlSet 编号匹配的目录,例如 ControlSet001
    2. 导航到控制会话管理器>>内存管理并记下 ExistingPageFiles 密钥的位置>>。
    3. 此密钥应位于临时驱动器的默认 Azure 位置。 如果它不存在,并且位于另一个位置(例如数据磁盘驱动器或 OS 驱动器)的 VHD 中,则需要将其删除。
    4. 浏览到文件资源管理器中的该位置,然后删除pagefile.sys文件。

启用串行控制台和内存转储收集

建议:在重新生成 VM 之前,请按照以下步骤启用串行控制台和内存转储收集:

  1. 以管理员身份打开提升的命令提示符会话。

  2. 使用 /ems 和 /emssettings 选项运行以下 BCDEdit 命令:

    启用串行控制台:

    bcdedit /store <volume-letter-containing-the-bcd-folder>:\boot\bcd /ems {<boot-loader-identifier>} ON
    bcdedit /store <volume-letter-containing-the-bcd-folder>:\boot\bcd /emssettings EMSPORT:1 EMSBAUDRATE:115200
    
  3. 验 OS 磁盘上的可用空间是否大于 VM 上的内存大小 (RAM)。

    如果 OS 磁盘上没有足够的空间,请更改创建内存转储文件的位置,并将该位置引用附加到 VM 且有足够的可用空间的任何数据磁盘。 若要更改位置,请替换为 %SystemRoot% 数据磁盘的驱动器号,如 F:以下命令中的驱动器号。

    若要启用 OS 转储文件,请运行以下 加载添加卸载 命令,以使用 reg 工具实现建议的配置:

    从损坏的 OS 磁盘加载注册表配置单元:

    reg load HKLM\<broken-system> <volume-letter-of-broken-os-disk>:\windows\system32\config\SYSTEM
    

    在 ControlSet001 上启用:

    reg add "HKLM\<broken-system>\ControlSet001\Control\CrashControl" /v CrashDumpEnabled /t REG_DWORD /d 1 /f
    reg add "HKLM\<broken-system>\ControlSet001\Control\CrashControl" /v DumpFile /t REG_EXPAND_SZ /d "%SystemRoot%\MEMORY.DMP" /f
    reg add "HKLM\<broken-system>\ControlSet001\Control\CrashControl" /v NMICrashDump /t REG_DWORD /d 1 /f
    

    在 ControlSet002 上启用:

    reg add "HKLM\<broken-system>\ControlSet002\Control\CrashControl" /v CrashDumpEnabled /t REG_DWORD /d 1 /f
    reg add "HKLM\<broken-system>\ControlSet002\Control\CrashControl" /v DumpFile /t REG_EXPAND_SZ /d "%SystemRoot%\MEMORY.DMP" /f
    reg add "HKLM\<broken-system>\ControlSet002\Control\CrashControl" /v NMICrashDump /t REG_DWORD /d 1 /f
    

    卸载损坏的 OS 磁盘:

    reg unload HKLM\<broken-system>
    

重新生成 VM

使用 VM 修复命令的步骤 5 重新生成 VM。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区