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


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

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

准备工作

创建自定义映像

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

您必须使用 Identity and Access Management (IAM) 权限与其他项目共享映像

选择映像存储位置

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

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

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

gcloud compute images describe image-name --project project-id

⋮
storageLocations:
- us-central1

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

准备用于映像的实例

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

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

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

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

准备好实例后,创建映像

创建映像

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

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

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

控制台

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

gcloud

gcloud 命令行工具中,使用 gcloud compute images create 命令创建自定义映像。

根据来源磁盘创建映像

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 会将映像存储在最接近映像来源位置的多区域中。
  • [--force]:可选标志,用于根据正在运行的实例创建映像。默认情况下,您无法根据正在运行的实例创建映像。只有当您确定要在实例正在运行的情况下创建映像时,才可指定此标志。

根据来源映像创建映像

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 命令查看映像位置。将 image-name 替换为您要查看的映像的名称。

gcloud compute images describe 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:映像所属的项目。
  • image-name:您要创建的新映像的名称。
  • zone:来源磁盘所在的地区。
  • source-disk:要从中创建映像的磁盘。
  • location:可选参数,用于选择映像的存储位置。例如,指定 us 可将映像存储在 us 多区域中,或指定 us-central1 可将映像存储在 us-central1 区域中。如果您未选择位置,Compute Engine 会将映像存储在最接近映像来源位置的多区域中。
  • [FORCE_CREATE]:可选参数,用于根据正在运行的实例创建映像。只有当您确定要根据正在运行的实例创建映像时,才可指定 TRUE。如果您未指定此参数,则默认值为 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-snapshot:要从中创建映像的快照。
  • source-project-id:可选变量,用于指定快照所在的项目。您必须有权访问该项目中的快照资源。
  • location:可选参数,用于选择映像的存储位置。例如,指定 us 可将映像存储在 us 多区域中,或指定 us-central1 可将映像存储在 us-central1 区域中。如果您未选择位置,Compute Engine 会将映像存储在最靠近映像来源位置的多区域中。

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

弃用映像

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

弃用状态

支持以下弃用状态:

  • ACTIVE:映像处于活跃状态,并且可以正常使用。映像系列指向一个系列中最新、最活跃的映像。
  • DEPRECATED:映像被标记为“已弃用”,但仍可供使用。如果您使用已弃用的映像,请求会成功并显示一条警告。您仍然可以为此映像创建新链接。即使此映像是某个系列中最新的映像,映像系列也不会再指向此映像。
  • OBSOLETE:映像被标记为“已作废”,无法再使用。如果您尝试在请求中使用此映像,系统会返回一条错误消息。您仍然可以使用指向此映像的现有链接。
  • DELETED:此映像已删除。如果您尝试使用已删除的映像,系统会返回一条错误消息。

您可以通过将弃用状态更改为 ACTIVE 来还原弃用(使映像再次变为活跃状态)。

控制台

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

gcloud

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

gcloud compute images deprecate image-name \
    --state state \
    --replacement replacement

替换以下内容:

  • image-name:要弃用的映像的名称。
  • state弃用状态
  • replacement:用于替换弃用映像的映像。

API

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

POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/resource-id/deprecate

{
  "state": "state",
  "replacement": "replacement"
}

替换以下内容:

  • project-id:映像所属的项目。
  • resource-id:要弃用的映像的名称。
  • state:此资源的弃用状态
  • replacement:用于替换弃用映像的映像。

删除映像

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

控制台

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

gcloud

使用 gcloud compute images delete 命令删除映像。将 image-name 替换为要删除的映像的名称。

gcloud compute images delete image-name

API

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

POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/resource-id

替换以下内容:

  • project-id:映像所属的项目。
  • resource-id:要删除的映像的名称。

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

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

如需了解使用映像系列时的最佳做法,请参阅映像系列最佳做法

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

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

控制台

  1. 在 Google Cloud 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://compute.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 compute images describe-from-family my-image-family

family: my-image-family
id: '8904691942610171306'
kind: compute#image
name: image-v2
selfLink: https://compute.googleapis.com/compute/v1/projects/my-project/global/images/image-v2
sourceDisk: https://compute.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://compute.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 compute images describe-from-family my-image-family

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

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

借助访客操作系统功能,您可以在将用作启动磁盘的自定义映像上配置以下网络、安全、存储和操作系统选项:

  • 多 IP 子网:通过除 /32 以外的网络掩码来配置接口
  • UEFI 兼容性:用于使用 UEFI 固件和以下安全强化型虚拟机功能进行启动:
  • 本地 SSD 设备上的多队列 SCSI,用于替代 NVMe:
    • 对于 Linux 映像,您可以在内核版本为 3.17 及更高版本的映像的本地 SSD 设备上启用多队列 SCSI。
    • 对于 Windows 映像,您可以在驱动程序版本为 1.2.0.1621 或更高版本的映像的本地 SSD 设备上启用多队列 SCSI。
  • Windows 支持:您必须将 Windows Server 自定义启动映像标记为 Windows 映像。

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:要为映像启用的访客操作系统功能的 ID(以英文逗号分隔)。设置为以下一项或多项:MULTI_IP_SUBNETUEFI_COMPATIBLEVIRTIO_SCSI_MULTIQUEUEWINDOWS
  • 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:新映像的名称。
  • SOURCE_IMAGE:新映像所要依据的基准映像。
  • IMAGE_PROJECT:可选:包含来源映像的项目。使用此参数从其他项目中复制映像。
  • LOCATION:可选:用于存储映像的单区域或多区域。例如,指定 us 可将映像存储在 us 多区域中,或指定 us-central1 可将映像存储在 us-central1 区域中。如果您未选择位置,Compute Engine 会将映像存储在最接近映像来源位置的多区域中。
  • FEATURES:要为映像启用的访客操作系统功能的 ID(以英文逗号分隔)。设置为以下一项或多项:MULTI_IP_SUBNETUEFI_COMPATIBLEVIRTIO_SCSI_MULTIQUEUEWINDOWS

后续步骤