从快照创建的 Windows Server 2012 VM 无法在 GCE 上启动



我不是Windows专家,在从快照中恢复Windows Server 2012时陷入困境。我正在尝试在谷歌计算引擎上创建一个新的虚拟机实例 - GCE从我几周前从Windows Server 2012 VM实例创建的快照。每当我创建一个新的虚拟机时,我永远无法执行RDP,然后在阅读GCE故障排除指南后,我确定可能是Windows无法正常启动。我能够查看如下串行端口输出

SeaBIOS (version 1.8.2-20161003_105447-google)
Total RAM Size = 0x00000003c0000000 = 15360 MiB
CPUs found: 4     Max CPUs supported: 4
found virtio-scsi at 0:3
virtio-scsi vendor='Google' product='PersistentDisk' rev='1' type=0 removable=0
virtio-scsi blksize=512 sectors=314572800 = 153600 MiB
drive 0x000f3120: PCHS=0/0/0 translation=lba LCHS=1024/255/63 s=314572800
Booting from Hard Disk 0...

它卡在从硬盘 0 启动

...我进一步深入研究并阅读串行端口 2 日志,如下所示

Windows Boot Manager
Windows failed to start. A recent hardware or software change might be the cause. To fix the problem: 
Insert your Windows installation disc and restart your computer.
Choose your language settings, and then click "Next."
Click "Repair your computer.
If you do not have this disc, contact your system administrator or computer manufacturer for assistance. 
Status: 
A required device isn't connected or can't be accessed.  

我将磁盘连接到另一台计算机,我可以看到磁盘上的所有文件。但不能修改任何东西,因为磁盘是写保护的。

我从中创建快照的原始 VM 仍然存在,因此我尝试将快照作为启动磁盘附加到原始 VM 实例,以便具有相同的硬件配置,但我无法分离与该实例关联的磁盘,它给了我以下错误。

Hot-remove of the root disk is not supported.

我尝试使用与拍摄快照之前相同的计算机类型创建 VM。但也失败了。

关于如何从快照创建新的虚拟机实例并正确启动 Windows 的任何建议?

在浏览了大量文章、论坛和用户指南之后,我终于能够从快照成功旋转 Windows VM 实例。

问题出在引导加载程序和引导配置数据 (BCD) 上。理想情况下,将映像用于 OS 磁盘。就我而言,操作系统和数据位于同一磁盘中,我们只有一个快照。GCE允许从快照创建新的虚拟机实例,但就我而言,实例没有启动。

按照分步指南从快照中恢复操作系统/数据。

总结:

从快照创建磁盘,并使用新的临时 VM 实例修复磁盘 BCD。

详细步骤

步骤 1:创建恢复 VM 实例并启动它

此实例是临时实例,您可以在恢复操作系统/数据后将其删除。

从谷歌云控制台

选择"计算引擎">"VM实例",然后选择"创建实例">

确保选择与快照相同的操作系统。启动后,请确保可以执行远程桌面并登录到新的 VM 实例。

记下实例名称和运行实例的区域。

步骤 2:从快照创建新磁盘

从谷歌云控制台

选择"计算引擎">"磁盘",然后选择"创建磁盘

"确保选择与拍摄快照时/之前相同的磁盘大小/磁盘类型,否则 Windows 可能会引发启动错误。此外,请确保磁盘与恢复实例位于同一区域中。如果您的磁盘与实例中的磁盘不在同一区域中,则您将无法附加它。

步骤 3:将磁盘附加到恢复实例

在此步骤中,将磁盘(在步骤 2 中创建)附加到 VM 实例(在步骤 1 中创建)

打开 Google Cloud Shell 并键入以下命令

gcloud compute instances attach-disk [INSTANCE-NAME] --disk [DISK-NAME] --zone [ZONE]

将变量替换为运行实例的实例名称、磁盘名称和区域。

步骤 4:在 Windows 中装载磁盘并分配驱动器号

转到"搜索开始">键入diskmgmt.msc以打开磁盘管理工具。如果您刚刚连接的磁盘显示为">脱机",请右键单击它并选择"联机"。

确保磁盘处于联机状态后,验证磁盘上的每个卷是否分配了驱动器号。分配的特定驱动器号并不重要。如果任何卷没有驱动器号分配,请右键单击该卷并选择"更改驱动器号和路径",然后选择"添加"。 选择"分配以下驱动器号",让它选择下一个可用的驱动器号,然后单击"确定"。同样,实际使用的驱动器号无关紧要。

记下驱动器号。对我来说,它的D:驱动器。

步骤 6:从磁盘中删除写保护

尝试在连接的驱动器中创建新文件夹。如果您的磁盘是写保护的,并且您无法在驱动器中创建任何文件或文件夹,则需要关闭写保护,否则您可以跳过此步骤。

打开提升的命令提示符(以管理员身份运行)并键入

diskpart 

你会得到磁盘部分>提示

类型:

list volume 

系统将显示所有带编号的卷。接下来,您需要通过键入来选择卷:

select volume # 

其中 # 是卷号。对我来说是1。

然后键入以下命令删除写保护

attr disk clear readonly 
attr volume clear readonly
attr volume clear hidden
attr volume clear shadowcopy

通过键入退出或关闭命令提示符窗口退出磁盘部分。在 Windows 资源管理器中打开驱动器。您应该能够看到所有数据和Windows系统文件。在驱动器中创建一个新文件夹,以确保磁盘没有写保护。

步骤 7:修复启动配置数据 (BCD)

如果您熟悉Windows bcedit命令,那么请务必使用bcedit,但我使用EasyBCD来修复启动配置数据。

从 https://neosmart.net/EasyBCD 下载并在恢复虚拟机实例上安装 EasyBCD

安装后,打开 EasyBCD 并单击

文件> 选择 BCD 存储

和文件名下的文件选择对话框,输入D:\Boot\BCD或您在步骤 5 中分配的任何驱动器号。系统将显示驱动器的引导配置数据。

单击编辑启动菜单按钮,然后选择跳过启动菜单,然后单击保存设置

单击高级设置按钮,然后在基本选项卡下单击驱动器:菜单,然后选择磁盘的驱动器号。

请注意:驱动器号应与步骤5相同

单击">BCD 备份/修复"按钮,然后在BCD 管理选项下选择">重新创建/修复启动文件",然后单击">执行操作"按钮。

通过再次打开"磁盘管理"并使磁盘脱机,然后右键单击磁盘并选择"脱机",使磁盘脱机。

现在最小化您的RDP窗口,并在Google Cloud Shell中键入以下命令以将磁盘与恢复实例分离

gcloud compute instances detach-disk [INSTANCE-NAME] --disk [DISK-NAME] --zone [ZONE]

现在,您已经修复了从快照创建的磁盘的引导配置数据。

现在,我们已准备好旋转 VM 实例并使用此磁盘启动它。让我们从磁盘创建实例

步骤 8:创建新的 VM 实例

在 Google Cloud Console 中,选择">计算引擎">"VM实例",然后选择"创建实例">

为了避免在首次运行时出现任何问题,请确保选择与创建快照时/之前相同的计算机类型

此时,您应该能够拥有有效的 VM 实例,并且应该能够执行 RDP 登录。

如果您仍然遇到任何问题,请通过单击Google Cloud Console中的VM实例来查看您的串行端口日志,然后向下滚动到页面底部,或者您可以在Google Cloud Shell中键入以下命令。

gcloud compute instances get-serial-port-output [INSTANCE-NAME] --zone [ZONE]

吸取的教训

  • 对于有/没有数据的 OS 磁盘,请使用映像而不是快照。
  • 不要将数据保存在与操作系统相同的磁盘中,即使它是测试计算机并且您正在执行一些临时工作。

感谢您的详细回答。这里的关键问题是,当您拍摄 VSS 启动的快照时,Windows 会将卷标记为只读/快照。GCE 永久磁盘快照将保留该标志。所有数据都是正确且一致的。您需要做的就是删除该标志,如步骤1-步骤6所示。

对步骤7的小建议。您可以简单地使用内置工具 bcdboot.exe 来修复它。

bcdboot.exe D:\Windows/s D:

(BCD Hive其实没问题,但是,当您手动在线磁盘时,MBR中的磁盘签名是由Windows修改的。这就是为什么我们需要在这里运行命令以使其恢复与引导数据库一致)。

@Shaheryar的答案太棒了!!如果需要自动执行某些步骤/编写脚本,可以使用以下内容:

步骤 4 和 6

磁盘可以联机,并通过将以下内容放入mount.txt文件中来清除读取标志:

rem This script is mean to be run with diskpart /s mount.txt
rem It mounts the snapshot volume to D:/ and makes it writeable
list disk
rem The snapshot disk should be on disk #1
rem Use `list disk` to find it if it changed - also update unmount.txt
select disk 1
online disk
rem The partition should be on volume #2
rem Use `list volume` to find it if it changed - also update unmount.txt
select volume 2
assign letter=D
attr disk clear readonly
attr volume clear readonly
attr volume clear hidden
attr volume clear shadowcopy
exit

在管理控制台/命令行管理程序中,使用

diskpart /s mount.txt

步骤 7

修复 BCD 的 GUI 步骤可以在管理员 Powershell 会话中替换为以下命令:

attrib -h -s D:BootBCD
Remove-Item -Path D:BootBCD
# Recreate BCD
bcdedit.exe /createstore D:BootBCD
bcdedit.exe /store D:BootBCD /create "{bootmgr}" /d "Windows Boot Manager"
bcdedit.exe /store D:BootBCD /set "{bootmgr}" device partition=D:
bcdedit.exe /store D:BootBCD /set "{bootmgr}" displaybootmenu No
bcdedit.exe /store D:BootBCD /timeout 0
$out = bcdedit.exe /store D:BootBCD /create /d "Microsoft Server" /application osloader
$id = Select-String -Input $out -Pattern '{.+}'  -AllMatches | % { $_.Matches } | % { $_.Value }
# Output from above
bcdedit.exe /store D:BootBCD /set "$id" device partition=D:
bcdedit.exe /store D:BootBCD /set "$id" osdevice partition=D:
bcdedit.exe /store D:BootBCD /set "$id" path Windowssystem32winload.exe
bcdedit.exe /store D:BootBCD /set "$id" systemroot Windows
bcdedit.exe /store D:BootBCD /set "$id" nx OptOut
bcdedit.exe /store D:BootBCD /set "$id" allowedinmemorysettings 0x15000075
bcdedit.exe /store D:BootBCD /set "$id" inherit "{6efb52bf-1766-41db-a6b3-0ee5eff72bd7}"
bcdedit.exe /store D:BootBCD /set "$id" resumeobject "{45e743a4-934e-11e9-a872-8c17a054efa7}"
bcdedit.exe /store D:BootBCD /displayorder "$id"
# Print result
bcdedit.exe /store D:BootBCD /enum /v

这些步骤是从EasyBCD的创建者那里采用的。通过反复试验发现缺少的步骤,以匹配 EasyBCD GUI 将创建的结果文件。

缺少卸载步骤

您可能还希望在分离卷之前卸载该卷。这可以通过将以下内容放入unmount.txt文件中来完成:

rem This script unmounts the snapshot after its bootloader has been fixed
rem See mount.txt for why volume 2
select volume 2
remove
rem See mount.txt for why disk 1
select disk 1
offline disk
exit

最后,使用管理控制台/外壳运行它

diskpart /s mount.txt

最新更新