手动导入启动磁盘


如需从物理数据中心、本地工作站上的虚拟机 (VM) 或运行在其他云平台上的虚拟机将启动磁盘映像导入至 Compute Engine,建议您使用虚拟磁盘导入工具,该工具会自动执行本指南中的所有步骤。

如果您不想使用此自动化工具,可以按照本指南中的分步说明手动操作。

此映像导入过程一次只能导入一个磁盘。本指南将着重介绍如何导入启动磁盘映像。

只有在您无法构建或迁移应用以在 Compute Engine 公共映像上运行时,才应导入现有的启动磁盘。公共映像已配置为在 Compute Engine 环境中运行,因此您可以在这些映像上运行应用,而无需担心引导加载程序和操作系统配置。但是在下列情况中,您可能需要导入自己的启动磁盘映像:

  • 您的应用需要一个未作为公共映像提供的操作系统。
  • 您已经拥有一组用于在另一个云平台中创建虚拟机的基础映像。
  • 将应用代码迁移到其中一个公共映像所需的工作量大于完成启动磁盘映像导入过程所需的工作量。

或者,您也可以借助合作伙伴服务来迁移虚拟机。如需了解详情,请参阅将虚拟机迁移到 Compute Engine

概览

要将某个启动磁盘映像导入到 Compute Engine 中,请执行以下过程:

  1. 规划您的导入路径。您必须确定在上传启动磁盘映像之前要在哪里准备该映像,以及该映像在 Compute Engine 环境中启动后,您将如何连接到该映像。
  2. 准备您的启动磁盘,以便它可以在 Compute Engine 环境中启动,而且在启动后可供您访问。
  3. 创建并压缩启动磁盘映像文件。
  4. 将该映像文件上传到 Cloud Storage,并将该映像作为新的自定义映像导入到 Compute Engine 中。
  5. 使用导入的映像创建虚拟机实例,并确保其正常启动。
  6. 如果该映像未能成功启动,您可以通过将启动磁盘映像挂接到另一个实例并重新配置它来解决此问题。
  7. 优化该映像并安装客机环境,以便让您导入的操作系统映像可与元数据服务器进行通信并使用其他 Compute Engine 功能。

要求

启动磁盘要求

启动磁盘必须满足以下要求才能导入到 Compute Engine 中:

  • 我们建议您在来源虚拟机中安装所有可用更新。
  • 如果您构建了自定义操作系统内核,则该内核必须满足硬件和内核配置要求。 大多数现有的 Linux 发行版已经满足这些要求,因此这项要求仅针对自行构建自定义操作系统并在 Compute Engine 上运行该系统的高级用户。
  • 启动磁盘不得大于 2048 GB (2 TB)。
  • 您导入的启动磁盘必须具有即用型 MBR 分区表,或者采用结合了 GPT 分区表与 MBR 引导加载程序的混合配置。
  • 只要启动磁盘从 MBR 引导加载程序正常启动,该启动磁盘上的主分区就可以采用您喜欢的任何格式。
  • 启动磁盘上的引导加载程序不得包含 quietrhgbsplashimage= 内核命令行参数。Compute Engine 不支持在启动时呈现启动画面。您可以在执行引导加载程序配置步骤时从 GRUB 配置中移除这些值。
  • 启动磁盘上的操作系统必须支持 ACPI

映像文件要求

您导入的映像文件必须符合以下要求:

  • 在磁盘上使用 qemu-img check 命令,以对磁盘映像执行一致性检查。
  • 如需导出虚拟磁盘,请使用虚拟机管理软件的导出功能。请勿从虚拟机管理器的文件系统中复制 VMDK 文件。
  • 映像文件必须是受支持的映像
  • 磁盘映像文件名必须是 disk.raw
  • RAW 映像文件的大小必须为 1 GB 的整数倍。例如,该文件的大小可以是 10 GB 或 11 GB,而不能是 10.5 GB。
  • 压缩文件必须是使用了 gzip 压缩tar 实用程序 --format=oldgnu 选项的 .tar.gz 文件(请参阅手册)。

项目要求

当您通过导入的映像创建虚拟机实例时,该实例必须能够访问在启动磁盘上配置的操作系统的外部软件包存储库。

此存储库可以直接从操作系统供应商处进行访问,也可以通过与托管这些存储库的本地基础架构的网络连接进行访问。

如需设置对外部代码库的访问,请在您的项目中完成以下步骤之一:

限制

如需使用不允许外部 IP 地址的网络导入磁盘,您还需要满足额外的网络要求。如需了解详情,请参阅使用不允许外部 IP 地址的网络导入磁盘

映像导入费用

在开始之前,请先了解导入过程的费用。如果将启动磁盘映像文件上传到 Cloud Storage,则您不需要支付入站网络数据传输费用;如果将该映像作为 Compute Engine 自定义映像导入,您也不需要支付任何费用。但是,导入过程中的某些特定步骤会产生费用:

  • 将压缩后的映像文件临时存储在某个 Cloud Storage 标准存储分区中的费用。您必须先将您的文件存放在一个临时 Cloud Storage 存储分区中,然后才能将其作为自定义 Compute Engine 映像导入。在完成导入过程后,您可以移除该存储分区。
  • 完成将自定义映像导入到 Compute Engine 中的操作后,存储自定义映像的费用。
  • 现有数据中心、网络提供商或当前云服务上的出站数据传输可能会产生费用。映像文件即使在压缩之后仍可能非常大,因此在某些平台上,将这些文件复制到 Compute Engine 中可能会产生很高的出站数据传输费用。
  • Compute Engine 永久性磁盘虚拟机实例(可让您在将映像导入 Compute Engine 后对映像进行配置)的费用。

规划并准备您的导入路径

导入磁盘的方法取决于要迁移至 Compute Engine 的系统的当前配置。您需要一个可创建并压缩启动磁盘映像文件的系统,以及一个可将该映像文件上传到 Cloud Storage 的系统。在规划导入路径时,请考虑以下事项:

  • 映像导入路径要求您必须在正常工作的操作系统环境中配置启动磁盘。此过程可能会导致启动磁盘无法在 Compute Engine 环境以外的任何位置启动。您要负责确保在将系统导入到 Compute Engine 中时,不会丢失磁盘上的数据或中断正在运行的业务应用。
  • 确定您现有的系统访问配置,然后规划在将系统导入到 Compute Engine 中后您要如何访问该系统。
    • 如果您的系统已有用户登录或 SSH 配置,那么您可以先仅配置引导加载程序,然后再配置映像以使其能够在 Compute Engine 上以最佳方式运行。您可以通过现有 SSH 配置或交互式串行控制台中的用户直接登录功能来访问实例。
    • 如果您的系统还没有用户登录或 SSH 配置,则您必须配置启动磁盘,以使该磁盘在 Compute Engine 中启动后可供您访问。
  • 导入过程可能需要几个小时或几天的时间,具体取决于启动磁盘的大小和网络连接的速度。
  • 用来创建并压缩启动磁盘映像的系统必须具有足够的存储空间,这样才能在启动磁盘本身以外的某个存储设备上创建映像文件。通常,您的映像和 tar.gz 文件占用的存储空间大小将为启动磁盘本身的 2-3 倍。
  • 了解您要导入的现有系统的文件系统结构。
    • 如果您的操作系统和应用文件分布在多个磁盘上,请分别导入每个磁盘,并使用每个映像为 Compute Engine 虚拟机实例创建唯一的永久性磁盘。
    • 如果您系统的启动卷采用 RAID 配置(即将多个磁盘作为单个逻辑卷),请为整个磁盘阵列创建一个映像,而不要为磁盘阵列中的每个磁盘分别创建一个映像。Compute Engine 永久性磁盘不需要 RAID 配置。
  • 如果您的系统使用可信平台模块或软件级加密对启动磁盘的内容进行了加密,请先解密该启动磁盘,然后再创建启动磁盘映像文件。Google 无法读取经过加密的映像。在您上传映像后,Google 会为您加密这些映像,并且允许您为永久性磁盘Cloud Storage 存储分区提供您自己的加密密钥。

在您找到或创建了可以在其中完成导入过程的系统后,请连接到该系统并配置引导加载程序

准备启动磁盘映像

在正在运行的系统上准备启动磁盘映像,以使它能够在 Compute Engine 环境中正常运行。

  • 在启动磁盘上配置引导加载程序,以使该映像能够在 Compute Engine 上启动。
  • 在启动磁盘上配置 SSH 或用户登录访问权限,以便您能够在将启动磁盘导入 Compute Engine 并作为虚拟机实例启动后对其进行访问。

此过程可能会导致系统无法在 Compute Engine 以外的环境中启动,因此最佳做法是使用您要导入的启动磁盘的副本在隔离的系统上完成此步骤。

配置引导加载程序

在系统上配置引导加载程序,以使它能够在 Compute Engine 上启动。

  1. 连接到您计划导入的启动磁盘所在系统上的终端。

  2. 修改 GRUB 配置文件。此文件通常位于 /etc/default/grub,但在一些早期发行版中,它可能位于某个非标准目录中。

  3. 对 GRUB 配置文件进行以下更改:

    • 移除所有包含 splashimage= 的行。Compute Engine 不支持在启动时呈现启动画面。
    • 移除 rhgbquiet 内核命令行参数。
    • console=ttyS0,38400n8d 添加到内核命令行参数中,以便实例能够与串行控制台交互
  4. 重新生成 grub.cfg 文件。根据您的发行版使用下列其中一个命令。

    • Debian 和 Ubuntu:sudo update-grub
    • RHEL、CentOS、SUSE、openSUSE:sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  5. 修改 /etc/fstab 文件,并移除对除启动磁盘本身及其分区以外的其他所有磁盘和分区的引用。/etc/fstab 中的无效条目可能会导致系统启动过程停止。

配置完引导加载程序后,请创建并压缩磁盘映像文件

配置对映像的 SSH 或用户登录访问权限

在您的映像作为虚拟机实例在 Compute Engine 中运行后,您必须能够访问该实例。您可以使用现有的 SSH 配置连接到该实例,也可以连接到串行控制台并使用用户名和密码进行登录。

创建并压缩磁盘映像文件之前,请先完成 SSH 或用户登录配置。

创建并压缩磁盘映像文件

为您要导入到 Compute Engine 中的系统创建并压缩启动磁盘映像文件。创建并压缩映像文件的过程因用于运行系统的平台而异。

通用方法

在几乎所有的系统上,您都可以执行以下过程来创建可导入到 Compute Engine 中的 RAW 映像文件。您可以在将要导入的运行中系统上完成此过程,也可以将您的启动磁盘作为辅助磁盘挂接到另一个系统上,然后从已停止运行的磁盘创建启动磁盘映像。请确保您有足够的可用存储空间,以用于临时存放磁盘映像文件。本示例将为一个正在运行的系统创建映像。

  1. 在您要导入的启动磁盘所在的系统上连接到终端。

  2. 使用 lsblk 命令确定您要从中创建映像的来源启动磁盘,以及具有足够空间以用于写入映像文件的位置。在此示例中,/dev/sda 是来源启动磁盘,/dev/sdb 是装载在 /tmp 目录的大容量辅助磁盘。虽然 /dev/sda 正在运行,但您仍然可以通过其创建映像。建议您最好在当前未在处理数据或运行应用的无提示系统上执行此操作。

    lsblk
    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0  100G  0 disk
    ├─sda1   8:1    0   96G  0 part /
    ├─sda2   8:2    0    1K  0 part
    └─sda3   8:5    0    4G  0 part [SWAP]
    sdb      8:16   0  500G  0 disk /tmp
    sr0     11:0    1 1024M  0 rom
    
  3. 从您的启动磁盘创建映像文件。

    sudo dd if=/dev/sda of=/tmp/disk.raw bs=4M conv=sparse
    
  4. 切换到您写入 disk.raw 文件的目录。

    cd /tmp
    
  5. 将 RAW 磁盘压缩为 tar.gz 格式。此步骤会压缩映像文件,以便您更快速地将其上传到 Cloud Storage。在 OSX 上,请安装 gtar 并在此步骤中使用该格式(而不要使用 tar)。

    tar --format=oldgnu -Sczf /tmp/compressed-image.tar.gz disk.raw
    

AWS EC2

如需详细了解如何将 Amazon 系统映像 (AMI) 和虚拟磁盘映像从 Amazon Web Services (AWS) 导入 Compute Engine,请参阅从 AWS 导入映像

VirtualBox

如果您已在 VirtualBox 环境中准备好您的系统,则可以使用 VBoxManage 工具将 .vdi.qcow2 磁盘映像转换为 disk.raw 格式。

  1. 关停您要导入的 VirtualBox 客机,注意将 GUEST_NAME 替换为您的客机的名称。您可以使用 VirtualBox 界面或使用 VBoxManage 实用程序来关停客机。

    VBoxManage controlvm GUEST_NAME acpipowerbutton
  2. 使用 VBoxManage 实用程序将客机映像转换为 RAW 格式,注意将 GUEST_NAME 替换为您的客机映像的路径。此客机映像可作为 vdiqcow2 文件提供:

    VBoxManage clonemedium GUEST_NAME ~/disk.raw --format RAW
  3. 将 RAW 磁盘压缩为 tar.gz 格式。此步骤会压缩映像文件,以便您更快速地将其上传到 Cloud Storage。在 OSX 上,请安装 gtar 并在此步骤中使用该格式(而不要使用 tar)。

    sudo tar --format=oldgnu -Sczf /tmp/compressed-image.tar.gz disk.raw
    

该映像文件已经过压缩且准备就绪,可上传到 Cloud Storage。

将映像导入到您的自定义映像列表中

将该文件上传到 Cloud Storage,然后将该映像导入您的自定义映像列表中。在映像导入步骤中,您还可以选择加密映像

通过控制台或 Google Cloud CLI 工具导入映像:

控制台

compressed-image.tar.gz 文件复制到本地工作站,然后使用 Google Cloud 控制台创建存储桶并上传该文件

  1. 在 Google Cloud 控制台中,转到 Cloud Storage 浏览器页面。

    转到浏览器

  2. 在页面顶部,点击创建存储分区
  3. 指定唯一的存储分区名称、标准存储类别以及您要用来存储映像文件的位置。
  4. 点击创建以创建存储分区。“浏览器”页面随即会切换到新存储分区。
  5. 点击页面顶部的上传文件
  6. 在文件对话框中,选择您从系统下载的 compressed-image.tar.gz 文件。系统会从您的本地工作站上传该文件。此步骤可能需要几个小时才会完成,具体取决于压缩映像文件的大小和网络连接的速度。

将映像上传到 Cloud Storage 后,请将映像文件导入您的自定义映像列表。

  1. 在 Google Cloud 控制台中,转到映像页面。

    转到“映像”

  2. 在页面顶部,点击创建映像
  3. 名称字段中,为映像指定一个唯一的名称。
  4. (可选)为您的新映像指定映像系列,或为该映像配置特定的加密设置。
  5. 点击来源菜单并选择 Cloud Storage 文件
  6. 输入您上传到 Cloud Storage 的 compressed-image.tar.gz 文件的路径。

    BUCKET_NAME/compressed-image.tar.gz
  7. 点击创建以导入映像。 此过程可能需要几分钟,具体取决于启动磁盘映像的大小。

该映像现已包含在映像页面中。您可以使用此导入的映像创建虚拟机。如果启动失败,请验证并确保您正确配置了引导加载程序。

gcloud 和 gsutil

使用 gsutil 工具和 gcloud CLI 上传压缩的启动磁盘映像文件。您可以在之前创建启动磁盘映像的系统上完成此过程,也可以将该文件复制到另一个系统中,然后在该系统上完成上传过程。

  1. 在您要从中上传 compressed-image.tar.gz 的系统上安装并初始化 gcloud CLI

  2. 使用 gsutil 工具创建新的 Cloud Storage 存储分区。

    gsutil mb gs://BUCKET_NAME
  3. compressed-image.tar.gz 文件上传到新存储分区。

    gsutil cp compressed-image.tar.gz gs://BUCKET_NAME
  4. 将该映像文件导入为新的自定义映像。

    gcloud compute images create IMAGE_NAME --source-uri gs://BUCKET_NAME/compressed-image.tar.gz
    

    请替换以下内容:

    • IMAGE_NAME:您导入的映像的名称。
    • BUCKET_NAME:存储已导入映像的存储分区的名称。

该映像现已包含在自定义映像列表中。您可以使用此导入的映像创建虚拟机。如果启动失败,请验证并确保您正确配置了引导加载程序。

gcloud compute images list --no-standard-images
NAME                                            PROJECT                  FAMILY                    DEPRECATED  STATUS
[IMAGE_NAME]                                    [PROJECT_ID]                                                   READY

测试导入的映像以确保其正常运行

确认已导入的映像是否可按预期工作。然后通过某个使用导入的映像的启动磁盘来创建虚拟机。

控制台

  1. 在 Google Cloud 控制台中,转到创建实例页面。

    转到“创建实例”

  2. 启动磁盘部分,点击更改,然后执行以下操作:

    1. 选择自定义映像标签页。
    2. 要选择映像项目,请点击选择项目,然后执行以下操作:
      1. 选择包含该映像的项目。
      2. 点击打开
    3. 映像列表中,点击您导入的映像。
    4. 选择启动磁盘的类型和大小。
    5. 如需确认您的启动磁盘选项,请点击选择
  3. 点击创建

gcloud

gcloud compute instances create VM_NAME --zone ZONE --image IMAGE_NAME

请替换以下内容:

  • VM_NAME:虚拟机的唯一名称。
  • ZONE:您创建独立磁盘的可用区。
  • IMAGE_NAME:您导入的映像的名称。

在您创建虚拟机后,请确认该虚拟机已正确启动。请检查串行端口输出:

控制台

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

    转到“实例”

  2. 在虚拟机列表中,点击您通过导入的映像创建的虚拟机的名称。虚拟机详细信息页面随即打开。
  3. 日志部分,点击相应的串行端口以展开并查看此虚拟机的串行端口输出。

如果虚拟机在 Booting from Hard Disk 0... 时停止,您必须从 Compute Engine 环境内部进行问题排查,或者您可以在原始系统上重新配置启动磁盘并重复执行导入过程。

gcloud

gcloud compute instances get-serial-port-output VM_NAME

如果虚拟机在 Booting from Hard Disk 0... 时停止,您必须从 Compute Engine 环境内部进行问题排查,或者您可以在原始系统上重新配置启动磁盘并重复执行导入过程。

您也可以通过连接到虚拟机来测试虚拟机。通过以下选项之一连接到虚拟机:

  • SSH:如果虚拟机具有有效的 SSH 配置,您便可以使用 SSH 和您的私钥连接到该虚拟机。您可以在虚拟机实例页面上找到虚拟机实例 IP 地址。
  • 串行控制台:如果您需要在不使用 SSH 的情况下直接登录到虚拟机,则可以启用串行控制台,并使用用户名和密码登录。

后续步骤