Hyper-V 2012 R2虚拟机上的INACCESSIBLE_BOOT_DEVICE

我有一个Hyper-V 2012 R2集群,通过FC连接连接到Dell PowerVault MD3600F存储arrays的4个Dell PowerEdge R620服务器; 所有的服务器都运行WS2012R2,几个月前新build了集群,所有的驱动程序和固件都是最新的,Windows被更新到最新的可用补丁(甚至是两天前发布的补丁)。 还有一个SCVMM 2012 R2服务器pipe理整个事情,但这对于手头的问题似乎并不重要。

在这个集群上运行着几个虚拟机。 其中一些是运行Windows Server 2008 R2的第一代虚拟机,而其中大多数是运行Windows Server 2012 R2的第二代虚拟机; 这些也包括最新的可用更新; 他们实际上是从集群后面build立的一个模板中部署的,并且在微软发布新的补丁时定期更新。

一切运作良好,但有时(即没有明显的原因或原因)虚拟机将无法启动,与可怕的INACCESSIBLE_BOOT_DEVICE错误代码崩溃; 这只会在启动(或重新启动)时发生:没有虚拟机运行时崩溃。

每当发生这种情况时,就再也无法使虚拟机启动了。 这是两周前第一次发生了一个没有运行任何生产工作量的虚拟机(刚刚部署)。 我们很急着要把它运用起来,因此我们只是简单地抓了一下,然后部署了一个新的; 但没有find问题的根本原因。

然后两天前又发生了,当我们重新安装了几个虚拟机之后, 其中三个没有回来,而其他一些没有任何问题。

即使在安全模式下,故障虚拟机也无法启动; 但是,启动到Windows恢复环境(从系统本身,从本地(虚拟)磁盘,而不是从Windows DVD启动到Windows恢复环境,这意味着虚拟磁盘确实可以访问),似乎一切正常:启动pipe理器正确列出要引导的系统( bcdedit /enum all /v的输出实际上与正在工作的虚拟机相同),所有卷都可以访问,甚至chkdsk不会显示任何错误。 唯一的bootrec /scanos是,在运行bootrec /scanosbootrec /rebuildbcd ,该工具说无法find任何Windows安装(尽pipeC:卷在那里,而且是完全可读的)。

这只发生在WS2012R2第二代虚拟机(至less目前为止),因此我假设它是由EFI仿真和/或EFI引导加载程序中的一些问题引起的; 然而,这只是我的一个假设。

我提到更新的原因是因为我知道这是以前发生的 , KB2919355是负责的; 此外,微软最近还发布了另一个超级更新KB3000850 ,这也适用于主机,虚拟机和WS2012R2模板。

(巧合的是,在这次更新发布后的第二天,微软在整个Azure云平台上遭遇了全球性的崩溃,这个平台与我们的集群发生了一些惊人的相似之处,但我只是在这里猜测)。

我已经向微软提出了一个支持案例,但是我也在这里张贴,也许有人可以帮忙; 当然,如果微软提供了一个解决scheme,我会尽快将虚拟机重新联机。

我们将问题升级到了Microsoft Premier Support,并得到了内核debugging专家的帮助。 他发现从guest虚拟机中卸载了所有的Hyper-V驱动程序,从而导致它们完全无法启动; 他设法通过在VM的文件系统和registry中手动注入驱动程序来启动其中的一个,并且我们能够找回一些关键数据(这是一个证书颁发机构)。 然而,虚拟机现在处于完全不受支持的状态,因此我们决定重build它。 我们还重build了所有其他虚拟机,这些虚拟机没有关键数据。

至于究竟什么导致司机卸货,案件仍然开放,原因尚未查明; 这个问题在我们使用的模板中是潜在的,因为它迟早会影响已经使用该模板部署的所有虚拟机; 我们又build了一个模板,这个模板没有显示出同样的问题,所以我们现在运行的很好,但是我们还是不知道是什么原因造成了这个问题。


更新:

过了一会儿,我们终于find了发生了什么(我只是忘记更新这个答案之前)。

看起来好像某人或某事强行更新了基本模板中的Hyper-V Integration Services,而这些基础模板已经拥有基于主机的完全相同的OS版本的Hyper-V Integration Services; 这在客人系统中造成了潜在的问题,那些司机将被标记为重复和/或被取代,因此需要被移除; 但是这个事件只会在Windows执行一些周期性的自动清理过程之后的可变时间间隔之后触发。 这最终导致从该模板实例化的每个虚拟机上的所有Hyper-V驱动程序的完全卸载,使其完全无法启动。

至于执行此更新的人员或内容(无法通过插入Integration Services安装磁盘并运行其设置,因为安装程序正确检测到驱动程序已安装并退出),我们仍然无从得知。 无论是谁应该知道更好的人做手动使用PowerShell或DISM ,或SCVMM是罪魁祸首。

导出VM并连接到单独的Hyper-V主机中

在新的Hyper v主机启动这个虚拟机然后启动并检查一切工作正常或不?

我们在这个案例中取得了成功。

尝试。