创建、删除和弃用自定义映像

您可以为源磁盘、映像及快照或存储在 Cloud Storage 中的映像创建自定义映像。您可以使用这些映像创建新的虚拟机实例。如果您创建并修改了一个永久性启动磁盘或特定映像,使其达到了特定的状态并需要保存该状态以创建新的实例,最适合使用自定义映像。

此外,您也可以使用虚拟磁盘导入工具从现有系统将启动磁盘映像导入 Compute Engine,并将其添加到您的自定义映像列表中。

准备工作

创建自定义映像

这些说明描述了如何在 Linux 实例上创建自定义映像。如需了解创建 Windows 映像的说明,请参阅创建 Windows 映像

您必须使用身份和访问权限管理 (IAM) 权限与其他项目共享映像

选择映像存储位置

创建自定义映像时,您可以为该映像指定除了双区域位置之外的 Cloud Storage 位置。通过确保跨区域的冗余,指定映像存储位置有助于满足数据存储区域的法规和合规性要求以及高可用性需求。

选择存储位置的功能是可选的。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。

此功能发布之前的所有现有映像都保留在原来的位置。唯一的变化是您可以查看所有映像的映像位置。如果您需要移动现有映像,您必须在所需位置重新创建该映像。

准备用于映像的实例

即使磁盘挂接到正在运行的虚拟机实例,您也可以从磁盘创建映像。但是,如果将实例置于更易于捕获映像的状态,则映像会更加可靠。选择以下过程之一准备用于映像的启动磁盘:

  • 停止实例,其可关闭并停止将任何数据写入永久性磁盘。

  • 如果创建映像之前无法停止实例,请尽量减少对磁盘的写入量并同步文件系统。

    1. 暂停将数据写入该永久性磁盘的应用程序或操作系统进程。
    2. 如有必要,刷新写入磁盘的应用程序。例如,MySQL 设有 FLUSH 语句。其他应用程序可能有类似的进程。
    3. 停止应用程序写入永久性磁盘。
    4. 运行 sudo sync

准备好实例后,创建映像

创建映像

您可从以下来源创建磁盘映像:

  • 永久性磁盘,即使该磁盘已连接到实例。
  • 永久性磁盘的快照
  • 您项目中的另一个映像
  • 另一个项目分享的映像
  • Google Cloud Storage 中的压缩 RAW 映像

控制台

  1. 在 Google Cloud Platform Console 中,转到“创建映像”页面。
    转到“创建映像”页面
  2. 指定映像的名称
  3. 指定您要根据其创建映像的来源。可以是 Google Cloud Storage 中的永久性磁盘、快照、其他映像或 disk.raw 文件。
  4. 指定您要存储映像的位置。从“基于源磁盘位置(默认)”下拉菜单中选择映像存储位置。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。
  5. 指定您的映像的属性。例如,您可以为映像指定映像系列名称,以将此映像整理在映像系列中。
  6. 点击创建来创建映像。

gcloud

使用 gcloud compute beta images create 命令创建自定义映像。可选的 --storage-location 标志需要 beta 标记。

根据其他映像创建映像:

gcloud beta compute images create [IMAGE_NAME] \
  --source-disk [SOURCE_DISK] \
  --source-disk-zone [ZONE] \
  --family [IMAGE_FAMILY] \
  --storage-location [LOCATION] \
  --force

其中:

  • [IMAGE_NAME] 是新映像的名称。
  • [SOURCE_DISK] 是您要根据其创建新映像的磁盘。
  • [ZONE] 是磁盘所在的地区。
  • [IMAGE_FAMILY] 是可选标志,用于指定此映像所属的映像系列
  • [LOCATION] 是一个可选标志,允许您指定要存储映像的区域或多区域。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。
  • [--force] 是可选标志,可让您根据正在运行的实例创建映像。默认情况下,您无法根据正在运行的实例创建映像。只有当您确定要在实例正在运行的情况下创建映像时,才可指定此标志。

根据其他映像创建映像:

gcloud beta compute images create [IMAGE_NAME] \
  --source-image [SOURCE_IMAGE] \
  --source-image-project [IMAGE_PROJECT] \
  --family [IMAGE_FAMILY] \
  --storage-location [LOCATION]

其中:

  • [IMAGE_NAME] 是新映像的名称。
  • [SOURCE_IMAGE] 是您要根据其创建新映像的映像。
  • [IMAGE_PROJECT] 是可选参数,用于指定来源映像所在的项目。如果您想复制另一个项目中的映像,可使用此参数。
  • [IMAGE_FAMILY] 是可选标志,用于指定此新映像所属的映像系列
  • [LOCATION] 是一个可选标志,允许您指定要存储映像的区域或多区域。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。

根据快照创建映像:

gcloud beta compute images create [IMAGE_NAME] \
  --source-snapshot [SOURCE_SNAPSHOT] \
  --storage-location [LOCATION]

其中:

  • [IMAGE_NAME] 是新映像的名称。
  • [SOURCE_SNAPSHOT] 是您要根据其创建新映像的快照。
  • [LOCATION] 是一个可选标志,允许您指定要存储映像的区域或多区域。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。

查看映像位置:

使用 gcloud beta compute images describe 命令查看映像位置。查看映像的存储位置需要使用 beta 标签。

gcloud beta compute images describe [IMAGE_NAME]

其中 [IMAGE_NAME] 是您要描述的映像的名称。

API

images().insert 方法发出 POST 请求,请求正文中的网址指向您要根据其创建映像的源对象。使用您自己的项目 ID 和资源名称来指定指向您资源的网址。您需要使用此方法的 beta 版本指定 storageLocations 参数。

根据永久性磁盘创建映像:

POST https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/global/images

{
  "name": "[IMAGE_NAME]",
  "sourceDisk": "/zones/[ZONE]/disks/[SOURCE_DISK]",
  "storageLocations": "[LOCATION]",
  "forceCreate": "[FORCE_CREATE]"
}

其中:

  • [PROJECT_ID] 是映像所属的项目。
  • [IMAGE_NAME] 是您要创建的新映像的名称。
  • [ZONE] 是来源磁盘所在的地区。
  • [SOURCE_DISK] 是您要根据其创建映像的磁盘。
  • [LOCATION] 是一个可选参数,用于选择映像的存储位置。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。
  • [FORCE_CREATE] 是可选参数,可让您根据正在运行的实例创建映像。只有当您确定要根据正在运行的实例创建映像时,才可指定 TRUE。如果您未指定此参数,则默认值为 FALSE

根据其他映像创建映像:

POST https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/global/images

{
  "name": "[IMAGE_NAME]",
  "sourceImage": "/global/images/[SOURCE_IMAGE]",
  "storageLocations": "[LOCATION]"
}

其中:

  • [PROJECT_ID] 是映像所属的项目。
  • [IMAGE_NAME] 是您要创建的新映像的名称。
  • [SOURCE_IMAGE] 为您想要由其创建映像的映像。
  • [LOCATION] 是一个可选参数,用于选择映像的存储位置。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。

根据快照创建映像:

POST https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/global/images

{
  "name": "[IMAGE_NAME]",
  "sourceSnapshot": "/[SOURCE_PROJECT_ID]/global/snapshots/[SOURCE_SNAPSHOT]",
  "storageLocations": "[LOCATION]"
}

其中:

  • [PROJECT_ID] 是映像所属的项目。
  • [IMAGE_NAME] 是您要创建的新映像的名称。
  • [SOURCE_SNAPSHOT] 是您要根据其创建映像的快照。
  • [SOURCE_PROJECT_ID] 为可选变量,用于指定快照所在的项目。您必须有权访问该项目中的快照资源。
  • [LOCATION] 是一个可选参数,用于选择映像的存储位置。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。

如需详细了解如何添加映像,请参阅映像参考

弃用映像

Google Compute Engine 可让您在映像上设置弃用状态,以便弃用您所拥有的自定义映像。每个弃用状态都会引起服务器的不同响应,从而帮助您以一种可管理的方式将用户从不受支持的映像转移出去。您可以使用控制台、gcloud 命令或 Compute Engine API 方法弃用指定映像。

控制台

  1. 在 Google Cloud Platform Console 中,转到“创建映像”页面。
    转到“创建映像”页面
  2. 选中您想要弃用的映像左侧的框。
  3. 点击页面顶部的“弃用”。您的映像已弃用。

gcloud

使用 gcloud compute images deprecate 命令设置映像的弃用状态。

gcloud compute images deprecate [IMAGE_NAME] \
    --state [STATE] \
    --replacement [REPLACEMENT]

其中,[IMAGE_NAME] 是您需要弃用的映像的名称。

弃用状态可以是以下任意一种:

  • DEPRECATED - 此映像被视为已弃用。当用户尝试使用此映像时,请求将会成功,但 Google Compute Engine 也会返回一条警告。您仍然可以为此映像创建新的链接。即使此映像是某个系列中最新的映像,映像系列也不会再指向此映像。
  • OBSOLETE - 此映像已过时,新用户无法使用。如果用户尝试在请求中使用该映像,Google Compute Engine 会返回错误。您仍然可以使用指向此映像的现有链接。
  • DELETED - 此映像已被删除,用户无法使用它。如果用户尝试使用该映像,Google Compute Engine 会返回错误。

API

images().deprecate 方法发出 POST 请求。指定要弃用的映像的名称。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/images/[RESOURCE_ID]/deprecate

{
  "deprecated": "[IMAGE_NAME]",
  "replacement": "[REPLACEMENT]"
}

其中:

  • [PROJECT_ID] 是映像所属的项目。
  • [IMAGE_NAME] 是您要弃用的映像。
  • [REPLACEMENT] 是用于替换弃用映像的映像。

删除映像

您只能删除您或有权访问该项目的人添加的自定义映像。使用控制台、gcloud 命令或 Compute Engine API 方法删除映像。

控制台

  1. 在 Google Cloud Platform Console 中,转到“创建映像”页面。
    转到“创建映像”页面
  2. 选中您想要删除的映像左侧的框。
  3. 点击页面顶部的删除。您的映像已删除。

gcloud

使用 gcloud compute images delete 命令删除映像。

gcloud compute images delete [IMAGE_NAME]

其中,[IMAGE_NAME] 是您需要删除的映像的名称。

API

images().delete 方法发出 POST 请求。指定要删除的映像的名称。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/images/[RESOURCE_ID]

其中:

  • [PROJECT_ID] 是映像所属的项目。
  • [RESOURCE_ID] 是要删除的映像的名称。

在映像系列中设置映像版本

利用映像系列来简化映像版本控制。将映像添加到映像系列以将其设置为最新的映像版本。如果您确定必须将映像系列回滚到以前的映像版本,请弃用系列中最新的映像。

或者,您可以使用控制台、使用带有 --storageLocation 标志的 gcloud beta compute images create 命令、或者 beta images().insert API 方法指定映像的存储位置

例如,在映像系列中创建一个名为 image-v1 的映像。

控制台

  1. 在 Google Cloud Platform Console 中,转到“创建映像”页面。
    转到“创建映像”页面
  2. 指定映像的名称
  3. 指定您要根据其创建映像的来源。可以是 Google Cloud Storage 中的永久性磁盘、快照、其他映像或 disk.raw 文件。
  4. 指定您要存储映像的位置。从“基于源磁盘位置(默认)”下拉菜单中选择映像存储位置。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。

  5. 指定您的映像的属性。例如,您可以为映像指定映像系列名称 my-image-family,以将此映像组织为映像系列的一部分。

  6. 如果您根据挂接到运行映像的磁盘来创建映像,请勾选“强制从运行实例创建”以确认您希望在实例运行时创建映像。

  7. 点击创建来创建映像。

gcloud

gcloud compute images create image-v1 \
    --source-disk disk-1 \
    --source-disk-zone us-central1-f \
    --family my-image-family \

该映像系列指向 image-v1。在该系列中添加第二个映像:

gcloud compute images create image-v2 \
    --source-disk disk-2 \
    --source-disk-zone us-central1-f \
    --family my-image-family \

API

images().insert 方法发出 POST 请求。在请求正文中指定映像系列。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/images

{
  "name": "image-v2",
  "sourceDisk": "/zones/us-central1-f/disks/disk-2",
  "family":"my-image-family",

}

该映像系列指向 image-v2,因为这是您添加到映像系列的最新映像。

gcloud

您可以运行 gcloud compute images describe-from-family 命令来查看某个系列指向哪个映像。

例如:

gcloud beta compute images describe-from-family my-image-family

family: my-image-family
id: '8904691942610171306'
kind: compute#image
name: image-v2
selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/images/image-v2
sourceDisk: https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/disks/disk-v2
sourceDiskId: '1677449456001963379'
sourceType: RAW
status: READY

API

images().getFromFamily 方法发出 GET 请求。在请求正文中指定映像系列。

GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/images/family

{
  "resourceId":"my-image-family",

}

如果您确定必须回滚该映像系列,以使其不再指向 image-v2,请弃用 image-v2,这样该系列将再次指向 image-v1

gcloud compute images deprecate image-v2 \
    --state DEPRECATED \
    --replacement image-v1

检查以确保该映像系列再次指向 image-v1

gcloud beta compute images describe-from-family my-image-family

family: my-image-family
id: '2741732787056801255'
kind: compute#image
name: image-v1
selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/images/image-v1
sourceDisk: https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/disks/disk-v1
sourceDiskId: '1677449456001963379'
sourceType: RAW
status: READY

在自定义映像上启用访客操作系统功能

您在创建自定义映像时可以设置 guestOsFeatures 参数。此参数可为将映像用于启动磁盘的虚拟机实例启用一项或多项功能。可供使用的功能如下:

  • MULTI_IP_SUBNET - 通过除 /32 以外的网络掩码来配置接口。
  • SECURE_BOOT - 允许您启用 UEFI 安全启动,可限制虚拟机实例上未签名软件的启动,或未签名驱动程序的加载。设置此参数后,您可以在虚拟机实例创建过程中启用安全启动功能。
  • UEFI_COMPATIBLE - 启用 UEFI 启动,这是一种备选系统启动方法。大多数公开映像均使用 GRUB 引导加载程序作为其主要启动方法。
  • VIRTIO_SCSI_MULTIQUEUE - 为本地 SSD 设备启用多队列 SCSI 功能。此选项是 NVMe 的备用选项。
    • 对于 Linux 映像,您可在内核版本为 3.17 或更高版本的映像上启用 VIRTIO_SCSI_MULTIQUEUE
    • 对于 Windows 映像,您可以在驱动程序版本为 1.2.0.1621 或更高版本的映像上启用 VIRTIO_SCSI_MULTIQUEUE
  • WINDOWS - Windows Server 映像所必需。较新的 Windows Server 公开映像中包括了 WINDOWS 参数,以表明这是一个 Windows 映像。

使用 gcloud 命令行工具或 API 在您的自定义映像上启用访客操作系统功能。

gcloud

使用 gcloud compute images create 命令可以根据一个现有的自定义映像创建自定义映像,但同时也会包含 --guest-os-features 标志。使用 gcloud compute beta images create 命令包含可选的 --storage-location 标志。

gcloud beta compute images create [IMAGE_NAME] \
  --source-image [SOURCE_IMAGE] \
  --source-image-project [IMAGE_PROJECT] \
  --guest-os-features="[FEATURE_ID],..." \
  --storage-location [LOCATION]

其中:

  • [IMAGE_NAME] 是您要创建的新映像的名称。
  • [SOURCE_IMAGE] 是您要根据其创建新映像的映像。
  • [IMAGE_PROJECT] 是可选参数,用于指定来源映像所在的项目。如果您想复制另一个项目中的映像,可使用此参数。
  • [FEATURE_ID] 是其中一项可用的访客操作系统功能的 ID。您可以采用逗号分隔列表的形式来指定多项功能。
  • [LOCATION] 是一个可选标志,允许您指定要存储映像的区域或多区域。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。

API

images().insert 方法发出 POST 请求,请求正文中的网址指向您要根据其创建映像的源对象。用您自己的项目 ID 和永久性磁盘地区替换项目和地区:您需要使用此请求的 beta API 方法以查看 storageLocations 参数。

根据永久性磁盘创建映像:

POST https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/global/images

{
 "name": "[IMAGE_NAME]",
 "sourceImage": "projects/[IMAGE_PROJECT]/global/images/[SOURCE_IMAGE]",
 "storageLocations": "[LOCATION]",
 "guestOsFeatures": [
  {
   "type": "[FEATURE_ID]"
  }
 ]
}

其中:

  • [IMAGE_NAME] 是您要创建的新映像的名称。
  • [SOURCE_IMAGE] 是您要根据其创建新映像的映像。
  • [IMAGE_PROJECT] 是参数,用于指定来源映像所在的项目。
  • [LOCATION] 是一个可选参数,用于选择映像的存储位置。例如,指定 us 将映像存储在 us 多区域中,或指定 us-central1 将其存储在 us-central1 区域中。如果未选择位置,Compute Engine 会将映像存储在最靠近映像源的多区域位置。
  • [FEATURE_ID] 是其中一项可用的访客操作系统功能的 ID。您可以采用逗号分隔列表的形式来指定多项功能。

如需详细了解如何添加映像,请参阅映像参考

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档