创建自定义映像


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

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

准备工作

创建自定义映像

本部分介绍如何在 Linux 虚拟机上创建自定义映像。 如需了解如何创建 Windows 映像,请参阅创建 Windows 映像

选择映像存储位置

创建自定义映像时,您可以为该映像指定除了双区域位置之外的 Cloud Storage 位置。指定映像存储位置后,您可以通过确保跨区域实现冗余来满足数据存储区域的法规和合规性要求以及高可用性需求。如需创建、修改和删除存储在 Cloud Storage 中的映像,您必须拥有 roles/compute.storageAdmin

存储位置功能是可选的。如果您未选择位置,则 Compute Engine 会将映像存储在最靠近映像来源的多区域位置。例如,在您通过位于 us-central1 的来源磁盘创建映像时,如果您没有为自定义映像指定位置,则 Compute Engine 会将映像存储在 us 多区域位置。

如果映像在您创建虚拟机的区域中未提供,则 Compute Engine 会在您首次创建虚拟机时在该区域中缓存映像。

如需查看存储映像的位置,请通过 gcloud compute 使用 images describe 命令:

gcloud compute images describe IMAGE_NAME \
    --project=PROJECT_ID

请替换以下内容:

  • IMAGE_NAME:您的映像的名称。

  • PROJECT_ID:映像所属的项目 ID。

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

为映像准备虚拟机

即使磁盘挂接到正在运行的虚拟机,您也可以从磁盘创建映像。但是,如果将虚拟机置于更易于捕获映像的状态,则映像会更加可靠。本部分介绍如何为映像准备启动磁盘。

尽可能减少永久性磁盘的数据写入

使用以下过程之一减少磁盘写入:

  • 停止虚拟机,以便其关闭并停止将任何数据写入永久性磁盘。

  • 如果在创建映像之前无法停止虚拟机,请尽量减少磁盘的写入量并同步文件系统。为了尽可能减少对永久性磁盘的写入,请按照以下步骤操作:

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

停用磁盘的自动删除选项

默认情况下,启动磁盘上会启用自动删除选项。在通过磁盘创建映像之前,请先停用自动删除,以确保在您删除虚拟机时不会自动删除磁盘。

您可以使用 Google Cloud Console、Google Cloud CLI 或 Compute Engine API 来停用磁盘的自动删除功能。

控制台

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 点击您用作映像创建来源的虚拟机。此时将显示虚拟机实例详情页面。

  3. 点击修改

  4. 启动磁盘部分,确保为删除规则选中保留磁盘选项。

  5. 点击保存

gcloud

在 Google Cloud CLI 中,使用 gcloud compute instances set-disk-auto-delete 命令停用磁盘的自动删除选项。

gcloud compute instances set-disk-auto-delete VM_NAME \
    --no-auto-delete \
    --disk=SOURCE_DISK

替换以下内容:

  • VM_NAME:虚拟机实例的名称。
  • SOURCE_DISK:要通过其创建映像的磁盘的名称。

API

如需设置磁盘的自动删除选项,请向 instances.setDiskAutoDelete 方法发出 POST 请求。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setDiskAutoDelete?autoDelete=false&deviceName=SOURCE_DISK

替换以下内容:

  • PROJECT_ID:来源虚拟机所属的项目 ID。
  • ZONE:来源虚拟机所在的可用区。
  • VM_NAME:来源虚拟机的名称。
  • SOURCE_DISK:要通过其创建映像的磁盘的设备名称。

准备好虚拟机后,创建映像

创建映像

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

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

您可以每 10 分钟创建磁盘映像一次。如果您想要发出大量创建磁盘映像的请求,可以在 60 分钟内发出最多 6 个请求。如需了解详情,请参阅快照频率限制

控制台

  1. 在 Google Cloud Console 中,转到创建映像页面。

    转到“创建映像”

  2. 指定映像的名称

  3. 指定您要根据其创建映像的来源。可以是 Cloud Storage 中的永久性磁盘、快照、其他映像或 disk.raw 文件。

  4. 如果您从挂接到正在运行的虚拟机的磁盘来创建映像,请勾选保持实例运行,以确认您要在虚拟机保持运行的状态下创建映像。您可以在创建映像之前准备虚拟机

  5. 基于来源磁盘位置(默认)下拉列表中,指定映像的存储位置。例如,指定 us 可将映像存储在 us 多区域中,或指定 us-central1 可将其存储在 us-central1 区域中。如果您未选择位置,Compute Engine 会将映像存储在最靠近映像源位置的多区域中。

  6. 可选:指定您的映像的属性。

    • 系列:这个新映像所属的映像系列
    • 说明:自定义映像的说明。
    • 标签:用于将资源组织在一起的标签
  7. 指定加密密钥。您可以选择 Google 管理的密钥、Cloud Key Management Service (Cloud KMS) 密钥或客户提供的加密密钥 (CSEK)。如果未指定加密密钥,则系统会使用 Google 管理的密钥对映像进行加密。

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

gcloud

在 Google Cloud CLI 中,使用 gcloud compute images create 命令创建自定义映像。

根据来源磁盘创建映像

--force 标志是一个可选标志,可让您根据正在运行的实例创建映像。默认情况下,您无法根据正在运行的实例创建映像。只有当您确定要在实例正在运行的情况下创建映像时,才可指定此标志。

gcloud 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 会将映像存储在最接近映像来源位置的多区域中。

根据来源映像创建映像

gcloud 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 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 compute images describe 命令查看映像位置。

gcloud compute images describe IMAGE_NAME

IMAGE_NAME 替换为您要查看的映像的名称。

API

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

根据永久性磁盘创建映像

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

{
  "name": "IMAGE_NAME",
  "sourceDisk": "/zones/ZONE/disks/SOURCE_DISK",
  ("storageLocations": "LOCATION",)
  ("forceCreate": "TRUE")
}

请替换以下内容:

  • PROJECT_ID:映像所属的项目 ID。
  • IMAGE_NAME:您要创建的新映像的名称。
  • ZONE:来源磁盘所在的可用区。
  • SOURCE_DISK:要从中创建映像的磁盘。
  • LOCATION:可选:映像的存储位置。例如,指定 us 可将映像存储在 us 多区域中,或指定 us-central1 可将其存储在 us-central1 区域中。如果您未选择位置,Compute Engine 会将映像存储在最靠近映像源位置的多区域中。

可选的 forceCreate 参数让您可以从正在运行的虚拟机创建映像。只有当您确定要从正在运行的虚拟机创建映像时,才可指定 TRUEforceCreate 默认设置为 FALSE

根据其他映像创建映像:

POST https://compute.googleapis.com/compute/v1/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://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images
{
  "name": "IMAGE_NAME",
  "sourceSnapshot": "(/SOURCE_PROJECT_ID)/global/snapshots/SOURCE_SNAPSHOT",
  ("storageLocations": "LOCATION")
}

请替换以下内容:

  • PROJECT_ID:映像所属的项目。
  • IMAGE_NAME:您要创建的新映像的名称。
  • SOURCE_PROJECT_ID:可选:快照所在的项目。您必须有权访问该项目中的快照资源。
  • SOURCE_SNAPSHOT:要从中创建映像的快照。
  • LOCATION:可选:映像的存储位置。例如,指定 us 可将映像存储在 us 多区域中,或指定 us-central1 可将其存储在 us-central1 区域中。如果您未选择位置,Compute Engine 会将映像存储在最靠近映像源位置的多区域中。

有关添加映像的更多信息,请参阅映像参考

共享映像

创建自定义映像后,您可以在多个项目之间共享该映像。如果您允许其他项目中的用户使用您的自定义映像,那么他们可以通过在其请求中指定该映像的项目来访问这些映像。

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

使用客机操作系统 (OS) 功能,在自定义映像上配置以下网络、安全、存储和操作系统选项。具有这些已配置功能的自定义映像用作启动磁盘。

gcloud

结合使用 gcloud compute images create 命令和 --guest-os-features 标志,以根据现有自定义映像创建新的自定义映像。

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

替换以下内容:

  • IMAGE_NAME:新映像的名称
  • SOURCE_IMAGE:新映像所要依据的来源映像
  • IMAGE_PROJECT:可选:包含来源映像的项目

    使用此参数从其他项目中复制映像。

  • FEATURES:用于为根据映像创建的虚拟机启用功能的客机操作系统标记

    如需添加多个值,请使用逗号来分隔值。设置为以下一个或多个值:

    • VIRTIO_SCSI_MULTIQUEUE。在本地 SSD 设备上使用以替代 NVMe。如需详细了解支持 SCSI 的映像,请参阅选择接口

      对于 Linux 映像,您可以在内核版本为 3.17 或更高版本的映像的本地 SSD 设备上启用多队列 SCSI。对于 Windows 映像,您可以在具有 1.2 版 Compute Engine Windows 驱动程序的映像的本地 SSD 设备上启用多队列 SCSI。

    • WINDOWS。将 Windows Server 自定义启动映像标记为 Windows 映像。
    • MULTI_IP_SUBNET。使用 /32 以外的网络掩码配置接口。如需详细了解多个网络接口及其具体工作方式,请参阅多个网络接口概览和示例
    • UEFI_COMPATIBLE。使用 UEFI 固件和以下安全强化型虚拟机功能启动:
    • GVNIC。支持更高的网络带宽,即 50 Gbps 到 100 Gbps 的速度。如需了解详情,请参阅使用 Google 虚拟 NIC
    • SEV_CAPABLE。如果您在 AMD 安全加密虚拟化 (SEV) CPU 平台上创建机密虚拟机,请使用此值。如需了解详情,请参阅创建新的机密虚拟机实例
    • SUSPEND_RESUME_COMPATIBLE。支持在虚拟机上暂停和恢复。如需了解详情,请参阅操作系统兼容性
  • LOCATION:可选:用于存储映像的单区域或多区域

    例如,指定 us 可将映像存储在 us 多区域中,或指定 us-central1 可将映像存储在 us-central1 区域中。如果您未选择位置,Compute Engine 会将映像存储在最靠近映像源位置的多区域中。

API

结合使用 images().insert 命令guestOsFeatures 标志,以根据现有自定义映像创建新的自定义映像。


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

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

替换以下内容:

  • PROJECT_ID:要在其中创建新映像的项目的 ID
  • IMAGE_NAME:新映像的名称
  • IMAGE_PROJECT:可选:包含来源映像的项目

    使用此参数从其他项目中复制映像。

  • SOURCE_IMAGE:新映像所要依据的来源映像

  • LOCATION:可选:用于存储映像的单区域或多区域

    例如,指定 us 可将映像存储在 us 多区域中,或指定 us-central1 可将映像存储在 us-central1 区域中。如果您未选择位置,Compute Engine 会将映像存储在最靠近映像源位置的多区域中。

  • FEATURES:用于为根据映像创建的虚拟机启用功能的客机操作系统标记

    如需添加多个值,请使用逗号来分隔值。设置为以下一个或多个值:

    • VIRTIO_SCSI_MULTIQUEUE。在本地 SSD 设备上使用以替代 NVMe。如需详细了解支持 SCSI 的映像,请参阅选择接口

      对于 Linux 映像,您可以在内核版本为 3.17 或更高版本的映像的本地 SSD 设备上启用多队列 SCSI。对于 Windows 映像,您可以在具有 1.2 版 Compute Engine Windows 驱动程序的映像的本地 SSD 设备上启用多队列 SCSI。

    • WINDOWS。将 Windows Server 自定义启动映像标记为 Windows 映像。
    • MULTI_IP_SUBNET。使用 /32 以外的网络掩码配置接口。如需详细了解多个网络接口及其具体工作方式,请参阅多个网络接口概览和示例
    • UEFI_COMPATIBLE。使用 UEFI 固件和以下安全强化型虚拟机功能启动:
    • GVNIC。支持更高的网络带宽,即 50 Gbps 到 100 Gbps 的速度。如需了解详情,请参阅使用 Google 虚拟 NIC
    • SEV_CAPABLE。如果您在 AMD 安全加密虚拟化 (SEV) CPU 平台上创建机密虚拟机,请使用此值。如需了解详情,请参阅创建新的机密虚拟机实例
    • SUSPEND_RESUME_COMPATIBLE。支持在虚拟机上暂停和恢复。如需了解详情,请参阅操作系统兼容性

Arm 映像的注意事项

Google 提供在 Ampere Altra CPU 平台上运行的 Tau T2A 机器系列。您可以使用 T2A 机器系列启动虚拟机,然后使用该源虚拟机创建 Arm 映像。创建自定义 Arm 映像的过程与创建 x86 映像的过程相同。

为了帮助您的用户区分 Arm 和 x86 映像,ARM 映像的 architecture 字段将设置为 ARM64。此字段的可能值包括:

  • ARCHITECTURE_UNSPECIFIED
  • X86_64
  • ARM64

然后,映像用户可以对此字段进行过滤,以查找基于 x86 或 Arm 的映像。

后续步骤