在阿里云ECS控制台对Windows实例执行跨代变配操作后,实例启动时出现“INACCESSIBLE_BOOT_DEVICE”蓝屏错误,导致无法进入操作系统。出现该问题,可参考本文解决。
问题描述
触发条件
对Windows系统的ECS实例执行跨实例规格族(跨代)的变配操作,例如从 ecs.g7
(VirtIO-SCSI) 变配到 ecs.g8i
(NVMe)。
故障现象
实例在ECS控制台启动后,无法通过远程桌面连接(RDP)访问。通过VNC远程连接登录实例,观察到操作系统在引导过程中蓝屏,并提示Stop Code: (INACCESSIBLE_BOOT_DEVICE)
报错截图
根本原因
Windows操作系统为了优化启动速度,在正常启动时仅会加载当前硬件环境所需的关键驱动程序。
当ECS实例进行跨代变配时,其底层存储硬件的接口协议可能发生变化。
例如:从ecs.g7
升配到ecs.g8i
(底层存储驱动从VirtIO-SCSI
切换为NVMe
),变配规格后,操作系统在引导阶段依然尝试加载旧的存储驱动(viostor.sys
),但此时硬件已变为NVMe
接口,导致无法识别和访问系统盘,最终因找不到可引导设备而触发INACCESSIBLE_BOOT_DEVICE
蓝屏错误。
应急预案
此预案旨在以最快速度恢复业务访问,而非根治问题。
若需快速恢复业务系统,可先变配回原来的规格。
故障解决方案
方案一:进入安全模式自动修复(推荐)
此方案利用Windows安全模式自动加载通用驱动的特性,自动修复驱动问题。
在执行修复操作前,请务必为实例创建快照,以防操作失败导致数据丢失。
操作步骤
通过VNC登录故障实例。实例在两次启动失败后,会自动进入如图所示修复界面,在此界面选择疑难解答,进入高级选项界面。
在高级选项界面,选择启动设置。
在启动设置界面,点击重启。
实例重启后将进入高级启动选项菜单,选择网络安全模式并按
Enter
,等待系统加载进入安全模式。根据界面提示登录系统,进入安全模式桌面。此时会自动加载并注册新的存储驱动。
在控制台重启实例后,重新通过VNC登录实例。 若实例正常启动并进入Windows桌面,证明问题已解决。
方案二:通过修复模式离线编辑注册表
此方案通过Windows修复环境中的命令行工具,离线修改注册表以强制加载存储驱动。
在执行修复操作前,请务必为实例创建快照,以防操作失败导致数据丢失。
操作步骤
通过VNC登录故障实例,实例在两次启动失败后,会自动进入如图所示修复界面,选择疑难解答进入高级选项界面。
选择命令提示符。
选择具有管理员权限的账户(默认adminitrator)并输入密码,进入命令提示符环境。
在命令提示符窗口中,输入
regedit
并按回车键,打开注册表编辑器。选中
HKEY_LOCAL_MACHINE
后,依次选择菜单栏的在弹出的文件选择对话框中,导航至系统盘的注册表文件路径,通常为
C:\Windows\System32\config\SYSTEM
,并点击打开。在加载配置单元对话框中,为加载的配置单元指定一个临时的项名称,例如
OfflineSYSTEM
,然后点击确定。展开
HKEY_LOCAL_MACHINE\OfflineSYSTEM\Select
,查看Default
键的值(例如为1
),确定当前的控制集为ControlSet001
。依次找到以下三个注册表路径,请右键单击并选择删除。若不存在对应的路径请忽略。
HKEY_LOCAL_MACHINE\OfflineSYSTEM\ControlSet001\Services\AliNVMe\StartOverride HKEY_LOCAL_MACHINE\OfflineSYSTEM\ControlSet001\Services\stornvme\StartOverride HKEY_LOCAL_MACHINE\OfflineSYSTEM\ControlSet001\Services\viostor\StartOverride
选中之前加载的
OfflineSYSTEM
项,依次选择菜单栏的 ,确认卸载。关闭注册表编辑器和命令提示符窗口,返回到选项界面,选择继续,等待系统重启。
预期结果: 实例正常重启并进入Windows登录界面。
方案三:通过挂载系统盘离线编辑注册表
此方案通过将故障实例的系统盘挂载到一台正常的辅助实例上进行注册表修复。
在执行修复操作前,请务必为实例创建快照,以防操作失败导致数据丢失。
操作步骤
准备一台正常运行的Windows实例(辅助实例),要求如下:
不同镜像:辅助实例的镜像不能与故障实例相同。
相同可用区:辅助实例必须和故障实例在同一可用区。
使用Workbench终端连接登录辅助实例,按
Win+R
输入diskmgmt.msc
并按Enter
键,进入磁盘管理,右键新挂载的磁盘,单击联机。按
Win+R
输入regedit
并按Enter
键,进入注册表编辑器。选中
HKEY_LOCAL_MACHINE
后,依次选择菜单栏的在弹出的对话框中,导航至新挂载系统盘的注册表文件路径,并点击打开。
例如新挂载的系统盘盘符为D,则注册表文件路径为
D:\Windows\System32\config\SYSTEM
。在加载配置单元对话框中,为加载的配置单元指定一个临时的项名称,例如
OfflineSYSTEM
,然后点击确定。展开
HKEY_LOCAL_MACHINE\OfflineSYSTEM\Select
,查看Default
键的值(例如为1
),确定当前的控制集为ControlSet001
。依次找到以下三个注册表路径,请右键单击并选择删除。若不存在对应的路径请忽略。
HKEY_LOCAL_MACHINE\OfflineSYSTEM\ControlSet001\Services\AliNVMe\StartOverride HKEY_LOCAL_MACHINE\OfflineSYSTEM\ControlSet001\Services\stornvme\StartOverride HKEY_LOCAL_MACHINE\OfflineSYSTEM\ControlSet001\Services\viostor\StartOverride
选中之前加载的
OfflineSYSTEM
项,依次选择菜单栏的 ,确认卸载后退出注册表编辑器。按
Win+R
输入diskmgmt.msc
并按Enter
键,进入磁盘管理,右键新挂载的磁盘,单击脱机。重启故障实例后,通过VNC登录实例。
预期结果: 实例正常重启并进入Windows登录界面。
预防措施
为从根本上规避此类问题,在对Windows实例进行跨代变配操作之前,务必执行以下预处理操作,强制系统在下次启动时加载所有可用的存储驱动。
在执行修复操作前,请务必为实例创建快照,以防操作失败导致数据丢失。
控制台(云助手批量执行命令)
在ECS控制台-云助手。创建一条PowerShell类型的命令。
将以下三条命令粘贴到命令内容中。
reg delete HKLM\SYSTEM\CurrentControlSet\Services\stornvme\StartOverride /f reg delete HKLM\SYSTEM\CurrentControlSet\Services\AliNVMe\StartOverride /f reg delete HKLM\SYSTEM\CurrentControlSet\Services\viostor\StartOverride /f
选择计划变配的实例后单击执行。忽略任何“找不到”的错误提示。
命令执行成功后,即可在ECS控制台对实例执行变配操作。
实例内(手动执行命令)
登录到计划变配的Windows实例。
按
Win+R
输入powershell
并按Enter
键,打开PowerShell
。执行以下命令,删除相关注册表信息。忽略任何“找不到”的错误提示。
reg delete HKLM\SYSTEM\CurrentControlSet\Services\stornvme\StartOverride /f reg delete HKLM\SYSTEM\CurrentControlSet\Services\AliNVMe\StartOverride /f reg delete HKLM\SYSTEM\CurrentControlSet\Services\viostor\StartOverride /f
命令执行成功后,即可在ECS控制台对该实例执行变配操作。
实例内(使用云助手插件)
登录到计划变配的Windows实例。
按
Win+R
输入powershell
并按Enter
键,打开PowerShell
。执行以下命令,切换到云助手所在路径并删除相关注册表信息。忽略任何“找不到”的错误提示。
cd (Get-ChildItem "C:\ProgramData\aliyun\assist\" -Directory | Where-Object { $_.Name -match '^\d+(\.\d+){2,3}$' } | Sort-Object { [version]$_.Name } -Descending | Select-Object -First 1).FullName ./acs-plugin-manager.exe -e -P ACS-ECS-ScsiNvmeBootfix
命令执行成功后,即可在ECS控制台对实例执行变配操作。