Exporting a custom image to Cloud Storage

If you need to move your Compute Engine boot disk data outside of your Compute Engine project, you can export a boot disk image to Cloud Storage as a tar.gz file. If you need to create a persistent disk image to use when you create new persistent disks on Compute Engine, read Creating a custom image.

You can export a custom image as backup or for sharing by exporting the image to Cloud Storage. This method is ideal for sharing individual images with other projects that do not have access to your images. Alternatively, you can share images by granting the Compute Engine image user role on the image or on the project that contains it.

The following diagram shows some typical workflows for the creation and reuse of a custom image.

Creating and reusing custom images.
Figure 1. Examples of creation and reuse of custom images

Before you begin

Enable the Cloud Build API

The virtual appliance export tool uses Cloud Build.

In most cases, gcloud compute images export attempts to grant these permissions to the Cloud Build service account. However, you can manually grant these permissions to ensure that the required permissions are in effect.

Console

  1. In the Google Cloud Console, enable the Cloud Build API.

    Enable the Cloud Build API

    When you enable the Cloud Build API from the console, Compute Engine grants the Cloud Build service account the following roles so that the Cloud Build service can export instances from Compute Engine:

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

    The export tool also uses the default Compute Engine service account. By default, the Compute Engine service account has the Cloud IAM project editor role. If this role is removed, the export process might fail. To add the role back to the service account, see Granting access. For more information about the Compute Engine default service account, see Compute Engine default service account.

gcloud

To set up the Cloud Build service using gcloud command-line tool, complete the following steps:

  1. Using the gcloud command-line tool, enable Cloud Build.

    gcloud services enable cloudbuild.googleapis.com

    The export tool also uses the default Compute Engine service account. By default, the Compute Engine service account has the Cloud IAM project editor role. If this role is removed, the export process might fail. To add the role back to the service account, see Granting access. For more information about the Compute Engine default service account, see Compute Engine default service account.

  2. Add the compute.admin role to the service account for the Cloud Build API.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/compute.admin
    
  3. Add the iam.serviceAccountUser role to the service account for the Cloud Build API.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountUser
    
  4. Add the iam.serviceAccountTokenCreator role to the service account for the Cloud Build API.

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

    Replace the following:

Exporting an image with a single command

The preferred way to export an image to Cloud Storage is to use the gcloud compute images export command. This command uses Daisy to chain together the multiple steps that are required to export an image. It assumes that you have already created an image, for example, with the gcloud compute images create command.

Using the gcloud command-line tool, run:

gcloud compute images export \
    --destination-uri destination-uri \
    --image image-name

Replace the following:

  • destination-uri: The Cloud Storage URI destination for the exported virtual disk file.
  • image-name: The name of the disk image to export.

For example, the following command exports an image named my-image from my-project to a Cloud Storage bucket named my-bucket. By default, the image is exported as a disk.raw file and is compressed into the tar.gz file format.

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

For a list of all available flags see the gcloud compute images export reference documentation.

Creating and exporting an image manually

If the gcloud compute images create and gcloud compute images export commands do not meet your requirements, you can create and export an image manually from a Compute Engine instance. This process has discrete steps to first create an image and then export an image.

In the following example, note the created disk is called image-disk.

To create and export an image:

  1. Optionally, stop the instance that the disk is attached to before you create the snapshot. Stopping the instance ensures the integrity of the disk contents in the snapshot. Replace disk-name with the name of the disk that you want to use to create the snapshot.

  2. Create a snapshot of the disk. Name the snapshot image-snapshot.

    gcloud compute disks snapshot disk-name \
        --snapshot-names image-snapshot
  3. Use the image-snapshot snapshot to create a new disk named image-disk by running the following command:

    gcloud compute disks create image-disk \
        --source-snapshot image-snapshot
  4. Create a temporary disk named temporary-disk to hold your tar file, and specify the size of the disk to be at least 50% larger than the image disk.

    You can detach and delete the disk afterwards.

    gcloud compute disks create temporary-disk \
        --size size

    where size is the size, in gigabytes or terabytes, of the temporary disk. For example, specify 100GB to create a 100-gigabyte disk.

  5. Create an instance and enable storage-rw scope on the instance. Also, attach the image-disk and the temporary-disk to the instance as secondary disks with specific device-name attributes. Replace instance-name with the name of the instance to create.

    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

    Note that you're passing in service account scopes so that you can upload your file to Cloud Storage in later steps.

    Review the details about starting a new instance if necessary.

  6. Connect to your instance. Replace instance-name with the name of the instance to connect to.

    gcloud compute ssh instance-name
  7. Format and mount the temporary disk. Formatting the disk deletes the contents of the temporary disk.

    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. Optionally, you can mount the image disk and make additional changes before you create the tar file. For example, you might want to delete any existing files from the /home directory if you do not want them to be part of your image. Mount the disk partitions that you need to modify, modify the files on the disk that you need to change, and then unmount the disk when you are done.

    1. Create a directory where you can mount your disk or partition.

      sudo mkdir /mnt/image-disk
    2. Use the ls command to determine which disk or disk partition you need to mount.

      ls /dev/disk/by-id/

      The command prints a list of disk IDs and partitions. For example, the following disk has a partition table with one partition. The google-image-disk ID points to the full disk from which you want to create an image. The google-image-disk-part1 ID points to the first partition on this disk. Mount the partition if you need to make changes to the disk, then create the image from the full disk.

      google-image-disk
      google-image-disk-part1
      
    3. Mount the disk or the partition. If your disk has a partition table, mount the individual partitions for your disk. For example, mount google-image-disk-part1.

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

      Alternatively, if your disk is raw formatted with no partition table, mount the full google-image-disk disk.

      sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
    4. Modify the files in the /mnt/image-disk directory to configure the files on the disk. As an example, you might remove the /mnt/image-disk/home/[USER]/.ssh/authorized_keys file to protect your SSH keys from being shared.

    5. After you have finished modifying files, unmount the disk.

      sudo umount /mnt/image-disk/
  9. Create a tar file of your image.

    When you finish customizing the files on the image disk, create a raw disk file on your temporary disk. The name of the raw disk image must be 'disk.raw':

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

    Then tar and gzip this file:

    cd /mnt/tmp

    sudo tar czvf myimage.tar.gz disk.raw

    This command creates an image of the instance in the following location:

    /mnt/tmp/myimage.tar.gz

  10. Upload the image into Cloud Storage.

    To upload the tar file to Cloud Storage, use the gsutil command line tool that comes preinstalled on your instance.

    1. Create a bucket using gsutil.

      Make sure to review the bucket and object naming guidelines before you create your bucket. Then, create your bucket using the following command. Replace bucket-name with the name of the bucket to create.

      me@example-instance:~$ 
      gsutil mb gs://bucket-name
    2. Copy your file to your new bucket. Replace bucket-name with the name of the bucket to copy the file to.

      me@example-instance:~$ 
      gsutil cp /mnt/tmp/myimage.tar.gz gs://bucket-name

You have exported your file into Cloud Storage. You can now share the image with other people, or use the tar file to add a new image to a Google Cloud Console project.

What's next

Czy ta strona była pomocna? Podziel się z nami swoją opinią:

Wyślij opinię na temat...

Compute Engine Documentation