Stay organized with collections
Save and categorize content based on your preferences.
If you have virtual disks in your on-premises environment with software and
configurations that you need, occasionally referred to as golden disks or
golden images, you can save time by importing those virtual disks into
Distributed Cloud and using the resulting image to create virtual
machines. The import tool supports RAW and QCOW image formats.
Before you begin
Before continuing, ensure that you have the following:
The gdcloud CLI
downloaded, installed, and configured. All CLI commands for
GDC use the gdcloud or kubectl CLI, and require
an operating system (OS) environment.
Login access to the Kubernetes cluster. Follow the CLI steps in
Sign in
to sign in to the Kubernetes cluster.
Request permissions and access
To perform the tasks listed in this page, you must have the Project
VirtualMachine Admin role. Follow the steps to
verify
that you have the Project VirtualMachine Admin (project-vm-admin) role in the namespace
of the project where the VM resides.
For VM operations using the GDC console or the gdcloud CLI,
request your Project IAM Admin to assign you the roles listed in the previous
paragraph and the Project Viewer (project-viewer) role.
To get the permissions you need to import images, ask your Organization IAM
Admin to grant you the Project VirtualMachine Image Admin
(project-vm-image-admin) role for your project.
gdcloud
Use the gdcloud compute images import command to create a bootable image.
The import command ensures that the disk has the required packages,
including the guest environment, which is required to configure credentials
for connecting to the instance using secure shell (SSH) on Linux and Remote
Desktop Protocol (RDP) on Windows.
On Linux, the command also installs packages for network time protocol (NTP)
and cloud-init for the instance to run properly in
GDC.
You can import virtual disk files directly from your workstation. The import
tool automatically uploads the file to an object storage bucket in your
project.
IMAGE_NAME: the name of your destination image. The
name must be no longer than 35 characters.
SOURCE_FILE: your virtual disk file. This file is a
local file on your workstation. You can provide an absolute or relative
path.
IMAGE_OS: the OS on the disk to import.
TIMEOUT: the time an import can last before it fails
with "TIMEOUT". For example, if you specify 2h, the process fails after 2 hours.
The default timeout is 1h.
The upload operation can take an extended period of time depending on the size
of your virtual disk and the speed of your network connection. The import
operation can take tens of minutes to run depending on the size of the disk.
API
Before starting the import process with the API, you need to upload your
virtual disk to an object storage bucket named vm-images-bucket. To create
an object storage bucket, see
Create storage buckets for projects.
To import a virtual disk through the API, do the following:
Create a VirtualMachineImageImport object in the Management API server
to start the image import process:
The name of the image to import. The name must be no longer than 35 characters.
PROJECT_ID
The project ID for the project where you want to import the image.
SOURCE_FILE
The name of the source file that contains the upload of the virtual disk to object storage. This value is the section of the object storage path after vm-images-bucket/.
OPERATING_SYSTEM
The OS on the disk to import.
DISK_SIZE
The minimum size a disk must have to be created with this image. We recommend that at least a 20% buffer is used on top of the file system size of the original image. For example: use at least 12Gi for a virtual disk with original file system size 10Gi.
Monitor the progress of the import by querying the status of the
VirtualMachineImageImport object:
The import process involves uploading your virtual disk file to object storage.
If you use the gdcloud CLI, the object is cleaned up when the command
finishes, whether or not it was successful. If the command is interrupted, or
the image import is done with the API, the virtual disk file might remain in
the object storage bucket named vm-images-bucket until you manually delete
the file.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-25 UTC."],[[["\u003cp\u003eYou can import on-premises virtual disks (RAW and QCOW formats) into Distributed Cloud to create reusable images for virtual machines, which helps save time and effort.\u003c/p\u003e\n"],["\u003cp\u003eImporting virtual disks can be accomplished either by using the \u003ccode\u003egdcloud\u003c/code\u003e CLI, which automatically uploads the file and installs necessary packages, or through the Virtual Machine Manager API after manually uploading the disk to an object storage bucket.\u003c/p\u003e\n"],["\u003cp\u003eBefore importing, you need the \u003ccode\u003egdcloud\u003c/code\u003e or \u003ccode\u003ekubectl\u003c/code\u003e CLI, access to the Kubernetes cluster, and the appropriate permissions, such as the Project VirtualMachine Image Admin role.\u003c/p\u003e\n"],["\u003cp\u003eThe import process, whether using the CLI or API, requires you to specify the image name, source file or bucket details, and the operating system of the disk being imported.\u003c/p\u003e\n"],["\u003cp\u003eIf using the API to import virtual disks, you must manually manage and delete the virtual disk files in the \u003ccode\u003evm-images-bucket\u003c/code\u003e, but the CLI automatically cleans up the object storage upon command completion.\u003c/p\u003e\n"]]],[],null,["# Import virtual disks\n\nIf you have virtual disks in your on-premises environment with software and\nconfigurations that you need, occasionally referred to as *golden disks* or\n*golden images*, you can save time by importing those virtual disks into\nDistributed Cloud and using the resulting image to create virtual\nmachines. The import tool supports RAW and QCOW image formats.\n\nBefore you begin\n----------------\n\nBefore continuing, ensure that you have the following:\n\n- The [gdcloud CLI](/distributed-cloud/hosted/docs/latest/gdch/resources/gdcloud-overview) downloaded, installed, and configured. All CLI commands for GDC use the `gdcloud` or `kubectl` CLI, and require an operating system (OS) environment.\n\n\u003c!-- --\u003e\n\n- Login access to the Kubernetes cluster. Follow the CLI steps in\n [Sign in](/distributed-cloud/hosted/docs/latest/gdch/application/ao-user/iam/sign-in#cli)\n to sign in to the Kubernetes cluster.\n\n | **Note:** Record the path to the generated file, `/tmp/admin-kubeconfig-with-user-identity.yaml`. Use the path to replace \u003cvar translate=\"no\"\u003eMANAGEMENT_API_SERVER\u003c/var\u003e in these instructions.\n\n### Request permissions and access\n\nTo perform the tasks listed in this page, you must have the Project\nVirtualMachine Admin role. Follow the steps to\n[verify](/distributed-cloud/hosted/docs/latest/gdch/application/ao-user/vms/preparation#verify-user-access)\nthat you have the Project VirtualMachine Admin (`project-vm-admin`) role in the namespace\nof the project where the VM resides.\n\nFor VM operations using the GDC console or the gdcloud CLI,\nrequest your Project IAM Admin to assign you the roles listed in the previous\nparagraph and the Project Viewer (`project-viewer`) role.\n\nImport virtual disks\n--------------------\n\nYou can import your virtual disks using either the\ngdcloud CLI or the\n[Virtual Machine Manager API](/distributed-cloud/hosted/docs/latest/gdch/apis/service/virtualmachine/vmm-api-overview).\n\nTo get the permissions you need to import images, ask your Organization IAM\nAdmin to grant you the Project VirtualMachine Image Admin\n(`project-vm-image-admin`) role for your project. \n\n### gdcloud\n\nUse the `gdcloud compute images import` command to create a bootable image.\n\nThe `import` command ensures that the disk has the required packages,\nincluding the guest environment, which is required to configure credentials\nfor connecting to the instance using secure shell (SSH) on Linux and Remote\nDesktop Protocol (RDP) on Windows.\n\nOn Linux, the command also installs packages for network time protocol (NTP)\nand `cloud-init` for the instance to run properly in\nGDC.\n\nYou can import virtual disk files directly from your workstation. The import\ntool automatically uploads the file to an object storage bucket in your\nproject. \n\n gdcloud compute images import \u003cvar translate=\"no\"\u003eIMAGE_NAME\u003c/var\u003e \\\n --source-file=\u003cvar translate=\"no\"\u003eSOURCE_FILE\u003c/var\u003e \\\n --os=\u003cvar translate=\"no\"\u003eIMAGE_OS\u003c/var\u003e \\\n --timeout=\u003cvar translate=\"no\"\u003eTIMEOUT\u003c/var\u003e\n\nReplace the following variables:\n\n- \u003cvar translate=\"no\"\u003eIMAGE_NAME\u003c/var\u003e: the name of your destination image. The name must be no longer than 35 characters.\n- \u003cvar translate=\"no\"\u003eSOURCE_FILE\u003c/var\u003e: your virtual disk file. This file is a local file on your workstation. You can provide an absolute or relative path.\n- \u003cvar translate=\"no\"\u003eIMAGE_OS\u003c/var\u003e: the OS on the disk to import.\n- \u003cvar translate=\"no\"\u003eTIMEOUT\u003c/var\u003e: the time an import can last before it fails with \"TIMEOUT\". For example, if you specify `2h`, the process fails after 2 hours. The default timeout is `1h`.\n\nThe upload operation can take an extended period of time depending on the size\nof your virtual disk and the speed of your network connection. The import\noperation can take tens of minutes to run depending on the size of the disk.\n\n\u003cbr /\u003e\n\n### API\n\nBefore starting the import process with the API, you need to upload your\nvirtual disk to an object storage bucket named `vm-images-bucket`. To create\nan object storage bucket, see\n[Create storage buckets for projects](/distributed-cloud/hosted/docs/latest/gdch/application/ao-user/create-storage-buckets).\n\nTo import a virtual disk through the API, do the following:\n\n1. Create a `VirtualMachineImageImport` object in the Management API server\n to start the image import process:\n\n kubectl --kubeconfig \u003cvar translate=\"no\"\u003eMANAGEMENT_API_SERVER\u003c/var\u003e \\\n apply -n \u003cvar translate=\"no\"\u003ePROJECT_ID\u003c/var\u003e -f - \u003c\u003cEOF\n apiVersion: virtualmachine.gdc.goog/v1\n kind: VirtualMachineImageImport\n metadata:\n name: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-l devsite-syntax-l-Scalar devsite-syntax-l-Scalar-Plain\"\u003eIMAGE_NAME\u003c/span\u003e\u003c/var\u003e\n namespace: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-l devsite-syntax-l-Scalar devsite-syntax-l-Scalar-Plain\"\u003ePROJECT_ID\u003c/span\u003e\u003c/var\u003e\n spec:\n source:\n objectStorage:\n bucketRef:\n name: vm-images-bucket\n objectName: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-l devsite-syntax-l-Scalar devsite-syntax-l-Scalar-Plain\"\u003eSOURCE_FILE\u003c/span\u003e\u003c/var\u003e\n imageMetadata:\n name: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-l devsite-syntax-l-Scalar devsite-syntax-l-Scalar-Plain\"\u003eIMAGE_NAME\u003c/span\u003e\u003c/var\u003e\n operatingSystem: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-l devsite-syntax-l-Scalar devsite-syntax-l-Scalar-Plain\"\u003eOPERATING_SYSTEM\u003c/span\u003e\u003c/var\u003e\n minimumDiskSize: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-l devsite-syntax-l-Scalar devsite-syntax-l-Scalar-Plain\"\u003eDISK_SIZE\u003c/span\u003e\u003c/var\u003e\n EOF\n\n Replace the following variables:\n\n2. Monitor the progress of the import by querying the status of the\n `VirtualMachineImageImport` object:\n\n kubectl --kubeconfig \u003cvar translate=\"no\"\u003eMANAGEMENT_API_SERVER\u003c/var\u003e \\\n get virtualmachineimageimport --namespace \u003cvar translate=\"no\"\u003ePROJECT_ID\u003c/var\u003e \\\n \u003cvar translate=\"no\"\u003eIMAGE_NAME\u003c/var\u003e -o jsonpath='{.status}'\n\n### Clean up resources\n\nThe import process involves uploading your virtual disk file to object storage.\nIf you use the gdcloud CLI, the object is cleaned up when the command\nfinishes, whether or not it was successful. If the command is interrupted, or\nthe image import is done with the API, the virtual disk file might remain in\nthe object storage bucket named `vm-images-bucket` until you manually delete\nthe file.\n\nWhat's next\n-----------\n\nCreate a new VM instance that uses your image in the page,\n[Create and start a VM](/distributed-cloud/hosted/docs/latest/gdch/application/ao-user/vms/create-a-vm/create-and-start)."]]