将自定义映像导出到 Google Cloud Storage

如需将 Compute Engine 启动磁盘数据移出 Compute Engine 项目,您可以将启动磁盘映像以 tar.gz 文件导出到 Cloud Storage。如需在 Compute Engine 上创建新的永久性磁盘时创建要使用的永久性磁盘映像,请参阅创建自定义映像

您可以导出自定义映像作为备份,或者将映像导出到 Cloud Storage 来共享映像。如果您需要与无法访问您的映像的其他项目共享个别映像,此方法特别有用。您也可以选择通过在映像上或其所属的项目上授予 Compute Engine 映像用户角色来共享映像。

下图显示了创建和重用自定义映像的一些典型工作流程。

自定义映像的创建和重用示例
图 1. 自定义映像的创建和重用示例

准备工作

使用单个命令导出映像

将映像导出到 Cloud Storage 的首选方法是使用 gcloud compute images export 命令。此命令使用 Daisy 将导出映像所需的多个步骤连在一起。此命令会假定您已经创建了一个映像(例如,使用 gcloud compute images create 命令创建了映像)。

使用 gcloud 命令行工具,然后运行以下命令:

gcloud compute images export --destination-uri [DESTINATION_URI] \
    --image [IMAGE]

其中:

  • [DESTINATION_URI] 是导出的虚拟磁盘文件的目标 Cloud Storage URI。
  • [IMAGE] 是要导出的磁盘映像的名称。

例如,以下命令会将名为 my-image 的映像从 my-project 导出到名为 my-bucket 的 Cloud Storage 存储分区。默认情况下,映像将以 disk.raw 文件的形式导出并压缩为 tar.gz 文件格式。

gcloud compute images export --destination-uri gs://my-bucket/my-image.tar.gz \
    --image my-image --project my-project

如需了解所有可用的标志,请参阅 gcloud compute images export 参考文档。

手动创建和导出映像

如果 gcloud compute images creategcloud compute images export 命令不符合您的要求,您可以在 Compute Engine 实例中手动创建和导出映像。此过程包含多个独立步骤,您可以先创建一个映像,然后导出一个映像。

在以下示例中,请注意创建的磁盘名为 image-disk

要创建和导出映像,请执行以下操作:

  1. (可选)在创建快照之前,先停止挂接了磁盘的实例。停止实例可确保快照中磁盘内容的完整性。

  2. 创建磁盘的快照,将快照命名为 image-snapshot

    gcloud compute disks snapshot [DISK_NAME] --snapshot-names image-snapshot
    

    其中,[DISK_NAME] 是您从中创建快照的磁盘的名称。

  3. 通过运行以下命令,使用 image-snapshot 快照创建一个名为 image-disk 的新磁盘:

    gcloud compute disks create image-disk --source-snapshot image-snapshot
    
  4. 创建一个临时磁盘 temporary-disk 来保存 tar 文件,并将该磁盘的 [SIZE] 指定为至少比映像磁盘大 50%。

    之后,您可以断开并删除该磁盘。

    gcloud compute disks create temporary-disk --size [SIZE]
    

    其中,[SIZE] 是临时磁盘的大小(以 GB 或 TB 为单位)。例如,指定 100GB 可创建一个 100 千兆字节的磁盘。

  5. 创建一个新实例并在实例上启用 storage-rw 范围。另外,将 image-disktemporary-disk 挂接到实例,以作为具有特定 device-name 属性的辅助磁盘。

    gcloud compute instances create [INSTANCE_NAME] --scopes storage-rw \
        --disk name=image-disk,device-name=image-disk \
        --disk name=temporary-disk,device-name=temporary-disk
    

    其中,[INSTANCE_NAME] 是要创建的实例的名称。

    请注意,您正在传入服务帐号范围,以便在后续步骤中将文件上传到 Google Cloud Storage。

    如有必要,请查看有关启动新实例的详情。

  6. 连接您的实例

    gcloud compute ssh [INSTANCE_NAME]
    

    其中,[INSTANCE_NAME] 是要连接的实例。

  7. 格式化并装载临时磁盘。格式化磁盘将删除临时磁盘的内容。

    sudo mkdir /mnt/tmp
    
    sudo mkfs.ext4 -F /dev/disk/by-id/google-temporary-disk
    
    sudo mount -o discard,defaults /dev/disk/by-id/google-temporary-disk /mnt/tmp
    
  8. (可选)在创建 tar 文件之前,您可以装载映像磁盘并进行其他更改。例如,如果您不希望任何现有的文件包含在映像中,可从 /home 目录中删除这些文件。装载需要修改的磁盘分区,修改磁盘上需要更改的文件,然后在完成这些操作后卸载磁盘。

    1. 创建一个可以装载磁盘或分区的目录。

      sudo mkdir /mnt/image-disk
      
    2. 使用 ls 命令确定您需要装载的具体磁盘或磁盘分区。

      ls /dev/disk/by-id/
      

      该命令会输出磁盘 ID 和分区的列表。例如,以下磁盘具有一个分区表,其中包含一个分区。google-image-disk ID 指向您要从中创建映像的完整磁盘,而 google-image-disk-part1 ID 指向该磁盘上的第一个分区。如果需要更改磁盘,请装载分区,然后从完整磁盘创建映像。

      google-image-disk
      google-image-disk-part1
      
    3. 装载磁盘或分区。如果您的磁盘具有分区表,请装载磁盘的各个分区。例如,装载 google-image-disk-part1

      sudo mount /dev/disk/by-id/google-image-disk-part1 /mnt/image-disk
      

      或者,如果您的磁盘采用了 raw 格式,并且没有分区表,请装载完整的 google-image-disk 磁盘。

      sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
      
    4. 修改 /mnt/image-disk 目录中的文件以配置磁盘上的文件。例如,您可以移除 /mnt/image-disk/home/[USER]/.ssh/authorized_keys 文件以保护您的 SSH 密钥不被共享。

    5. 修改完文件之后,卸载磁盘。

      sudo umount /mnt/image-disk/
      
  9. 为您的映像创建一个 tar 文件。

    完成对映像磁盘上的文件的自定义操作后,请在临时磁盘上创建原始磁盘文件。请注意,该原始磁盘映像的名称必须为“disk.raw”,如下所示:

    sudo dd if=/dev/disk/by-id/google-image-disk of=/mnt/tmp/disk.raw bs=4096
    

    然后对此文件执行 tar 和 gzip 操作,如下所示:

    cd /mnt/tmp
    
    sudo tar czvf myimage.tar.gz disk.raw
    

    该命令将在以下位置创建实例的映像:

    /mnt/tmp/myimage.tar.gz
    
  10. 将映像上传到 Google Cloud Storage

    要将 tar 文件上传到 Google Cloud Storage,请使用预安装在您的实例上的 gsutil 命令行工具。

    1. 使用 gsutil 创建一个存储分区。

      在创建存储分区之前,请务必查看存储分区和命名指南。然后,使用以下命令创建您的存储分区:

      me@example-instance:~$ gsutil mb gs://[BUCKET_NAME]

      其中,[BUCKET_NAME] 是要创建的存储分区的名称。

    2. 将您的文件复制到新的存储分区中。

      me@example-instance:~$ gsutil cp /mnt/tmp/myimage.tar.gz gs://[BUCKET_NAME]

      其中,[BUCKET_NAME] 是要复制文件的存储分区。

大功告成,您已将您的文件导出到 Google Cloud Storage。现在,您可以与其他人共享映像,或使用 tar 文件将新映像添加到 Google Cloud Platform Console 项目。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档