Si necesitas mover los datos del disco de arranque de Compute Engine fuera del proyecto de Compute Engine, puedes exportar una imagen de disco de arranque a Cloud Storage como un archivo tar.gz
. Si necesitas crear una imagen de disco persistente para usarla cuando crees discos persistentes nuevos en Compute Engine, consulta Crea una imagen personalizada.
Puedes crear una copia de seguridad o compartir una imagen personalizada si exportas la imagen a Cloud Storage. Este método es ideal para compartir imágenes individuales con proyectos que no tienen acceso a tus imágenes. De forma alternativa, puedes compartir imágenes si otorgas el rol del usuario de imágenes de Compute Engine en la imagen o en el proyecto que la contiene.
En el diagrama siguiente, se muestran algunos flujos de trabajo típicos para la creación y reutilización de una imagen personalizada.
Antes de comenzar
- Si deseas usar los ejemplos de línea de comandos de esta guía, haz lo siguiente:
- Instala Google Cloud CLI o actualízala a la última versión.
- Configura una región y una zona predeterminadas.
- Si deseas usar los ejemplos de API de esta guía, configura el acceso a la API.
- Consulta la página de imágenes.
- Si el proyecto del que quieres exportar la imagen tiene una política de imágenes confiables definida, agrega
projects/compute-image-import
yprojects/compute-image-tools
a la lista de publicadores permitidos. - Si deseas obtener información a fin de cumplir con los requisitos antes de exportar imágenes, consulta Requisitos para importar y exportar imágenes de VM.
Limitaciones y restricciones
Para los proyectos que están protegidos con los Controles del servicio de VPC, usa uno de los siguientes métodos:
- exportar desde el mismo proyecto en el que reside la imagen
- exportar la imagen de forma manual
Exporta una imagen con un solo comando
Exporta una imagen a Cloud Storage
Puedes exportar tus imágenes con la consola de Google Cloud, Google Cloud CLI o la API de Cloud Build.
Console
En Google Cloud Console, ve a la página Imágenes.
Haz clic en el nombre de la imagen que deseas exportar para ir a la página de detalles de esa imagen. No puedes exportar imágenes públicas proporcionadas por Google. Solo puedes exportar imágenes que hayas creado o importado anteriormente.
En la página de detalles de la imagen, haz clic en Exportar para abrir la página Exportar imagen.
En la página Exportar imagen, selecciona el Formato de exportación de la imagen.
Haz clic en Explorar para elegir la ubicación de Cloud Storage a la que deseas exportar.
Elige una ubicación de Cloud Storage existente para exportar tu imagen. O bien, sigue las instrucciones para crear un bucket nuevo de Cloud Storage y, luego, asígnale un nombre.
Una vez que elijas una ubicación de Cloud Storage, elige un nombre de archivo para la imagen exportada. Puedes usar el nombre de archivo predeterminado o puedes elegir uno propio.
Después de elegir una ubicación de Cloud Storage y de ingresar un nombre de archivo para la imagen, haz clic en Seleccionar.
En la página Exportar imagen, haz clic en Exportar. Después de que elijas Exportar, la consola de Google Cloud mostrará el Historial de exportación de imágenes, en el que podrás ver el proceso de exportación de la imagen. Para obtener más detalles sobre el proceso de exportación de imágenes, haz clic en ID de Cloud Build para ir a la página Detalles de exportación de imágenes, en la que podrás ver y descargar el registro de exportación de la imagen.
Ve a la página Almacenamiento para acceder a la imagen que exportaste.
gcloud
La forma preferida de exportar una imagen a Cloud Storage es mediante el comando gcloud compute images export
. Este comando usa Daisy a fin de encadenar los diversos pasos necesarios para exportar una imagen.
Se supone que ya creaste una imagen, por ejemplo, con el comando gcloud compute images create
.
Con Google Cloud CLI, ejecuta lo siguiente:
gcloud compute images export \ --destination-uri DESTINATION_URI \ --image IMAGE_NAME
Reemplaza lo siguiente:
DESTINATION_URI
: El destino del URI de Cloud Storage para el archivo de imagen exportado.IMAGE_NAME
: El nombre de la imagen de disco que se exportará.
De forma predeterminada, las imágenes se exportan en el formato de Compute Engine, que es un archivo disk.raw
que se comprimido y se comprime con gzip. Para exportar imágenes en otros formatos compatibles con la utilidad de imagen de disco QEMU, puedes usar la marca --export-format
. Los formatos válidos incluyen vmdk
, vhdx
, vpc
, vdi
y qcow2
.
Ejemplo
Por ejemplo, el siguiente comando exporta una imagen llamada my-image
de my-project
a un depósito de Cloud Storage llamado my-bucket
. De forma predeterminada, la imagen se exporta como un archivo disk.raw file
y se comprime en el formato de archivo tar.gz
.
gcloud compute images export \ --destination-uri gs://my-bucket/my-image.tar.gz \ --image my-image \ --project my-project
Para obtener marcas, consulta la
documentación de referencia de
gcloud compute images export
.
API
En la API, crea una solicitud POST
a la API de Cloud Build.
POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds { "timeout": "7200s", "steps":[ { "args":[ "-timeout=7000s", "-source_image=SOURCE_IMAGE", "-client_id=api", "-format=IMAGE_FORMAT", "-destination_uri=DESTINATION_URI" ], "name":"gcr.io/compute-image-tools/gce_vm_image_export:release", "env":[ "BUILD_ID=$BUILD_ID" ] } ], "tags":[ "gce-daisy", "gce-daisy-image-export" ] }
Reemplaza lo siguiente:
PROJECT_ID
por el ID del proyecto que contiene la imagen que deseas exportar.SOURCE_IMAGE
: Es el nombre de la imagen que se importará.IMAGE_FORMAT
: Es el formato de la imagen exportada. Los formatos válidos incluyenvmdk
,vhdx
,vpc
,vdi
yqcow2
.DESTINATION_URI
: La ubicación del URI de Cloud Storage en la que deseas exportar el archivo de imagen Por ejemplo,gs://my-bucket/my-exported-image.vmdk
Para conocer otros valores args
que se puedan proporcionar, consulta la sección de marcas opcionales de la página sobre exportación de imágenes de VM en GitHub.
Respuesta de ejemplo
El resultado muestra una respuesta similar al siguiente ejemplo:
{ "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-10-02T18:59:13.393492020Z", "steps": [ { "name": "gcr.io/compute-image-tools/gce_vm_image_export:release", "env": [ "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940" ], "args": [ "-timeout=7056s", "-source_image=my-image", "-client_id=api", "-format=vmdk", "-destination_uri=gs://my-bucket/my-exported-image.vmdk" ] } ], "timeout": "7200s", "projectId": "myproject-12345", "logsBucket": "gs://123456.cloudbuild-logs.googleusercontent.com", "options": { "logging": "LEGACY" }, "logUrl": "https://console.cloud.google.com/cloud-build/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=123456" } }
Puedes supervisar tu compilación de las siguientes dos maneras:
- Ejecuta una solicitud projects.builds.get mediante el
build-id
que se mostró. - Revisa los registros alojados en la
logUrl
proporcionada.
Exporta una imagen desde un proyecto mediante una cuenta de servicio personalizada de Compute Engine
Durante una exportación de imagen, se crea una instancia de máquina virtual (VM) temporal en tu proyecto. Debe autenticarse la herramienta de exportación de imágenes en esta VM temporal.
Una cuenta de servicio es una identidad que se adjunta a una VM. Se puede acceder a los tokens de acceso a la cuenta de servicio a través del servidor de metadatos de instancia y usarlos para autenticar la herramienta de exportación de imágenes en la VM.
De forma predeterminada, el proceso de exportación usa el agente de servicio predeterminado de Compute Engine del proyecto. Sin embargo, si la cuenta de servicio predeterminada de Compute Engine está inhabilitada en tu proyecto o si quieres usar una cuenta de servicio de Compute Engine personalizada, debes crear una cuenta de servicio y especificarla para el proceso de exportación.
Puedes exportar tus imágenes mediante la Google Cloud CLI o la API de Cloud Build.
gcloud
Crea una cuenta de servicio y asigna los roles mínimos. Si deseas obtener más información para crear cuentas de servicio, consulta Crea y administra cuentas de servicio.
Como mínimo, la cuenta de servicio de Compute Engine especificada debe tener asignados los siguientes roles:
roles/compute.storageAdmin
roles/storage.objectAdmin
Para obtener más información, consulta Otorga roles necesarios a la cuenta de servicio de Compute Engine.
Usa el comando
gcloud compute images export
para exportar la imagen.gcloud compute images export \ --destination-uri DESTINATION_URI \ --image IMAGE_NAME \ --compute-service-account SERVICE_ACCOUNT_EMAIL
Reemplaza lo siguiente:
DESTINATION_URI
: El destino del URI de Cloud Storage para el archivo de imagen exportado.IMAGE_NAME
: El nombre de la imagen de disco que se exportará.SERVICE_ACCOUNT_EMAIL
: La dirección de correo electrónico asociada con la cuenta de servicio de Compute Engine creada en el paso anterior.
Ejemplo
Por ejemplo, con el siguiente comando, se exporta una imagen llamada my-image
de my-project
a un depósito de Cloud Storage llamado my-bucket
con una cuenta de servicio que tiene el correo electrónico image-export-service-account@proj-12345.iam.gserviceaccount.com
. De forma predeterminada, la imagen se exporta como un archivo disk.raw
y se comprime en el formato de archivo tar.gz
.
gcloud compute images export \ --destination-uri gs://my-bucket/my-image.tar.gz \ --image my-image \ --project my-project \ --compute-service-account image-export-service-account@proj-12345.iam.gserviceaccount.com
Para obtener marcas, consulta la
documentación de referencia de
gcloud compute images export
.
API
Crea una cuenta de servicio y asigna los roles mínimos. Si deseas obtener más información para crear cuentas de servicio, consulta Crea y administra cuentas de servicio.
Como mínimo, la cuenta de servicio de Compute Engine especificada debe tener asignadas las siguientes funciones:
roles/compute.storageAdmin
roles/storage.objectAdmin
Para obtener más información, consulta Otorga funciones necesarias a la cuenta de servicio de Compute Engine.
En la API, crea una solicitud
POST
a la API de Cloud Build.POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds { "timeout": "7200s", "steps":[ { "args":[ "-timeout=7000s", "-source_image=SOURCE_IMAGE", "-client_id=api", "-format=IMAGE_FORMAT", "-destination_uri=DESTINATION_URI", "-compute_service_account=SERVICE_ACCOUNT_EMAIL" ], "name":"gcr.io/compute-image-tools/gce_vm_image_export:release", "env":[ "BUILD_ID=$BUILD_ID" ] } ], "tags":[ "gce-daisy", "gce-daisy-image-export" ] }
Reemplaza lo siguiente:
PROJECT_ID
por el ID del proyecto que contiene la imagen que deseas exportar.SOURCE_IMAGE
: Es el nombre de la imagen que se importará.IMAGE_FORMAT
: Es el formato de la imagen exportada. Los formatos válidos incluyenvmdk
,vhdx
,vpc
,vdi
yqcow2
.DESTINATION_URI
: La ubicación del URI de Cloud Storage en la que deseas exportar el archivo de imagen Por ejemplo,gs://my-bucket/my-exported-image.vmdk
SERVICE_ACCOUNT_EMAIL
: La dirección de correo electrónico asociada con la cuenta de servicio de Compute Engine creada en el paso anterior.
Para conocer otros valores args
que se puedan proporcionar, consulta la sección de marcas opcionales de la página sobre exportación de imágenes de VM en GitHub.
Exporta una imagen mediante la VPC compartida
Antes de exportar una imagen que use una VPC compartida, debes agregar la función compute.networkUser
a la cuenta de servicio de Cloud Build.
Para obtener más información, consulta Otorga funciones necesarias a la cuenta de servicio de Cloud Build.
Puedes exportar la imagen mediante la Google Cloud CLI o la API de Cloud Build.
gcloud
Usa el comando gcloud compute images export
para exportar la imagen.
gcloud compute images export \ --image IMAGE_NAME \ --destination-uri DESTINATION_URI \ --project PROJECT_ID \ --network NETWORK \ [--subnet SUBNET \] [--zone ZONE]
Reemplaza lo siguiente:
IMAGE_NAME
: Es el nombre de la imagen que se exportará.DESTINATION_URI
: La ubicación del URI de Cloud Storage en la que deseas exportar el archivo de imagenPROJECT_ID
: El ID del proyecto en el que se encuentra la imagen.NETWORK
: La ruta de acceso completa a una red de VPC compartida. Por ejemplo,projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
SUBNET
: La ruta de acceso completa a una subred de VPC compartida. Por ejemplo,projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
Especificar este modo depende del modo de red de VPC.
- Si la red de VPC usa el modo heredado, no especifiques una subred.
- Si la red de VPC usa el modo automático, la especificación de la subred es opcional.
- Si la red de VPC usa el modo personalizado, este campo debe especificarse.
ZONE
: La zona que se usará para la exportación. Esta zona debe coincidir con la región de la subred. Por ejemplo, siSUBNET
está en la regiónus-west1
, la zona de exportación debe ser una de las siguientes:us-west1-a
,us-west1-b
ous-west1-c
.En la mayoría de los casos, especificar una zona es opcional. Si se especifica
SUBNET
, se debe especificar la zona.
Por ejemplo, el siguiente comando exporta una imagen llamada example-image
de my-project
a un depósito de Cloud Storage llamado my-bucket
. En este ejemplo, la red de nube privada virtual (my-shared-vp
) usa una subred personalizada (my-custom-subnet
). De forma predeterminada, la imagen se exporta como un archivo disk.raw
y se comprime en el formato de archivo tar.gz
.
Comando de muestra
gcloud compute images export \ --image example-image \ --destination-uri gs://my-bucket/my-image.tar.gz \ --project my-project \ --network projects/my-vpc-project/global/networks/my-shared-vpc \ --subnet projects/my-vpc-project/regions/us-west1/subnetworks/my-custom-subnet \ --zone us-west1-c
API
Agrega la imagen a Cloud Storage.
En la API, crea una solicitud
POST
a la API de Cloud Build.POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds { "timeout": "7200s", "steps":[ { "args":[ "-timeout=7000s", "-source_image=SOURCE_IMAGE", "-client_id=api", "-format=IMAGE_FORMAT", "-destination_uri=DESTINATION_URI", "-network=NETWORK", "-subnet=SUBNET", "-zone=ZONE" ], "name":"gcr.io/compute-image-tools/gce_vm_image_export:release", "env":[ "BUILD_ID=$BUILD_ID" ] } ], "tags":[ "gce-daisy", "gce-daisy-image-export" ] }
Reemplaza lo siguiente:
PROJECT_ID
por el ID del proyecto que contiene la imagen que deseas exportar.SOURCE_IMAGE
: Es el nombre de la imagen que se importará.IMAGE_FORMAT
: Es el formato de la imagen exportada. Los formatos válidos incluyenvmdk
,vhdx
,vpc
,vdi
yqcow2
.DESTINATION_URI
: La ubicación del URI de Cloud Storage en la que deseas exportar el archivo de imagen Por ejemplo,gs://my-bucket/my-exported-image.vmdk
NETWORK
: La ruta de acceso completa a una red de VPC compartida. Por ejemplo,projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
SUBNET
: La ruta de acceso completa a una subred de VPC compartida. Por ejemplo,projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
Especificar este modo depende del modo de red de VPC.
- Si la red de VPC usa el modo heredado, no especifiques una subred.
- Si la red de VPC usa el modo automático, la especificación de la subred es opcional.
- Si la red de VPC usa el modo personalizado, este campo debe especificarse.
ZONE
: La zona que se usará para la exportación. Esta zona debe coincidir con la región de la subred. Por ejemplo, siSUBNET
está en la regiónus-west1
, la zona de exportación debe ser una de las siguientes:us-west1-a
,us-west1-b
ous-west1-c
.En la mayoría de los casos, especificar una zona es opcional. Si se especifica
SUBNET
, se debe especificar la zona.
Para conocer otros valores
args
que se puedan proporcionar, consulta la sección de marcas opcionales de la página sobre exportación de imágenes de VM en GitHub.
Crea y exporta una imagen de forma manual
Si los comandos gcloud compute images create
y gcloud compute images export
no cumplen con tus requisitos, puedes crear y exportar una imagen manualmente desde una instancia de Compute Engine. Este proceso tiene pasos discretos a fin de crear primero una imagen y, luego, exportarla.
En el ejemplo siguiente, ten en cuenta que el disco creado se llama image-disk.
Si quieres crear y exportar una imagen, haz lo siguiente:
Opcional: Detén la instancia a la que está conectado el disco antes de crear la instantánea. Si detienes la instancia, se garantiza la integridad del contenido del disco en la instantánea. Reemplaza
DISK_NAME
por el nombre del disco que deseas usar para crear la instantánea.Crea una instantánea del disco. Asigna un nombre a la instantánea
image-snapshot
.gcloud compute disks snapshot DISK_NAME \ --snapshot-names image-snapshot
Usa la instantánea
image-snapshot
para crear un disco nuevo llamadoimage-disk
. Para ello, ejecuta el siguiente comando:gcloud compute disks create image-disk \ --source-snapshot image-snapshot
Crea un disco temporal llamado
temporary-disk
para que contenga el archivotar
y especifica un valor paraSIZE
del disco que sea al menos un 50% mayor que el del disco de imagen.Después podrás desvincular y borrar el disco.
gcloud compute disks create temporary-disk \ --size SIZE
en el que
SIZE
es el tamaño, en gigabytes o terabytes, del disco temporal. Por ejemplo, especifica100GB
si quieres crear un disco de 100 gigabytes.Crea una instancia y habilita el alcance
storage-rw
en ella. Además, adjuntaimage-disk
ytemporary-disk
a la instancia como discos secundarios con atributosdevice-name
específicos. ReemplazaVM_NAME
por el nombre de la instancia que deseas crear.gcloud compute instances create VM_NAME \ --scopes storage-rw \ --disk name=image-disk,device-name=image-disk \ --disk name=temporary-disk,device-name=temporary-disk
Ten en cuenta que estás transfiriendo permisos de cuentas de servicio para poder subir el archivo a Cloud Storage en pasos posteriores.
Consulta los detalles sobre cómo iniciar una instancia nueva si es necesario.
Conéctate a tu instancia. Reemplaza
VM_NAME
por el nombre de la instancia a la que deseas conectarte.gcloud compute ssh VM_NAME
Formatea y activa el disco temporal: Si se formatea el disco, se borran los contenidos del disco temporal.
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
Opcional: Activa el disco de imagen y realiza cambios adicionales antes de crear el archivo
tar
. Por ejemplo, es posible que quieras borrar los archivos existentes del directorio/home
si no deseas que formen parte de la imagen. Debes activar las particiones del disco que necesitas modificar, modificar los archivos en el disco que necesitas cambiar y, luego, desactivar el disco cuando hayas terminado.Crea un directorio en el que puedas activar tu disco o partición.
sudo mkdir /mnt/image-disk
Usa el comando
ls
para determinar qué disco o partición de disco necesitas activar.ls /dev/disk/by-id/
Con el comando, se imprime una lista del ID del disco y las particiones. Por ejemplo, el disco siguiente tiene una tabla particionada con una partición. El ID
google-image-disk
apunta al disco completo desde el que quieres crear una imagen. El ID degoogle-image-disk-part1
apunta a la primera partición en este disco. Debes activar la partición si necesitas realizar cambios en el disco; luego, crea la imagen desde el disco completo.google-image-disk google-image-disk-part1
Activa el disco o la partición. Si tu disco tiene una tabla particionada, debes activar las particiones individuales de tu disco. Por ejemplo, activa
google-image-disk-part1
.sudo mount /dev/disk/by-id/google-image-disk-part1 /mnt/image-disk
De forma alternativa, si tu disco tiene un formato sin procesar y sin tabla de particiones, activa el disco
google-image-disk
completo.sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
Modifica los archivos en el directorio
/mnt/image-disk
para configurar los archivos en el disco. Por ejemplo, puedes quitar el archivo/mnt/image-disk/home/[USER]/.ssh/authorized_keys
para evitar que se compartan las Llaves SSH.Una vez que hayas terminado de modificar los archivos, desactiva el disco.
sudo umount /mnt/image-disk/
Crea el archivo
tar
de la imagen.Cuando termines de personalizar los archivos en el disco de imagen, crea un archivo de disco sin procesar en tu disco temporal. El nombre de la imagen de disco sin procesar debe ser “disk.raw”:
sudo dd if=/dev/disk/by-id/google-image-disk of=/mnt/tmp/disk.raw bs=4096
Luego, crea el archivo
tar.gz
:cd /mnt/tmp
sudo tar czvf myimage.tar.gz disk.raw
Con este comando, se crea una imagen de la instancia en la siguiente ubicación:
/mnt/tmp/myimage.tar.gz
Sube la imagen a Cloud Storage.
Para subir el archivo
tar
a Cloud Storage, usa la herramienta de línea de comandos de gsutil que viene preinstalada en tu instancia.Crea un bucket con
gsutil
.Asegúrate de revisar los lineamientos de asignación de nombres de objetos y buckets antes de crear el bucket. Luego, crea el bucket con el siguiente comando: Reemplaza
BUCKET_NAME
por el nombre del bucket que deseas crear.me@example-instance:~$ gsutil mb gs://BUCKET_NAME
Copia el archivo en el bucket nuevo. Reemplaza
BUCKET_NAME
por el nombre del bucket en el cual se copiará el archivo.me@example-instance:~$ gsutil cp /mnt/tmp/myimage.tar.gz gs://BUCKET_NAME
Exportaste tu archivo a Cloud Storage. Ahora puedes compartir la imagen con otras personas o usar el archivo tar
para agregar una imagen nueva a un proyecto de la consola de Google Cloud.
¿Qué sigue?
- Comparte imágenes con la función de usuario de imágenes.
- Obtén más información sobre los métodos de importación disponibles para Compute Engine.