导入虚拟磁盘

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

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

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

准备工作

启用 Cloud Build API

虚拟设备导入工具使用 Cloud Build

在大多数情况下,gcloud compute images import 会尝试将这些权限授予 Cloud Build 服务帐号。不过,您可以手动授予这些权限,以确保所需权限已生效。

控制台

  1. 启用 Cloud Build API。

    启用 Cloud Build API

    通过控制台启用 Cloud Build API 时,Compute Engine 会向 Cloud Build 服务帐号授予以下角色,以便 Cloud Build 服务可以将实例导入 Compute Engine 中:

    • roles/iam.serviceAccountTokenCreator
    • roles/compute.admin
    • roles/iam.serviceAccountUser

    导入工具还会使用默认的 Compute Engine 服务帐号。默认情况下,Compute Engine 服务帐号具有 Cloud IAM Project Editor 角色。如果移除此角色,导入过程可能会失败。如需将该角色添加回服务帐号,请参阅授予访问权限。 如需详细了解 Compute Engine 默认服务帐号,请参阅 Compute Engine 默认服务帐号

gcloud

如需使用 gcloud 命令行工具设置 Cloud Build 服务,请完成以下步骤:

  1. 启用 Cloud Build。

    gcloud services enable cloudbuild.googleapis.com

    导入工具还会使用默认的 Compute Engine 服务帐号。默认情况下,Compute Engine 服务帐号具有 Cloud IAM Project Editor 角色。如果移除此角色,导入过程可能会失败。如需将该角色添加回服务帐号,请参阅授予访问权限。 如需详细了解 Compute Engine 默认服务帐号,请参阅 Compute Engine 默认服务帐号

  2. compute.admin 角色添加到 Cloud Build API 服务帐号。

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member serviceAccount:PROJECT_NUM@cloudbuild.gserviceaccount.com \
       --role roles/compute.admin
    
  3. iam.serviceAccountUser 角色添加到 Cloud Build API 服务帐号。

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member serviceAccount:PROJECT_NUM@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountUser
    
  4. iam.serviceAccountTokenCreator 角色添加到 Cloud Build API 服务帐号。

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member serviceAccount:PROJECT_NUM@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountTokenCreator
    

    替换以下内容:

支持的操作系统

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

  • Linux 操作系统:
    • CentOS 6、CentOS 7 和 CentOS 8
    • Debian 8、Debian 9
    • Red Hat Enterprise Linux 6、Red Hat Enterprise Linux 7 和 Red Hat Enterprise Linux 8
    • Ubuntu 14.04 LTS、Ubuntu 16.04 LTS 和 Ubuntu 18.04 LTS
    • SUSE Linux Enterprise Server 12、SUSE Linux Enterprise Server 15 和 OpenSUSE 15
  • Windows 操作系统:
    • Windows Server 2012、Windows Server 2012 R2、Windows Server 2012 R2 Core
    • Windows Server 2016、Windows Server 2016 Core
    • Windows Server 2019、Windows Server 2019 Core
    • Windows 7 SP1(32 位和 64 位,仅支持自带许可 (BYOL))
    • Windows 8.1(32 位和 64 位,仅支持自带许可 (BYOL))
    • Windows 10,版本 1709、1803、1903、1909(32 位和 64 位,仅支持自备许可 (BYOL))

限制

此功能具有以下限制:

  • Linux 虚拟磁盘必须使用 grub 作为引导加载程序。
  • Windows 或 Linux 均不支持 UEFI 引导加载程序。
  • Linux 虚拟磁盘必须符合与自定义映像相同的要求,包括对 Virtio-SCSI 存储控制器设备的支持。
  • 当安装在 Windows 虚拟磁盘上时,应用白名单软件(例如 Carbon Black 的 Cb Protection)可能会导致导入过程失败。 在导入之前,您可能需要卸载此类软件。
  • 如果要导入运行 RHEL 的虚拟磁盘,您必须在导入之前将 python-boto 软件包安装到该虚拟磁盘上,这样系统才能支持自带许可 (BYOL)。
  • 虚拟磁盘上的操作系统必须支持 ACPI

权限

导入虚拟磁盘文件时,映像导入工具会执行多步操作,包括将您的文件上传到 Cloud Storage,创建新的存储分区(如果需要),将该文件下载到 Compute Engine,然后在 Compute Engine 中基于该磁盘文件创建映像。上述过程会自动进行。Google 建议您具有以下角色,以便在使用此功能时获得无缝顺畅的体验:

  • roles/storage.admin
  • roles/viewer
  • roles/resourcemanager.projectIamAdmin

导入过程会在其工作流程中使用默认 Compute Engine 服务帐号。默认情况下,此帐号拥有 roles/editor 权限,该权限对于这一过程就已足够。但是,如果您修改了 Compute Engine 服务帐号的默认角色和权限,请确保该服务帐号仍然应用以下角色:

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

导入虚拟磁盘

检查兼容性

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

导入可启动的虚拟磁盘

控制台

  1. 在 Google Cloud Console 中,将虚拟磁盘文件上传到 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,但是您必须将该文件上传到属于导入过程所用同一项目的存储分区中。

gcloud compute images import image-name \
    --source-file source-file \
    --os os

替换以下内容:

  • image-name:您的目标映像的名称。
  • source-file:您的虚拟磁盘文件。该文件可以是本地文件或 Cloud Storage 中存储的文件。如果您的虚拟磁盘是本地文件,则可以提供绝对路径或相对路径。如果您的虚拟磁盘文件已存储在 Cloud Storage 中,则该文件必须位于导入过程所用项目的存储分区内,并且您必须按 gs://bucket-name/object-name 格式指定该文件的完整路径。
  • os--source-file 的操作系统。 如需获取受支持值的列表,请查看 gcloud compute images import 命令的 --os 标志选项。

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

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

示例命令

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

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

可选参数

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

API

  1. 将虚拟设备添加到 Cloud Storage

  2. 在 API 中,创建一个对 Cloud Build API 发出的 POST 请求。

    POST https://cloudbuild.googleapis.com/v1/projects/project-id/builds
    {
     "steps":[
       {
         "args":[
           "-image_name=image-name",
           "-source_file=source-file",
           "-os=os",
           "-timeout=timeout",
           "-client_id=api"
         ],
         "name":"gcr.io/compute-image-tools/gce_vm_image_import:release",
         "env":[
           "BUILD_ID=$BUILD_ID"
         ]
       }
     ],
     "timeout":"timeout",
     "tags":[
       "gce-daisy",
       "gce-daisy-image-import"
     ]
    }
    

    替换以下内容:

    • project-id:要向其中导入映像的项目的 ID。
    • image-name:要导入的映像的名称。
    • timeout:构建作业在失败并发送 TIMEOUT 消息前应持续的最长时间。在 API 中,该时间必须以秒为单位指定。超时值 7200s 适用于大多数情况。
    • source-file:Cloud Storage 中映像的 URI,例如 gs://my-bucket/my-image.vmdk
    • os:映像的操作系统。

    如需查看可提供的其他 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-tools/gce_vm_image_import:release",
         "env": [
          "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940"
         ],
         "args": [
          "-timeout=7056s",
          "-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/gcr/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=123456"
      }
    }
    

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

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

导入不可启动的虚拟磁盘

控制台

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

    转到“创建映像”页面

  3. 为您的映像指定名称
  4. 来源下,选择虚拟磁盘(VMDK、VHD…)
  5. 浏览到或手动输入 Cloud Storage 文件的存储位置。
  6. 在操作系统下,选择无操作系统。只有数据
  7. (可选)为您的映像指定其他属性。例如,您可以将此映像组织为映像系列的一部分。
  8. 点击创建以导入该映像。

gcloud

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

gcloud compute images import image-name \
    --source-file source-file \
    --data-disk

替换以下内容:

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

示例命令

以下示例会导入存储在 gs://my-gcs-bucket/ 中名为 my-disk.vmdk 的虚拟磁盘。

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

API

  1. 将虚拟设备添加到 Cloud Storage

  2. 在 API 中,创建一个对 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=timeout",
            "-client_id=api",
            "-data_disk"
          ],
          "name":"gcr.io/compute-image-tools/gce_vm_image_import:release",
          "env":[
            "BUILD_ID=$BUILD_ID"
          ]
        }
      ],
      "timeout":"timeout",
      "tags":[
        "gce-daisy",
        "gce-daisy-image-import"
      ]
    }
    

    替换以下 args 值:

    • project-id:要向其中导入映像的项目的 ID。
    • image-name:要导入的映像的名称。
    • source-file:Cloud Storage 中映像的 URI,例如 gs://my-bucket/my-image.vmdk
    • timeout:构建作业在失败并发送 TIMEOUT 消息前应持续的最长时间。在 API 中,该时间必须以秒为单位指定。超时值 7200s 适用于大多数情况。

使映像可启动

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

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

gcloud compute images import image-name \
    --source-image source-image-name \
    --os os

替换以下内容:

  • image-name:您的目标映像的名称。
  • source-image-name:您的来源映像的名称。
  • os--source-image 的操作系统。 如需获取受支持值的列表,请查看 gcloud compute images import 命令的 --os 标志选项。

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

示例命令

以下示例将一个名为 my-image 的 Compute Engine 映像转换为名为 my-bootable-image 的可启动映像。在此示例中,映像上安装的操作系统是 Ubuntu 16.04。

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 标志指定相同的映像名称,则系统会自动覆盖该映像,您无需执行进一步清理。

后续步骤