Windows 停止错误0xC0000102状态文件已损坏

本文提供了解决 Windows 操作系统 (OS) 遇到停止错误0xC0000102(导致 Azure 虚拟机 (VM) 无法启动)的问题的步骤。

症状

使用启动诊断查看 VM 的屏幕截图时,屏幕截图显示操作系统在启动过程中遇到错误代码0xC0000102的消息。

屏幕截图显示了有关错误0xC0000102的详细信息。

CMD 屏幕上出现错误0xC0000102。

原因

错误0xC0000102是STATUS_FILE_CORRUPT_ERROR,这意味着损坏的文件正在阻止 VM 正确启动。 出现此错误代码的可能原因有两种:

  • 错误消息中显示的文件已损坏。
  • 磁盘结构已损坏且不可读。

解决方案

尝试从备份还原 VM

如果最近备份了 VM,可以尝试 从备份还原 VM 以修复启动问题。 如果无法从备份还原 VM,请执行以下步骤:

  1. 创建和访问修复 VM
  2. 修复或替换损坏的文件
  3. 启用串行控制台和内存转储收集
  4. 重新生成 VM

注意

遇到此错误时,来宾 OS 无法正常运行。 你将在脱机模式下进行故障排除以解决此问题。

步骤 1:创建和访问修复 VM

  1. 按照 VM 修复过程示例 的步骤 1-3 准备修复 VM。
  2. 使用远程桌面连接连接到修复 VM。

步骤 2:修复或替换损坏的文件

  • 修复损坏的文件

    打开提升的 CMD 提示符并在磁盘上运行 chkdsk

    chkdsk <<DRIVE LETTER>: /F
    
  • 替换损坏的文件

  1. 使用启动诊断查看 VM 的屏幕截图。 请注意错误中显示的文件。

  2. 若要替换损坏的二进制文件,请执行以下步骤:

    1. 浏览到屏幕截图中显示的二进制文件的位置。

    2. 请注意文件的版本。 (右键单击“ 属性 ”,然后选择“ 详细信息 ”选项卡。)

      屏幕截图显示“详细信息”选项卡下的信息。突出显示了文件版本。

    3. 将文件重命名为 <FILENAME。EXT>。老。 例如,上图中显示的文件将从 \windows\system32\drivers\cng.sys 重命名为 \windows\system32\drivers\cng.sys.old

  3. 从内部存储库还原此文件。

    1. 启动 CMD 会话并找到包含 Windows 目录的卷。

    2. 浏览到 \windows\winsxs 并搜索屏幕截图中显示的二进制文件:

      dir <<binary from the screenshot with extension>> /s
      
    3. 以下命令将列出 VM 包含的指定文件的所有不同版本,并提供该组件的路径历史记录。 应从列表中选择同一版本的最新版本,并继续将该文件复制到屏幕截图中所述的文件夹路径。

      copy
      
      <<drive>>:\Windows\WinSxS\<<directory_where_file_is>>\<<binary_with_extension>> <<drive>>:\Windows\System32\Drivers\ 
      

步骤 3:启用串行控制台和内存转储收集

在重新生成 VM 之前,建议启用内存转储收集和串行控制台。 为此,请运行以下脚本:

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

  2. 列出 BCD 存储数据并确定启动加载程序标识符,下一步将使用该标识符。

    1. 对于 第 1 代 VM,请输入以下命令并记下列出的标识符:

      bcdedit /store <BOOT PARTITON>:\boot\bcd /enum
      

      在 命令中,将 替换为 <BOOT PARTITON> 包含启动文件夹的附加磁盘中分区的字母。

      屏幕截图显示第 1 代 VM 中列出 BCD 存储的输出,其中列出了 Windows 启动加载程序 下的标识符编号。

    2. 对于 第 2 代 VM,请输入以下命令并记下列出的标识符:

      BCDEDIT /store <LETTER OF THE EFI SYSTEM PARTITION>:EFI\Microsoft\boot\bcd /enum 
      
      • 在 命令中,将 替换为 <LETTER OF THE EFI SYSTEM PARTITION> EFI 系统分区的字母。
      • 启动磁盘管理控制台以识别标记为 EFI 系统分区的相应 系统分区可能会有所帮助。
      • 标识符可以是唯一 GUID,也可以是默认 bootmgr
  3. 运行以下命令以启用串行控制台:

    BCDEDIT /store <VOLUME LETTER WHERE THE BCD FOLDER IS>:\boot\bcd /ems {<BOOT LOADER IDENTIFIER>} ON  
    BCDEDIT /store <VOLUME LETTER WHERE THE BCD FOLDER IS>:\boot\bcd /emssettings EMSPORT:1 EMSBAUDRATE:115200 
    
    • 在 命令中,将 替换为 <VOLUME LETTER WHERE THE BCD FOLDER IS> BCD 文件夹的字母。
    • 在 命令中,将 替换为 <BOOT LOADER IDENTIFIER> 在上一步中找到的标识符。
  4. 验证 OS 磁盘上的可用空间是否大于 VM 上的内存大小 (RAM) 。

    1. 如果 OS 磁盘上没有足够的空间,则应更改创建内存转储文件的位置。 可以将其引用附加到 VM 并具有足够可用空间的任何其他数据磁盘,而不是在 OS 磁盘上创建文件。 若要更改位置,请将 %SystemRoot% 替换为驱动器号 (例如,下面列出的命令中 F:) 数据磁盘。
    2. 输入以下命令 (建议的转储配置) :

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

    REG LOAD HKLM\BROKENSYSTEM <VOLUME LETTER OF BROKEN OS DISK>:\windows\system32\config\SYSTEM
    

    在 ControlSet001 上启用:

    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\CrashControl" /v CrashDumpEnabled /t REG_DWORD /d 1 /f 
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\CrashControl" /v DumpFile /t REG_EXPAND_SZ /d "%SystemRoot%\MEMORY.DMP" /f 
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\CrashControl" /v NMICrashDump /t REG_DWORD /d 1 /f 
    

    在 ControlSet002 上启用:

    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\CrashControl" /v CrashDumpEnabled /t REG_DWORD /d 1 /f 
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\CrashControl" /v DumpFile /t REG_EXPAND_SZ /d "%SystemRoot%\MEMORY.DMP" /f 
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\CrashControl" /v NMICrashDump /t REG_DWORD /d 1 /f 
    

    卸载损坏的 OS 磁盘:

    REG UNLOAD HKLM\BROKENSYSTEM
    

步骤 4:重新生成 VM

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

联系我们寻求帮助

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