您可以从源磁盘、映像、快照或 Cloud Storage 中存储的映像创建自定义映像,然后使用这些映像创建虚拟机 (VM) 实例。如果您创建并修改了一个永久性启动磁盘或特定映像,使其达到了特定的状态并需要保存该状态以用于创建实例,最适合使用自定义映像。
此外,您也可以使用虚拟磁盘导入工具从现有系统将启动磁盘映像导入 Compute Engine,并将其添加到您的自定义映像列表中。
准备工作
- 如果您要使用本指南中的命令行示例,请执行以下操作:
- 安装或更新到 gcloud 命令行工具的最新版本。
- 设置默认区域和可用区。
- 如果您要使用本指南中的 API 示例,请设置 API 访问权限。
- 阅读映像文档。
创建自定义映像
这些说明描述了如何在 Linux 实例上创建自定义映像。如需了解如何创建 Windows 映像,请参阅创建 Windows 映像。
您必须使用身份和访问权限管理 (IAM) 权限与其他项目共享映像。
选择映像存储位置
创建自定义映像时,您可以为该映像指定除了双区域位置之外的 Cloud Storage 位置。指定映像存储位置后,您可以通过确保跨区域实现冗余来满足数据存储区域的法规和合规性要求以及高可用性需求。
存储位置功能是可选的。如果您未选择位置,Compute Engine 会将您的映像存储在最靠近映像来源的多区域位置中。
如需查看当前存储映像的位置,请通过 gcloud compute
使用 images describe
命令:
gcloud compute images describe IMAGE_NAME \ --project=PROJECT_ID
此功能发布之前的所有现有映像都保留在原来的位置,唯一的变化是您可以查看所有映像的位置。如果要移动现有映像,您必须在目标位置重新创建该映像。
准备用于映像的实例
即使磁盘挂接到正在运行的虚拟机实例,您也可以从磁盘创建映像。但是,如果将实例置于更易于捕获映像的状态,则映像会更加可靠。选择以下过程之一准备用于映像的启动磁盘:
停止实例,以便其关闭并停止将任何数据写入永久性磁盘。
如果创建映像之前无法停止实例,请尽量减少对磁盘的写入量并同步文件系统。
- 暂停将数据写入该永久性磁盘的应用或操作系统进程。
- 如有必要,刷新写入磁盘的应用。例如,MySQL 设有
FLUSH
语句。其他应用可能有类似的进程。 - 阻止应用写入永久性磁盘。
- 运行
sudo sync
。
准备好实例后,创建映像。
创建映像
您可从以下来源创建磁盘映像:
- 永久性磁盘,即使该磁盘已连接到实例。
- 永久性磁盘的快照
- 您项目中的另一个映像
- 另一个项目分享的映像
- Cloud Storage 中的压缩 RAW 映像
您可以每 10 分钟创建磁盘映像一次。如果您想要发出大量创建磁盘映像的请求,可以在 60 分钟内发出最多 6 个请求。如需了解详情,请参阅快照频率限制。
控制台
在 Google Cloud Console 中,转到创建映像页面。
指定映像的名称。
指定您要根据其创建映像的来源。可以是 Cloud Storage 中的永久性磁盘、快照、其他映像或 disk.raw 文件。
指定您要存储映像的位置。从基于来源磁盘位置(默认)下拉列表中选择映像存储位置。例如,指定
us
可将映像存储在us
多区域中,或指定us-central1
可将其存储在us-central1
区域中。如果您未选择位置,Compute Engine 会将映像存储在最靠近映像源位置的多区域中。指定您的映像的属性。例如,您可以为映像指定一个映像系列名称,以将此映像作为映像系列的一部分加以整理。
点击创建来创建映像。
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
命令查看映像位置。
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
:映像所属的项目。IMAGE_NAME
:您要创建的新映像的名称。ZONE
:来源磁盘所在的可用区。SOURCE_DISK
:要从中创建映像的磁盘。LOCATION
:可选:映像的存储位置。例如,指定us
可将映像存储在us
多区域中,或指定us-central1
可将其存储在us-central1
区域中。如果您未选择位置,Compute Engine 会将映像存储在最靠近映像源位置的多区域中。
可选的 forceCreate
参数让您可以从正在运行的实例创建映像。只有当您确定要根据正在运行的实例创建映像时,才可指定 TRUE
。forceCreate
默认设置为 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 会将映像存储在最靠近映像源位置的多区域中。
有关添加映像的更多信息,请参阅映像参考。
弃用映像
Compute Engine 可让您在映像上设置弃用状态,以便弃用您所拥有的自定义映像。每个弃用状态都会引起服务器的不同响应,从而帮助您以一种可管理的方式将用户从不受支持的映像转移出去。可以使用 Google Cloud Console、gcloud
命令行工具或 Compute Engine API 方法来弃用映像。
弃用状态
支持以下弃用状态:
ACTIVE
:映像处于活跃状态,并且可以正常使用。映像系列指向一个系列中最新、最活跃的映像。DEPRECATED
:映像被标记为“已弃用”,但仍可供使用。如果您使用已弃用的映像,请求会成功并显示一条警告。您可以为此映像创建新的链接。即使此映像是某个系列中最新的映像,映像系列也不会再指向此映像。OBSOLETE
:映像被标记为“已作废”,无法再使用。如果您尝试在请求中使用此映像,系统会返回一条错误消息。您仍然可以使用指向此映像的现有链接。DELETED
:此映像已删除。如果您尝试使用已删除的映像,系统会返回一条错误消息。
您可以通过将弃用状态更改为 ACTIVE
来还原弃用(使映像再次变为活跃状态)。
控制台
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
:用于替换弃用映像的映像。
删除映像
您只能删除您或有权访问该项目的人添加的自定义映像。可以使用 Google Cloud Console、gcloud
命令行工具或 Compute Engine API 方法来删除映像。
控制台
在 Google Cloud Console 中,转到映像页面。
选中您想要删除的映像左侧的框。
点击页面顶部的删除。您的映像已删除。
gcloud
使用 gcloud compute images delete
命令删除映像。
gcloud compute images delete IMAGE_NAME
将 IMAGE_NAME
替换为要删除的映像的名称。
API
向 images().delete
方法发出 POST
请求。指定要删除的映像的名称。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/RESOURCE_ID
请替换以下内容:
PROJECT_ID
:映像所属的项目。RESOURCE_ID
:要删除的映像的名称。
在映像系列中设置映像版本
利用映像系列来简化映像版本控制。将映像添加到映像系列以将其设置为最新的映像版本。如果您确定必须将映像系列回滚到以前的映像版本,请弃用系列中最新的映像。
如需了解使用映像系列时的最佳做法,请参阅映像系列最佳做法。
(可选)您可以使用 Google Cloud Console、带有 --storage-location
标志的 gcloud compute images create
命令或者 images().insert
方法指定映像的存储位置中。
例如,在映像系列中创建一个名为 image-v1
的映像。
控制台
在 Google Cloud Console 中,转到创建映像页面。
指定映像的名称。
指定您要根据其创建映像的来源。可以是 Cloud Storage 中的永久性磁盘、快照、其他映像或 disk.raw 文件。
指定您要存储映像的位置。从基于来源磁盘位置(默认)下拉菜单中选择映像存储位置。例如,指定
us
可将映像存储在us
多区域中,或指定us-central1
可将映像存储在us-central1
区域中。如果您未选择位置,Compute Engine 会将映像存储在最接近映像来源位置的多区域中。指定您的映像的属性。例如,您可以为映像指定一个映像系列名称
my-image-family
,以将此映像作为映像系列的一部分加以整理。如果您根据挂接到运行映像的磁盘来创建映像,请勾选“强制从运行实例创建”以确认您希望在实例运行时创建映像。
点击创建来创建映像。
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_SUBNET
UEFI_COMPATIBLE
VIRTIO_SCSI_MULTIQUEUE
WINDOWS
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
:要为映像启用的访客操作系统功能的 ID(以英文逗号分隔)。设置为以下一个或多个值:MULTI_IP_SUBNET
UEFI_COMPATIBLE
VIRTIO_SCSI_MULTIQUEUE
WINDOWS
后续步骤
- 与其他项目共享您的私有映像。
- 了解如何导入磁盘、映像和虚拟机实例。
- 了解如何将映像导出到 Cloud Storage。
- 了解如何从自定义映像启动实例。
- 了解如何使用 Jenkins 和 Packer 构建自定义基本映像。