确实,即使实例已停止,也不支持分离 VM 实例的启动盘:
$ gcloud compute instances describe instance-1 --zone us-central1-f | grep 'status\|device'
deviceName: instance-1
status: TERMINATED
$ gcloud compute instances detach-disk --device-name instance-1 --zone us-central1-f instance-1
ERROR: (gcloud.compute.instances.detach-disk) There was a problem modifying the resource:
- Hot-remove of the root disk is not supported.
我认为你有两个选择。
第一个选项:您可以为磁盘创建snapshot,而不是图像。该命令类似于
gcloud compute disks snapshot --zone us-central1-f instance-1 --snapshot-names my-snapshot
与映像不同,创建快照不需要分离源磁盘。它甚至不需要终止连接磁盘的 VM,它可能仍在运行,但您需要小心这一点,并且其安全性可能特定于您正在使用的文件系统类型和应用程序。请参阅我上面链接的文档。
获得快照后,您可以使用它使用--source-snapshot 命令的--source-snapshot 标志创建磁盘。然后使用gcloud compute instances create 命令的--image 标志将该磁盘用作新VM 的启动磁盘。
第二个选项:如果您的主要目标是使用一组不同的权限范围重新创建 VM 实例,您也可以按照以下方式进行。
-
设置删除VM实例时不自动删除磁盘:
gcloud compute instances set-disk-auto-delete --zone us-central1-f --device-name instance-1 --no-auto-delete instance-1
如果您没有安装了Google Cloud SDK 的终端,您可能会发现Google Cloud Shell 在此步骤中很有用。
-
检查实例没有任何启用自动删除的磁盘:
$ gcloud compute instances describe --zone us-central1-f instance-1 | grep autoDelete
- autoDelete: false
(该命令的autoDelete 字段不能有任何true 值)
删除虚拟机实例。虽然我是一个命令行类型的人,但我会在这里使用 Cloud Console,只是在我执行删除之前再次仔细检查实例页面上的“删除实例时删除启动磁盘”框是否未选中。我觉得我是偏执狂。
在与原始实例相同的区域中使用 gcloud compute instances create 创建一个新的 VM 实例,并传递 --disk name=instance-1,boot=yes,auto-delete=yes 之类的内容来指示该工具将现有磁盘用作实例的启动磁盘,而不是创建一个新的。
实际上,如果我的目标只是重新创建具有一组不同权限范围的实例,我会选择第二条路线,但仍会首先创建快照,这只是一种安全措施。此外,第二个选项假定您在同一区域中重新创建实例。如果您想将新实例带到不同的区域,第一个选项是要走的路。另一方面,快照具有差异化的良好特性,使其成为定期备份的理想选择。