Se devi spostare i dati del disco di avvio di Compute Engine all'esterno del tuo progetto Compute Engine, puoi esportare un'immagine disco di avvio in Cloud Storage come file tar.gz
. Se devi creare un'immagine disco permanente da utilizzare quando crei nuovi dischi permanenti su Compute Engine, leggi Creazione di un'immagine personalizzata.
Puoi eseguire il backup o condividere un'immagine personalizzata esportandola in Cloud Storage. Questo metodo è ideale per condividere singole immagini con progetti che non hanno accesso alle tue immagini. In alternativa, puoi condividere le immagini concedendo il ruolo utente immagine Compute Engine sull'immagine o sul progetto che la contiene.
Il seguente diagramma mostra alcuni flussi di lavoro tipici per la creazione e il riutilizzo di un'immagine personalizzata.
Prima di iniziare
- Se vuoi utilizzare gli esempi a riga di comando in questa guida:
- Installa o aggiorna l'ultima versione di Google Cloud CLI.
- Imposta una regione e una zona predefinite.
- Se vuoi utilizzare gli esempi di API in questa guida, configura l'accesso API.
- Leggi la pagina delle immagini.
- Se il progetto da cui vuoi esportare l'immagine ha un criterio
immagine attendibile definito, aggiungi
projects/compute-image-import
eprojects/compute-image-tools
all'elenco dei publisher consentiti. - Per scoprire come soddisfare i requisiti prima di esportare le immagini, consulta Prerequisiti per l'importazione e l'esportazione delle immagini delle VM.
Limitazioni e restrizioni
Per i progetti protetti con Controlli di servizio VPC, utilizza uno dei seguenti metodi:
- Esportare dallo stesso progetto in cui si trova l'immagine
- esporta l'immagine manualmente.
Esporta un'immagine con un singolo comando
Esportazione di un'immagine in Cloud Storage
Puoi esportare le tue immagini utilizzando Google Cloud Console, Google Cloud CLI o l'API Cloud Build.
Console
In Google Cloud Console, vai alla pagina Immagini.
Fai clic sul nome dell'immagine che vuoi esportare per passare alla pagina dei dettagli dell'immagine. Non puoi esportare immagini pubbliche fornite da Google. Puoi esportare solo le immagini create o importate in precedenza.
Nella pagina dei dettagli dell'immagine, fai clic su Esporta per aprire la pagina Esporta immagine.
Nella pagina Esporta immagine, scegli il Formato di esportazione dell'immagine.
Scegli la località di Cloud Storage in cui esportare l'immagine facendo clic su Sfoglia.
Scegli una località Cloud Storage esistente per esportare l'immagine. In alternativa, segui le istruzioni per creare un nuovo bucket Cloud Storage, quindi inserisci un nome per il nuovo bucket Cloud Storage.
Dopo aver scelto Cloud Storage, scegli un nome file per l'immagine esportata. Puoi utilizzare il nome file predefinito oppure scegliere un nome file personalizzato.
Dopo aver scelto Cloud Storage e inserito un nome file per l'immagine, fai clic su Seleziona.
Nella pagina Esporta immagine, fai clic su Esporta. Dopo aver scelto Esporta, la console Google Cloud mostra la cronologia delle esportazioni di immagini, dove puoi visualizzare il processo di esportazione delle immagini. Per ulteriori dettagli sul processo di esportazione delle immagini, fai clic sull'ID Cloud Build per andare alla pagina Dettagli esportazione dell'immagine in cui puoi visualizzare e scaricare il log di esportazione delle immagini.
Vai alla pagina Spazio di archiviazione per accedere all'immagine esportata.
gcloud
Il modo migliore per esportare un'immagine in Cloud Storage è utilizzare il comando gcloud compute images export
. Questo comando utilizza Daisy per concatenare i diversi passaggi necessari per esportare un'immagine.
Si presume che tu abbia già creato un'immagine, ad esempio con il comando gcloud compute images create
.
Utilizzando Google Cloud CLI, esegui:
gcloud compute images export \ --destination-uri DESTINATION_URI \ --image IMAGE_NAME
Sostituisci quanto segue:
DESTINATION_URI
: destinazione URI di Cloud Storage per il file immagine esportato.IMAGE_NAME
: il nome dell'immagine disco da esportare.
Per impostazione predefinita, le immagini vengono esportate nel formato Compute Engine, che è un file disk.raw
con tarring e gzip. Per esportare immagini in altri formati supportati dall'utilità immagine disco QEMU, puoi utilizzare il flag --export-format
. I formati validi includono vmdk
, vhdx
, vpc
, vdi
e qcow2
.
Esempio
Ad esempio, il comando seguente esporta un'immagine denominata my-image
da my-project
in un bucket Cloud Storage denominato my-bucket
. Per impostazione predefinita, l'immagine viene esportata come disk.raw file
e viene compressa nel formato file tar.gz
.
gcloud compute images export \ --destination-uri gs://my-bucket/my-image.tar.gz \ --image my-image \ --project my-project
Per i flag, consulta la documentazione di riferimento di gcloud compute images export
.
API
Nell'API, crea una richiesta POST
all'API 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" ] }
Sostituisci quanto segue:
PROJECT_ID
: l'ID del progetto che contiene l'immagine che vuoi esportare.SOURCE_IMAGE
: il nome dell'immagine da esportare.IMAGE_FORMAT
: il formato dell'immagine esportata. I formati validi includonovmdk
,vhdx
,vpc
,vdi
eqcow2
.DESTINATION_URI
: la posizione dell'URI Cloud Storage in cui vuoi esportare il file immagine. Ad esempio,gs://my-bucket/my-exported-image.vmdk
.
Per altri valori args
che possono essere forniti, consulta la sezione relativa ai flag facoltativi della pagina di GitHub per l'esportazione di immagini VM.
Risposta di esempio
La seguente risposta di esempio è simile all'output restituito:
{ "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" } }
Puoi monitorare la build in due modi:
- Esegui una richiesta projects.builds.get utilizzando il metodo
build-id
restituito. - Esamina i log ospitati all'indirizzo
logUrl
fornito.
Esporta un'immagine da un progetto utilizzando un account di servizio Compute Engine personalizzato
Durante un'esportazione di immagini, viene creata un'istanza di macchina virtuale temporanea (VM) nel progetto. Lo strumento di esportazione delle immagini su questa VM temporanea deve essere autenticato.
Un account di servizio è un'identità collegata a una VM. I token di accesso all'account di servizio sono accessibili tramite il server dei metadati istanza e utilizzati per autenticare lo strumento di esportazione di immagini sulla VM.
Per impostazione predefinita, il processo di esportazione utilizza l'agente di servizio Compute Engine predefinito del progetto. Tuttavia, se l'account di servizio Compute Engine predefinito è disabilitato nel tuo progetto o se vuoi utilizzare un account di servizio Compute Engine personalizzato, devi creare un account di servizio e specificarlo per il processo di esportazione.
Per esportare le immagini, puoi utilizzare Google Cloud CLI o l'API Cloud Build.
gcloud
Crea un account di servizio e assegna i ruoli minimi. Per ulteriori informazioni sulla creazione di account di servizio, consulta Creazione e gestione degli account di servizio.
Come minimo, all'account di servizio Compute Engine specificato devono essere assegnati i seguenti ruoli:
roles/compute.storageAdmin
roles/storage.objectAdmin
Per ulteriori informazioni, consulta Concedi i ruoli richiesti all'account di servizio Compute Engine.
Usa il comando
gcloud compute images export
per esportare l'immagine.gcloud compute images export \ --destination-uri DESTINATION_URI \ --image IMAGE_NAME \ --compute-service-account SERVICE_ACCOUNT_EMAIL
Sostituisci quanto segue:
DESTINATION_URI
: destinazione URI di Cloud Storage per il file immagine esportato.IMAGE_NAME
: il nome dell'immagine disco da esportare.SERVICE_ACCOUNT_EMAIL
: l'indirizzo email associato all'account di servizio Compute Engine creato nel passaggio precedente.
Esempio
Ad esempio, il seguente comando esporta un'immagine denominata my-image
da
my-project
in un bucket Cloud Storage denominato my-bucket
con un
account di servizio che ha l'indirizzo email
image-export-service-account@proj-12345.iam.gserviceaccount.com
. Per impostazione predefinita, l'immagine viene esportata come file disk.raw
e viene compressa nel formato file 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
Per i flag, consulta la documentazione di riferimento di gcloud compute images export
.
API
Crea un account di servizio e assegna i ruoli minimi. Per ulteriori informazioni sulla creazione di account di servizio, consulta Creazione e gestione degli account di servizio.
Come minimo, all'account di servizio Compute Engine specificato devono essere assegnati i seguenti ruoli:
roles/compute.storageAdmin
roles/storage.objectAdmin
Per saperne di più, vedi Concedere i ruoli richiesti all'account di servizio Compute Engine.
Nell'API, crea una richiesta
POST
all'API 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" ] }
Sostituisci quanto segue:
PROJECT_ID
: l'ID del progetto che contiene l'immagine che vuoi esportare.SOURCE_IMAGE
: il nome dell'immagine da esportare.IMAGE_FORMAT
: il formato dell'immagine esportata. I formati validi includonovmdk
,vhdx
,vpc
,vdi
eqcow2
.DESTINATION_URI
: la posizione dell'URI Cloud Storage in cui vuoi esportare il file immagine. Ad esempio,gs://my-bucket/my-exported-image.vmdk
.SERVICE_ACCOUNT_EMAIL
: l'indirizzo email associato all'account di servizio Compute Engine creato nel passaggio precedente.
Per altri valori args
che possono essere forniti, consulta la sezione relativa ai flag facoltativi della pagina di GitHub per l'esportazione di immagini VM.
Esportare un'immagine utilizzando un VPC condiviso
Prima di esportare un'immagine che utilizza un VPC condiviso, devi
aggiungere il ruolo compute.networkUser
all'account di servizio Cloud Build.
Per ulteriori informazioni, consulta la pagina Concedere i ruoli richiesti all'account di servizio Cloud Build.
Per esportare l'immagine puoi utilizzare Google Cloud CLI o l'API Cloud Build.
gcloud
Usa il comando gcloud compute images export
per esportare l'immagine.
gcloud compute images export \ --image IMAGE_NAME \ --destination-uri DESTINATION_URI \ --project PROJECT_ID \ --network NETWORK \ [--subnet SUBNET \] [--zone ZONE]
Sostituisci quanto segue:
IMAGE_NAME
: il nome dell'immagine da esportare.DESTINATION_URI
: la posizione dell'URI Cloud Storage in cui vuoi esportare il file immagine.PROJECT_ID
: ID del progetto in cui si trova l'immagine.NETWORK
: il percorso completo di una rete VPC condivisa. Ad esempio,projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
.SUBNET
: il percorso completo di una subnet VPC condivisa. Ad esempio,projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
.La specifica di questa modalità dipende dalla modalità di rete VPC.
- Se la rete VPC utilizza la modalità legacy, non specificare una subnet.
- Se la rete VPC utilizza la modalità automatica, specificare la subnet è facoltativa.
- Se la rete VPC utilizza la modalità personalizzata, è necessario specificare questo campo.
ZONE
: la zona da utilizzare per l'esportazione. Questa zona deve corrispondere all'area geografica della subnet. Ad esempio, se l'area geograficaSUBNET
si trova nell'area geograficaus-west1
, la zona di esportazione deve essere una delle seguenti:us-west1-a
,us-west1-b
ous-west1-c
.Nella maggior parte dei casi specificare una zona è facoltativo. Se
SUBNET
è specificato, deve essere specificata la zona.
Ad esempio, il comando seguente esporta un'immagine denominata example-image
da my-project
in un bucket Cloud Storage denominato my-bucket
. In questo esempio la rete Virtual Private Cloud (my-shared-vp
) utilizza una subnet personalizzata (my-custom-subnet
). Per impostazione predefinita, l'immagine viene esportata come file disk.raw
e viene compressa nel formato file tar.gz
.
Comando di esempio
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
Aggiungi l'immagine a Cloud Storage.
Nell'API, crea una richiesta
POST
all'API 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" ] }
Sostituisci quanto segue:
PROJECT_ID
: l'ID del progetto che contiene l'immagine che vuoi esportare.SOURCE_IMAGE
: il nome dell'immagine da esportare.IMAGE_FORMAT
: il formato dell'immagine esportata. I formati validi includonovmdk
,vhdx
,vpc
,vdi
eqcow2
.DESTINATION_URI
: la posizione dell'URI Cloud Storage in cui vuoi esportare il file immagine. Ad esempio,gs://my-bucket/my-exported-image.vmdk
.NETWORK
: il percorso completo di una rete VPC condivisa. Ad esempio,projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
.SUBNET
: il percorso completo di una subnet VPC condivisa. Ad esempio,projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
.La specifica di questa modalità dipende dalla modalità di rete VPC.
- Se la rete VPC utilizza la modalità legacy, non specificare una subnet.
- Se la rete VPC utilizza la modalità automatica, specificare la subnet è facoltativa.
- Se la rete VPC utilizza la modalità personalizzata, è necessario specificare questo campo.
ZONE
: la zona da utilizzare per l'esportazione. Questa zona deve corrispondere all'area geografica della subnet. Ad esempio, se l'area geograficaSUBNET
si trova nell'area geograficaus-west1
, la zona di esportazione deve essere una delle seguenti:us-west1-a
,us-west1-b
ous-west1-c
.Nella maggior parte dei casi specificare una zona è facoltativo. Se
SUBNET
è specificato, deve essere specificata la zona.
Per altri valori
args
che possono essere forniti, consulta la sezione relativa ai flag facoltativi della pagina di GitHub per l'esportazione di immagini VM.
Creare ed esportare manualmente un'immagine
Se i comandi gcloud compute images create
e gcloud compute images export
non soddisfano i tuoi requisiti, puoi creare ed esportare manualmente un'immagine da un'istanza Compute Engine. Questo processo prevede passaggi diversi per creare un'immagine e poi esportarla.
Nell'esempio seguente, il disco creato si chiama image-disk.
Per creare ed esportare un'immagine:
(Facoltativo) Arresta l'istanza a cui è collegato il disco prima di creare lo snapshot. l'arresto dell'istanza garantisce l'integrità dei contenuti del disco nello snapshot. Sostituisci
DISK_NAME
con il nome del disco che vuoi utilizzare per creare lo snapshot.Crea uno snapshot del disco. Assegna allo snapshot il nome
image-snapshot
.gcloud compute disks snapshot DISK_NAME \ --snapshot-names image-snapshot
Utilizza lo snapshot
image-snapshot
per creare un nuovo disco denominatoimage-disk
eseguendo il comando seguente:gcloud compute disks create image-disk \ --source-snapshot image-snapshot
Crea un disco temporaneo denominato
temporary-disk
per contenere il tuo filetar
e specifica che il fileSIZE
del disco deve essere almeno il 50% più grande del disco immagine.Puoi scollegare ed eliminare il disco in un secondo momento.
gcloud compute disks create temporary-disk \ --size SIZE
dove
SIZE
è la dimensione, in gigabyte o terabyte, del disco temporaneo. Ad esempio, specifica100GB
per creare un disco da 100 gigabyte.Crea un'istanza e abilita l'ambito
storage-rw
sull'istanza. Inoltre, collegaimage-disk
etemporary-disk
all'istanza come dischi secondari con attributidevice-name
specifici. SostituisciVM_NAME
con il nome dell'istanza da creare.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
Tieni presente che stai passando agli ambiti dell'account di servizio in modo da poter caricare il file su Cloud Storage nei passaggi successivi.
Se necessario, esamina i dettagli sull'avvio di una nuova istanza.
Connettiti all'istanza. Sostituisci
VM_NAME
con il nome dell'istanza a cui connetterti.gcloud compute ssh VM_NAME
Formatta e monta il disco temporaneo. La formattazione del disco elimina i contenuti del disco temporaneo.
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
(Facoltativo) Monta il disco immagine e apporta ulteriori modifiche prima di creare il file
tar
. Ad esempio, puoi eliminare eventuali file esistenti dalla directory/home
se non vuoi che facciano parte dell'immagine. Monta le partizioni del disco che devi modificare, cambia i file sul disco che devi cambiare e, al termine, smonta il disco.Crea una directory in cui puoi montare il disco o la partizione.
sudo mkdir /mnt/image-disk
Usa il comando
ls
per determinare quale disco o partizione del disco devi montare.ls /dev/disk/by-id/
Il comando stampa un elenco di ID e partizioni del disco. Ad esempio, il seguente disco ha una tabella di partizione con una partizione. L'ID
google-image-disk
rimanda al disco completo da cui vuoi creare un'immagine. L'IDgoogle-image-disk-part1
rimanda alla prima partizione su questo disco. Monta la partizione se devi apportare modifiche al disco, quindi crea l'immagine dal disco completo.google-image-disk google-image-disk-part1
Monta il disco o la partizione. Se il disco ha una tabella delle partizioni, monta le singole partizioni del disco. Ad esempio, monta
google-image-disk-part1
.sudo mount /dev/disk/by-id/google-image-disk-part1 /mnt/image-disk
In alternativa, se il disco è formattato senza tabella di partizione, monta il disco completo
google-image-disk
.sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
Modifica i file nella directory
/mnt/image-disk
per configurare i file sul disco. Ad esempio, potresti rimuovere il file/mnt/image-disk/home/[USER]/.ssh/authorized_keys
per evitare che le chiavi SSH vengano condivise.Quando hai finito di modificare i file, smonta il disco.
sudo umount /mnt/image-disk/
Crea un file
tar
della tua immagine.Quando hai finito di personalizzare i file sul disco immagine, crea un file disco non elaborato sul disco temporaneo. Il nome dell'immagine disco non elaborata deve essere 'disk.raw':
sudo dd if=/dev/disk/by-id/google-image-disk of=/mnt/tmp/disk.raw bs=4096
Poi crea il file
tar.gz
:cd /mnt/tmp
sudo tar czvf myimage.tar.gz disk.raw
Questo comando crea un'immagine dell'istanza nella posizione seguente:
/mnt/tmp/myimage.tar.gz
Caricare l'immagine in Cloud Storage.
Per caricare il file
tar
in Cloud Storage, utilizza lo strumento a riga di comando gsutil preinstallato nella tua istanza.Crea un bucket utilizzando
gsutil
.Assicurati di rivedere le linee guida per la denominazione di bucket e oggetti prima di creare il bucket. Quindi, crea il tuo bucket utilizzando il comando seguente. Sostituisci
BUCKET_NAME
con il nome del bucket da creare.me@example-instance:~$ gsutil mb gs://BUCKET_NAME
Copia il file nel nuovo bucket. Sostituisci
BUCKET_NAME
con il nome del bucket in cui copiare il file.me@example-instance:~$ gsutil cp /mnt/tmp/myimage.tar.gz gs://BUCKET_NAME
Hai esportato il file in Cloud Storage. Ora puoi condividere l'immagine con altre persone o utilizzare il file tar
per aggiungere una nuova immagine a un progetto Google Cloud Console.
Passaggi successivi
- Condividi le immagini utilizzando il ruolo utente di immagine.
- Scopri i metodi di importazione disponibili per Compute Engine.