Google compute engine 从快照创建的Windows Server 2012虚拟机无法在GCE上启动

Google compute engine 从快照创建的Windows Server 2012虚拟机无法在GCE上启动,google-compute-engine,windows-server-2012,Google Compute Engine,Windows Server 2012,我不是Windows专家,在从快照恢复Windows Server 2012时陷入困境。我正试图在Google Compute Engine上创建一个新的虚拟机实例——GCE,它来自我在几周前从Windows Server 2012虚拟机实例创建的快照。每当我创建一个新的虚拟机时,我永远无法执行RDP,然后在阅读GCE故障排除指南后,我确定可能是Windows没有正确启动。我可以查看串行端口输出,如下所示 SeaBIOS (version 1.8.2-20161003_105447-google

我不是Windows专家,在从快照恢复Windows Server 2012时陷入困境。我正试图在Google Compute Engine上创建一个新的虚拟机实例——GCE,它来自我在几周前从Windows Server 2012虚拟机实例创建的快照。每当我创建一个新的虚拟机时,我永远无法执行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...
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.  
它在从硬盘0引导时卡住了…

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

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...
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。但也失败了


关于如何从快照创建新VM实例并正确引导Windows,有什么建议吗?

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

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

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

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

详细步骤 步骤1:创建恢复VM实例并启动它 此实例是临时实例,您可以在恢复操作系统/数据后将其删除

从谷歌云控制台

选择计算引擎>虚拟机实例并选择创建实例

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

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

步骤2:从快照创建新磁盘 从谷歌云控制台

选择计算引擎>磁盘并选择创建磁盘

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

步骤3:将磁盘连接到恢复实例 在此步骤中,将您(在步骤2中创建的)磁盘连接到VM实例(在步骤1中创建的)

打开GoogleCloudShell并键入以下命令

gcloud compute instances attach-disk [INSTANCE-NAME] --disk [DISK-NAME] --zone [ZONE]
用实例名、磁盘名和运行实例的区域替换变量

步骤4:在Windows中装入磁盘并分配驱动器号 转到开始>搜索并键入diskmgmt.msc打开磁盘管理工具。如果您刚刚连接的磁盘显示为脱机,请右键单击它并选择联机

确保磁盘联机后,请验证磁盘上的每个卷都已分配驱动器号。指定的特定驱动器号并不重要。如果任何卷没有驱动器号分配,请右键单击该卷并选择更改驱动器号和路径,然后添加。选择“分配以下驱动器号”,让它选择下一个可用驱动器号,然后单击“确定”。同样,实际使用的驱动器号并不重要

记下驱动器号。对我来说是D:开车

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

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

diskpart 
您将得到DISKPART>prompt

类型:

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

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

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

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

步骤7:修复启动配置数据(BCD) 如果您熟悉Windows bcedit命令,那么请务必使用bcedit,但我使用了EasyBCD来修复启动配置数据

从下载并在恢复VM实例上安装EasyBCD

安装后,打开EasyBCD并单击

文件>选择BCD存储

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

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

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

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

单击BCD备份/修复按钮,在BCD管理选项下选择重新创建/修复启动文件,然后单击
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
attrib -h -s D:\Boot\BCD
Remove-Item -Path D:\Boot\BCD

# Recreate BCD
bcdedit.exe /createstore D:\Boot\BCD
bcdedit.exe /store D:\Boot\BCD /create "{bootmgr}" /d "Windows Boot Manager"
bcdedit.exe /store D:\Boot\BCD /set "{bootmgr}" device partition=D:
bcdedit.exe /store D:\Boot\BCD /set "{bootmgr}" displaybootmenu No
bcdedit.exe /store D:\Boot\BCD /timeout 0

$out = bcdedit.exe /store D:\Boot\BCD /create /d "Microsoft Server" /application osloader
$id = Select-String -Input $out -Pattern '{.+}'  -AllMatches | % { $_.Matches } | % { $_.Value }

# Output from above
bcdedit.exe /store D:\Boot\BCD /set "$id" device partition=D:
bcdedit.exe /store D:\Boot\BCD /set "$id" osdevice partition=D:
bcdedit.exe /store D:\Boot\BCD /set "$id" path \Windows\system32\winload.exe
bcdedit.exe /store D:\Boot\BCD /set "$id" systemroot \Windows
bcdedit.exe /store D:\Boot\BCD /set "$id" nx OptOut
bcdedit.exe /store D:\Boot\BCD /set "$id" allowedinmemorysettings 0x15000075
bcdedit.exe /store D:\Boot\BCD /set "$id" inherit "{6efb52bf-1766-41db-a6b3-0ee5eff72bd7}"
bcdedit.exe /store D:\Boot\BCD /set "$id" resumeobject "{45e743a4-934e-11e9-a872-8c17a054efa7}"

bcdedit.exe /store D:\Boot\BCD /displayorder "$id"

# Print result
bcdedit.exe /store D:\Boot\BCD /enum /v
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