导入虚拟磁盘


如果您的本地环境中已有包含您所需软件和配置的虚拟磁盘(有时称为黄金磁盘或黄金映像),您可以将这些虚拟磁盘导入 Compute Engine 中并使用生成的映像创建虚拟机,从而节约时间。导入工具支持大多数虚拟磁盘文件格式,包括 VMDK 和 VHD。

如果您已从 Compute Engine 中导出磁盘,则可以使用该磁盘来创建映像。

如需了解如何创建自动化系统来迁移多个虚拟机 (VM),请参阅将虚拟机迁移到 Compute Engine

准备工作

  • 如果您为要向其中导入映像的项目定义了可信映像政策,请将 projects/compute-image-importprojects/compute-image-tools 添加到允许的发布商列表中。
  • 如需了解如何满足导入映像的要求,请参阅导入和导出虚拟机映像的前提条件
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

支持的操作系统

您可以导入可启动的磁盘和不可启动的磁盘。您的虚拟磁盘必须运行以下支持的操作系统之一才能在 Compute Engine 上启动。

支持 BYOL 和 BYOS

如果您希望使用自己的软件许可或订阅,则可以导入虚拟磁盘及其许可。如需了解支持 BYOL 或 BYOS 的操作系统,请参阅操作系统详细信息

您可以使用带有 --byol 标志的 gcloud compute instances import 命令来导入具有现有许可的映像

限制

此功能具有以下常规限制:

  • 如果要导入运行 RHEL 的虚拟磁盘,您必须在导入之前将 python-boto 软件包安装到该虚拟磁盘上,这样系统才能支持自带许可 (BYOL)

  • 虚拟磁盘上的操作系统必须支持 ACPI

  • 对于受 VPC Service Controls 保护的项目,不支持此功能。对于这些环境,请参阅手动导入启动磁盘

  • 您无法使用映像导入工具导入 Arm 映像。如需导入 Arm 映像,请按照手动导入启动磁盘中所述的分步说明。

  • Compute Engine 不支持导入软件加密磁盘,因为如果没有密钥,就无法读取这些磁盘。具体而言,您无法导入使用 BitLocker 驱动器加密的 Windows 10 及更高版本的映像。

此功能在 Linux 上具有以下限制:

  • Linux 虚拟磁盘必须使用 grub 作为引导加载程序。

  • Linux 虚拟磁盘必须符合与自定义映像相同的要求,包括对 Virtio-SCSI 存储控制器设备的支持。

此功能在 Windows 上具有以下限制:

  • 当安装在 Windows 虚拟磁盘上时,应用许可名单软件(例如 Carbon Black 的 CB Protection)可能会导致导入过程失败。在导入之前,您可能需要卸载此类软件。

  • 在基于 Windows 的虚拟机上,Microsoft KM-TEST 环回适配器会阻止对元数据服务器的网络访问,因此,您必须在导入之前停用或移除该适配器。

权限

如需在导入映像时启用无缝体验,请确保您已向您的账号、Cloud Build 服务账号和 Compute Engine 服务账号授予所需的 IAM 角色。如需了解详情,请参阅授予所需的 IAM 角色

检查兼容性

在尝试导入虚拟机的磁盘之前,请先下载预检工具并在虚拟机内部运行该工具。预检工具会检查是否存在任何兼容性问题,这些问题可能会导致导入过程失败或者导致磁盘在 Compute Engine 上无法正常运行。

导入虚拟磁盘

您可以使用 Google Cloud 控制台Google Cloud CLICloud Build API 导入虚拟磁盘。

导入可启动的虚拟磁盘

对于可启动的磁盘,您无需指定操作系统,因为导入工具会自动检测操作系统以确定所需的驱动程序和软件包。但是,如果您需要替换检测到的操作系统,则可以指定 --os 标志或 -os 参数。如需查看受支持的值的列表,请参阅 --os 标志

控制台

  1. 在 Google Cloud 控制台中,将虚拟磁盘文件上传到 Cloud Storage。
  2. 转到创建映像页面。

    转到“创建映像”页面

  3. 为您的映像指定名称

  4. 来源下,选择虚拟磁盘(VMDK、VHD…)

  5. 浏览到或手动输入 Cloud Storage 文件的存储位置。

  6. 选择导入磁盘上可用的操作系统。您还可以进行以下更改:

    • 您可以选择安装访客软件包。Google 建议您安装访客环境。如需详细了解客机环境,请参阅客机环境

    • 对于 Windows 或 Red Hat Enterprise Linux (RHEL) 操作系统,您还可以选择许可选项。您可以让 Compute Engine 提供许可,也可以自带许可。如需详细了解如何在 Windows 上自带许可,请参阅自带许可

  7. (可选)为映像指定其他属性。例如,您可以将此映像组织为映像系列的一部分。

  8. 点击创建以导入该映像。

gcloud

使用 gcloud compute images import 命令创建可启动的 Compute Engine 映像。尽管 Compute Engine 可以启动大多数启动磁盘映像,但 import 命令可确保磁盘具备所需的驱动程序和最新的访客环境软件包,而这些正是启动实例以及通过 SSH 或 RDP 连接到实例的必要条件。

您可以从 Cloud Storage 存储桶或本地工作站导入虚拟磁盘文件。

从工作站导入虚拟磁盘文件时,导入工具会为您将该文件自动上传到 Cloud Storage 存储桶。

如果您愿意,可以在开始导入过程之前自行将虚拟磁盘文件上传到 Cloud Storage,但是您必须将该文件上传到属于导入过程所用同一项目的 Cloud Storage 存储桶中。

gcloud compute images import IMAGE_NAME \
    --source-file SOURCE_FILE

替换以下内容:

  • IMAGE_NAME:您的目标映像的名称。
  • SOURCE_FILE:您的虚拟磁盘文件。此文件可以是本地文件或 Cloud Storage 中存储的文件。如果您的虚拟磁盘是本地文件,则可以提供绝对路径或相对路径。如果您的虚拟磁盘文件已存储在 Cloud Storage 中,则该文件必须位于导入过程所用项目的 Cloud Storage 存储桶内,并且您必须按 gs://BUCKET_NAME/OBJECT_NAME 格式指定该文件的完整路径。

如果要导入具有现有许可的映像,请指定 --byol 标志,如下所示:

gcloud compute images import IMAGE_NAME \
    --source-file SOURCE_FILE --byol

如需了解如何将具备现有许可的映像导入 Google Cloud,请参阅自带许可

如果您指定了本地文件,则上传操作可能需要很长时间才能完成,具体取决于虚拟磁盘的大小和网络连接的速度。根据磁盘大小,导入操作可能需要运行几十分钟。

示例

以下示例会导入存储在 gs://your_gcs_bucket 中名为 my_server.vmdk 的虚拟磁盘。

gcloud compute images import my-imported-image \
    --source-file gs://your_gcs_bucket/my_server.vmdk

可选参数

默认情况下,访客环境软件包会添加到所有导入的启动磁盘映像中。如果您不想使用这些软件包,请在导入命令中添加 --no-guest-environment 标志。

REST

  1. 将虚拟磁盘添加到 Cloud Storage

  2. Cloud Build API 发送 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
     "steps":[
       {
         "args":[
           "-image_name=IMAGE_NAME",
           "-source_file=SOURCE_FILE",
           "-timeout=7000s",
           "-client_id=api"
         ],
         "name":"gcr.io/compute-image-import/gce_vm_image_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "timeout":"7200s",
     "tags":[
       "gce-daisy",
       "gce-daisy-image-import"
     ]
    }
    

    替换以下内容:

    • PROJECT_ID:要向其中导入映像的项目的 ID。
    • IMAGE_NAME:要导入的映像的名称。
    • SOURCE_FILE:Cloud Storage 中映像的 URI,例如 gs://my-bucket/my-image.vmdk

    如需查看可提供的其他 args 值,请参阅虚拟机映像导入 GitHub 页面的“可选标志”部分。

    示例响应

    以下示例响应类似于返回的输出:

    {
     "name": "operations/build/myproject-12345/operation-1578608233418",
     "metadata": {
      "@type": "type.googleapis.com/google.devtools.cloudbuild.v1.BuildOperationMetadata",
      "build": {
       "id": "3a2055bc-ccbd-4101-9434-d376b88b8940",
       "status": "QUEUED",
       "createTime": "2019-09-20T15:55:29.353258929Z",
       "steps": [
        {
         "name": "gcr.io/compute-image-import/gce_vm_image_import:release",
         "env": [
          "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940"
         ],
         "args": [
          "-timeout=7000s",
          "-image_name=my-image",
          "-client_id=api",
          "-data-disk",
          "-source_file=gs://my-bucket/my-image.vmdk"
         ]
        }
       ],
       "timeout": "7200s",
       "projectId": "myproject-12345",
       "logsBucket": "gs://123456.cloudbuild-logs.googleusercontent.com",
       "options": {
        "logging": "LEGACY"
       },
       "logUrl": "https://console.cloud.google.com/cloud-build/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=123456"
      }
    }
    

    您可以通过以下几种方式监控您的版本:

    • 使用返回的 build-id 运行 projects.builds.get 请求。
    • 查看在提供的 logUrl 下托管的日志。

导入许可并将其附加到虚拟磁盘

如需在导入映像时附加许可,请使用以下 gcloud compute images import 命令

gcloud compute images import IMAGE_NAME \
  --source-file=SOURCE_FILE
  --os=OS

替换以下内容:

  • IMAGE_NAME:要创建的映像的名称。
  • SOURCE_FILE:要导入的虚拟磁盘的本地文件或 Cloud Storage URI。
  • OS:要导入的磁盘映像的操作系统。操作系统的许可是根据此标志的值推断出来的;导入时没有明确提供许可信息标志。如需查看受支持值的列表,请参阅 --os 标志

如需详细了解如何查看和附加许可,请参阅查看和附加许可

导入无法启动的虚拟磁盘

控制台

  1. 在 Google Cloud 控制台中,将虚拟磁盘文件上传到 Cloud Storage。
  2. 转到创建映像页面。

    转到“创建映像”页面

  3. 为您的映像指定名称

  4. 来源下,选择虚拟磁盘(VMDK、VHD…)

  5. 浏览到或手动输入 Cloud Storage 文件的存储位置。

  6. 在操作系统下,选择无操作系统。只有数据

  7. (可选)为映像指定其他属性。例如,您可以将此映像组织为映像系列的一部分。

  8. 点击创建以导入该映像。

gcloud

您可以使用 gcloud compute images import 命令创建不可启动的 Compute Engine 映像。 如果您的虚拟磁盘上没有安装可启动的操作系统,请指定 --data-disk 标志。这样就省却了安装驱动程序和访客环境软件包以让映像能够在 Compute Engine 上启动的步骤。

gcloud compute images import IMAGE_NAME \
    --source-file SOURCE_FILE \
    --data-disk

替换以下内容:

  • IMAGE_NAME:您的目标映像的名称。
  • SOURCE_FILE:您的虚拟磁盘文件。此文件可以是本地文件或 Cloud Storage 中存储的文件。如果您的虚拟磁盘是本地文件,您可以使用绝对路径或相对路径。 如果您的虚拟磁盘文件已存储在 Cloud Storage 中,则该文件必须位于导入过程所用项目的 Cloud Storage 存储桶内,并且您必须按 gs://BUCKET_NAME/OBJECT_NAME 格式指定该文件的完整路径。

示例 1:从 Cloud Storage 导入不可启动的虚拟磁盘

以下示例会导入存储在 gs://your_gcs_bucket 中名为 my_disk.vmdk 的虚拟磁盘。

gcloud compute images import my-imported-image \
    --source-file gs://your_gcs_bucket/my_disk.vmdk
    --data-disk

示例 2:通过指定超时值导入大型 VMDK 文件

导入过程的默认超时值为 2 小时。大型 VMDK 文件可能需要长达 24 小时才能导入完成。如果您在导入此类大型文件时未指定 --timeout 标志,则该过程会在 2 小时后失败。

以下示例会导入存储在 gs://your_gcs_bucket 中名为 my_disk.vmdk 的虚拟磁盘。 此次导入的超时值为 24 小时。

gcloud compute images import my-imported-image \
    --source-file gs://your_gcs_bucket/my_disk.vmdk
    --data-disk --timeout=24h

REST

  1. 将虚拟磁盘添加到 Cloud Storage

  2. Cloud Build API 发送 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
      "steps":[
        {
          "args":[
            "-image_name=IMAGE_NAME",
            "-source_file=SOURCE_FILE",
            "-timeout=7000s",
            "-client_id=api",
            "-data_disk"
          ],
          "name":"gcr.io/compute-image-import/gce_vm_image_import:release",
          "env":[
            "BUILD_ID=$BUILD_ID"
          ]
        }
      ],
      "timeout":"7200s",
      "tags":[
        "gce-daisy",
        "gce-daisy-image-import"
      ]
    }
    

    替换以下 args 值:

    • PROJECT_ID:要向其中导入映像的项目的 ID。
    • IMAGE_NAME:要导入的映像的名称。
    • SOURCE_FILE:Cloud Storage 中映像的 URI,例如 gs://my-bucket/my-image.vmdk

使用不允许外部 IP 地址的网络来导入磁盘

如需使用不允许外部 IP 地址的网络导入虚拟磁盘,请完成以下步骤:

  1. 将虚拟磁盘添加到 Cloud Storage

  2. 映像导入过程要求在虚拟磁盘的操作系统上安装软件包管理器。这些软件包管理器可能需要对 Google Cloud 外部的软件包代码库发出请求。若要允许访问这些更新,您需要配置 Cloud NAT。如需了解详情,请参阅使用 Cloud Router 创建 NAT 配置

  3. 配置专用 Google 访问通道。有关了解详情,请参阅配置专用 Google 访问通道

  4. 使用 Google Cloud CLI 或 REST 导入虚拟磁盘。

    导入虚拟磁盘时,系统会在您的项目中创建临时虚拟机。为确保这些临时虚拟机未被分配外部 IP 地址,您必须指定其他标志或参数。

    如需了解详情,请点击以下标签页:

gcloud

使用带有 --no-address 标志的 gcloud compute images import 命令导入您的虚拟磁盘。

gcloud compute images import IMAGE_NAME \
    --source-file=SOURCE_FILE \
    --zone=ZONE \
    --no-address

替换以下内容:

  • IMAGE_NAME:您要创建的磁盘映像的名称。
  • SOURCE_FILE:您的虚拟磁盘文件。该文件可以是本地文件或 Cloud Storage 中存储的文件。如果您的虚拟磁盘是本地文件,则可以提供绝对路径或相对路径。如果您的虚拟磁盘文件已存储在 Cloud Storage 中,则该文件必须位于导入过程所用项目的 Cloud Storage 存储桶内,并且您必须按 gs://BUCKET_NAME/OBJECT_NAME 格式指定该文件的完整路径。
  • ZONE:要在其中创建映像的可用区。如果留空,则使用项目的默认可用区。

REST

Cloud Build API 发送 POST 请求并指定 -no-external-ip 参数。

 POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
 {
   "steps":[
     {
       "args":[
         "-image_name=IMAGE_NAME",
         "-source_file=SOURCE_FILE",
         "-zone=ZONE",
         "-no_external_ip",
         "-timeout=7000s",
         "-client_id=api"
       ],
       "name":"gcr.io/compute-image-import/gce_vm_image_import:release",
       "env":[
         "BUILD_ID=$BUILD_ID"
       ]
     }
   ],
   "timeout":"7200s",
   "tags":[
     "gce-daisy",
     "gce-daisy-image-import"
   ]
 }
 

替换以下内容:

  • PROJECT_ID:要向其中导入映像的项目的 ID。
  • IMAGE_NAME:要导入的映像的名称。
  • SOURCE_FILE:Cloud Storage 中映像的 URI,例如 gs://my-bucket/my-image.vmdk,用于 gcloud compute images import 命令。
  • ZONE:要在其中创建映像的可用区。如果留空,则使用项目的默认可用区。

使用 UEFI 引导加载程序来导入虚拟磁盘

对于大多数虚拟磁盘,Compute Engine 可以检测并成功导入具有 UEFI 引导加载程序的磁盘,而无需额外标志。

但是,对于如下所示的情况,您可能需要在导入期间强制执行 UEFI 启动。

  • 如果映像导入进程在导入期间未检测到 UEFI 引导加载程序。
  • 如果您的磁盘是双重启动磁盘并且具有 hybrid-mbr + UEFI 或 protective-mbr + UEFI 组合。对于双重启动磁盘,导入可能默认为非 UEFI 启动。

gcloud

您可以使用 gcloud compute images import 命令强制执行导入以使用 UEFI 启动。

gcloud compute images import IMAGE_NAME \
    --source-file=SOURCE_FILE \
    --guest-os-features=UEFI_COMPATIBLE

替换以下内容:

  • IMAGE_NAME:要导入的映像的名称。
  • SOURCE_FILE:Cloud Storage 中映像的 URI,例如 gs://my-bucket/my-image.vmdk

示例

以下示例会导入存储在 gs://my-gcs-bucket/ 中名为 my-disk.vmdk 的虚拟磁盘,并强制使用 UEFI 启动。

gcloud compute images import my-imported-image \
    --source-file gs://my-gcs-bucket/my-disk.vmdk \
    --guest-os-features=UEFI_COMPATIBLE

REST

如需强制导入项使用 UEFI 启动,您可以使用 Cloud Build API 并指定 -uefi_compatible 参数。为此,请完成以下步骤:

  1. 将虚拟磁盘添加到 Cloud Storage

  2. Cloud Build API 发送 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
     "steps":[
       {
         "args":[
           "-image_name=IMAGE_NAME",
           "-source_file=SOURCE_FILE",
           "-uefi_compatible",
           "-timeout=7000s",
           "-client_id=api"
         ],
         "name":"gcr.io/compute-image-import/gce_vm_image_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "timeout":"7200s",
     "tags":[
       "gce-daisy",
       "gce-daisy-image-import"
     ]
    }
    

    替换以下内容:

    • PROJECT_ID:要向其中导入映像的项目的 ID。
    • IMAGE_NAME:要导入的映像的名称。
    • SOURCE_FILE:Cloud Storage 中映像的 URI,例如 gs://my-bucket/my-image.vmdk

使用共享 VPC 来导入虚拟磁盘

在导入使用共享 VPC 的虚拟磁盘之前,您必须将 compute.networkUser 角色添加到 Cloud Build 服务账号。如需了解详情,请参阅向 Cloud Build 服务账号授予所需角色

gcloud

使用 gcloud compute images import 命令导入您的虚拟磁盘。

gcloud compute images import IMAGE_NAME \
    --source-file SOURCE_FILE \
    --project SERVICE_PROJECT_ID \
    --zone ZONE \
    --network NETWORK \
    --subnet SUBNET

替换以下内容:

  • IMAGE_NAME:要导入的映像的名称。
  • SOURCE_FILE:您的虚拟磁盘文件。该文件可以是本地文件或 Cloud Storage 中存储的文件。如果您的虚拟磁盘是本地文件,则可以提供绝对路径或相对路径。如果您的虚拟磁盘文件已存储在 Cloud Storage 中,则该文件必须位于导入过程所用项目的 Cloud Storage 存储桶内,并且您必须按 gs://BUCKET_NAME/OBJECT_NAME 格式指定该文件的完整路径。
  • SERVICE_PROJECT_ID:要向其中导入映像的项目的 ID。
  • ZONE:要向其中导入映像的可用区。此区域必须与子网的地区相匹配。例如,如果 SUBNETus-west1。导入区域必须是以下各项之一:us-west1-aus-west1-bus-west1-c
  • NETWORK共享 VPC 网络的完整路径,例如 projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
  • SUBNET共享 VPC 子网的完整路径,例如 projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME

    示例命令

    gcloud compute images import example-image \
     --source-file gs://source-bucket/source-file.vmdk \
     --project my-image-project \
     --zone us-west1-c \
     --network projects/my-vpc-project/global/networks/my-shared-vpc \
     --subnet projects/my-vpc-project/regions/us-west1/subnetworks/my-shared-subnet
    

REST

  1. 将虚拟磁盘添加到 Cloud Storage

  2. Cloud Build API 发送 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/SERVICE_PROJECT_ID/builds
    {
     "steps":[
       {
         "args":[
           "-image_name=IMAGE_NAME",
           "-source_file=SOURCE_FILE",
           "-zone=ZONE",
           "-network=NETWORK",
           "-subnet=SUBNET",
           "-timeout=7000s",
           "-client_id=api"
         ],
         "name":"gcr.io/compute-image-import/gce_vm_image_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "timeout":"7200s",
     "tags":[
       "gce-daisy",
       "gce-daisy-image-import"
     ]
    }
    

    替换以下 args 值:

    • SERVICE_PROJECT_ID:要向其中导入映像的项目的 ID。
    • IMAGE_NAME:要导入的映像的名称。
    • SOURCE_FILE:Cloud Storage 中映像的 URI,例如 gs://my-bucket/my-image.vmdk
    • ZONE:要向其中导入映像的可用区。此区域必须与子网的地区相匹配。例如,如果 SUBNETus-west1。导入区域必须是以下各项之一:us-west1-aus-west1-bus-west1-c
    • NETWORK共享 VPC 网络的完整路径,例如 projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
    • SUBNET共享 VPC 子网的完整路径,例如 projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME

使用自定义 Compute Engine 服务账号导入虚拟磁盘

在映像导入期间,系统会在您的项目中创建临时虚拟机 (VM)。这些临时虚拟机上的映像导入工具必须经过身份验证。

服务账号是关联到虚拟机的身份。服务账号访问令牌可通过实例元数据服务器访问,用于对虚拟机上的映像导入工具进行身份验证。

默认情况下,导入过程使用项目的默认 Compute Engine 服务代理。但是,如果您在项目中停用了默认 Compute Engine 服务账号,或者如果要使用自定义 Compute Engine 服务账号,则需要创建一个服务账号并针对导入过程指定该账号。

gcloud

  1. 将虚拟磁盘添加到 Cloud Storage

  2. 创建服务账号并分配最小角色。如需详细了解如何创建服务账号,请参阅创建和管理服务账号

    指定的 Compute Engine 服务账号必须至少具有以下角色:

    • roles/compute.storageAdmin
    • roles/storage.objectViewer

    如需了解详情,请参阅为 Compute Engine 服务账号授予所需角色

  3. 使用 gcloud compute images import 导入映像。

    gcloud compute images import IMAGE_NAME \
      --source-file SOURCE_FILE \
      --compute-service-account SERVICE_ACCOUNT_EMAIL
    

    替换以下内容:

    • IMAGE_NAME:您的目标映像的名称。
    • SOURCE_FILE:您的虚拟磁盘文件。此文件可以是本地文件或 Cloud Storage 中存储的文件。如果您的虚拟磁盘是本地文件,则可以提供绝对路径或相对路径。如果您的虚拟磁盘文件已存储在 Cloud Storage 中,则该文件必须位于导入过程所用项目的 Cloud Storage 存储桶内,并且您必须按 gs://BUCKET_NAME/OBJECT_NAME 格式指定该文件的完整路径。
    • SERVICE_ACCOUNT_EMAIL:与上一步中创建的 Compute Engine 服务账号关联的电子邮件地址。

    示例

    以下示例使用具有电子邮件地址 image-export-service-account@proj-12345.iam.gserviceaccount.com 的服务账号,导入存储在 gs://your_gcs_bucket 中名为 my_server.vmdk 的可启动虚拟磁盘。

    gcloud compute images import my-imported-image \
      --source-file gs://your_gcs_bucket/my_server.vmdk \
      --compute-service-account image-export-service-account@proj-12345.iam.gserviceaccount.com
    

REST

  1. 将虚拟磁盘添加到 Cloud Storage

  2. 创建服务账号并分配最小角色。如需详细了解如何创建服务账号,请参阅创建和管理服务账号

    指定的 Compute Engine 服务账号必须至少具有以下角色:

    • roles/compute.storageAdmin
    • roles/storage.objectViewer

    如需了解详情,请参阅为 Compute Engine 服务账号授予所需角色

  3. 将虚拟磁盘添加到 Cloud Storage

  4. Cloud Build API 发送 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
    "steps":[
     {
       "args":[
         "-image_name=IMAGE_NAME",
         "-source_file=SOURCE_FILE",
         "-compute_service_account=SERVICE_ACCOUNT_EMAIL",
         "-timeout=7000s",
         "-client_id=api"
       ],
       "name":"gcr.io/compute-image-import/gce_vm_image_import:release",
       "env":[
         "BUILD_ID=$BUILD_ID"
       ]
     }
    ],
    "timeout":"7200s",
    "tags":[
     "gce-daisy",
     "gce-daisy-image-import"
    ]
    }
    

    替换以下内容:

    • PROJECT_ID:要向其中导入映像的项目的 ID。
    • IMAGE_NAME:要导入的映像的名称。
    • SOURCE_FILE:Cloud Storage 中映像的 URI,例如 gs://my-bucket/my-image.vmdk
    • SERVICE_ACCOUNT_EMAIL:与上一步中创建的 Compute Engine 服务账号关联的电子邮件地址。

使映像可启动

如果您的 Compute Engine 自定义映像上有可启动的操作系统,但没有必需的 Compute Engine 驱动程序或访客环境软件包,则可以使用映像导入工具使该映像能够在 Compute Engine 上启动。

请使用 --source-image 标志指定要设为可启动的自定义映像,而不要使用 --source-file 标志指定要导入的新磁盘。

gcloud compute images import IMAGE_NAME \
    --source-image SOURCE_IMAGE_NAME

替换以下内容:

  • IMAGE_NAME:您的目标映像的名称。
  • SOURCE_IMAGE_NAME:您的来源映像的名称。

    如需了解如何将具备现有许可的映像导入 Google Cloud,请参阅自带许可

示例命令

以下示例将一个名为 my-image 的 Compute Engine 映像转换为名为 my-bootable-image 的可启动映像。在此示例中,--os ubuntu-1604 会替换检测的操作系统。

gcloud compute images import my-bootable-image \
    --source-image my-image \
    --os ubuntu-1604

资源清理

存储在 Cloud Storage 上的文件和 Compute Engine 中的映像会产生费用。导入工具会将虚拟磁盘文件导入 Cloud Storage 并创建 Compute Engine 自定义映像。

在确认映像已正确导入并且作为 Compute Engine 实例正确启动后,您就可以从 Cloud Storage 中删除虚拟磁盘文件。该工具会在将文件上传到 Cloud Storage 时输出该文件的 URI。此 URI 的格式如下:gs://BUCKET_NAME/tmpimage/IMAGE_NAME

如果您使用 --data-disk 标志导入了一个映像,然后使用 --source-image 标志再次运行 import 工具,以将该映像设为可启动映像,则第一个映像仍将存在。如果您不需要该映像,请考虑将其删除。如果您为 --image--source-image 标志指定相同的映像名称,则系统会自动覆盖该映像,您无需执行进一步清理。

后续步骤