Crea immagini personalizzate


Puoi creare immagini personalizzate da dischi di origine, immagini, snapshot o immagini archiviate in Cloud Storage e usarle per creare istanze di macchine virtuali (VM). Le immagini personalizzate sono ideali per le situazioni in cui hai creato e modificato un disco di avvio permanente o un'immagine specifica in un determinato stato e devi salvare questo stato per creare VM.

In alternativa, puoi utilizzare lo strumento di importazione dei dischi virtuali per importare le immagini dei dischi di avvio in Compute Engine dai tuoi sistemi esistenti e aggiungerle all'elenco delle immagini personalizzate.

Prima di iniziare

  • Leggi il documento Immagini.
  • Se non l'hai ancora fatto, configura l'autenticazione. L'autenticazione è il processo mediante il quale la tua identità viene verificata per l'accesso ai Google Cloud servizi e alle API. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti su Compute Engine selezionando una delle seguenti opzioni:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

      1. After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      2. Set a default region and zone.
      3. Vai

        Per utilizzare gli esempi di Go questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura le Credenziali predefinite dell'applicazione con le tue credenziali utente.

        1. Install the Google Cloud CLI.

        2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

        3. To initialize the gcloud CLI, run the following command:

          gcloud init
        4. If you're using a local shell, then create local authentication credentials for your user account:

          gcloud auth application-default login

          You don't need to do this if you're using Cloud Shell.

          If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

        Per ulteriori informazioni, vedi Set up authentication for a local development environment.

        Java

        Per utilizzare gli esempi di Java questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura le Credenziali predefinite dell'applicazione con le tue credenziali utente.

        1. Install the Google Cloud CLI.

        2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

        3. To initialize the gcloud CLI, run the following command:

          gcloud init
        4. If you're using a local shell, then create local authentication credentials for your user account:

          gcloud auth application-default login

          You don't need to do this if you're using Cloud Shell.

          If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

        Per ulteriori informazioni, vedi Set up authentication for a local development environment.

        Node.js

        Per utilizzare gli esempi di Node.js questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura le Credenziali predefinite dell'applicazione con le tue credenziali utente.

        1. Install the Google Cloud CLI.

        2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

        3. To initialize the gcloud CLI, run the following command:

          gcloud init
        4. If you're using a local shell, then create local authentication credentials for your user account:

          gcloud auth application-default login

          You don't need to do this if you're using Cloud Shell.

          If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

        Per ulteriori informazioni, vedi Set up authentication for a local development environment.

        Python

        Per utilizzare gli esempi di Python questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura le Credenziali predefinite dell'applicazione con le tue credenziali utente.

        1. Install the Google Cloud CLI.

        2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

        3. To initialize the gcloud CLI, run the following command:

          gcloud init
        4. If you're using a local shell, then create local authentication credentials for your user account:

          gcloud auth application-default login

          You don't need to do this if you're using Cloud Shell.

          If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

        Per ulteriori informazioni, vedi Set up authentication for a local development environment.

        REST

        Per utilizzare gli esempi di API REST in questa pagina in un ambiente di sviluppo locale, utilizzi le credenziali che fornisci a gcloud CLI.

          After installing the Google Cloud CLI, initialize it by running the following command:

          gcloud init

          If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

        Per saperne di più, consulta la sezione Autenticarsi per l'utilizzo di REST nella documentazione sull'autenticazione di Google Cloud .

Creare un'immagine personalizzata

Questa sezione descrive come creare un'immagine personalizzata su una VM Linux. Per informazioni sulla creazione di un'immagine Windows, vedi Creazione di un'immagine Windows.

Seleziona una posizione di archiviazione delle immagini

Quando crei un'immagine personalizzata, puoi specificare la località in Cloud Storage dell'immagine, escluse quelle a due regioni. Specificando la località di archiviazione delle immagini, puoi soddisfare i requisiti normativi e di conformità per la localizzazione dei dati, nonché quelli per le esigenze di alta affidabilità, così da garantire la ridondanza tra regioni. Per creare, modificare ed eliminare immagini archiviate in Cloud Storage, devi disporre di roles/compute.storageAdmin.

La funzionalità della località di archiviazione è facoltativa. Se non selezioni una località, Compute Engine archivia l'immagine nella località multiregionale più vicina all'origine dell'immagine. Ad esempio, quando crei un'immagine da un disco di origine che si trova in us-central1 e se non specifichi una località per l'immagine personalizzata, Compute Engine archivia l'immagine nella multiregione us.

Se l'immagine non è disponibile in una regione in cui stai creando una VM, Compute Engine la memorizza nella cache in quella regione la prima volta che crei una VM.

Per visualizzare la posizione in cui è archiviata un'immagine, utilizza il images describe comando da gcloud compute:

gcloud compute images describe IMAGE_NAME \
    --project=PROJECT_ID

Sostituisci quanto segue:

  • IMAGE_NAME: il nome dell'immagine.

  • PROJECT_ID: l'ID progetto a cui appartiene l'immagine.

Tutte le immagini esistenti prima del lancio di questa funzionalità rimarranno dove si trovano, l'unica differenza è che puoi visualizzare la località di tutte le immagini. Se vuoi spostare un'immagine esistente, devi ricrearla nella nuova posizione.

Preparare la VM per un'immagine

Puoi creare un'immagine da un disco anche se è collegato a una VM in esecuzione. Tuttavia, l'immagine è più affidabile se metti la VM in uno stato più facile da acquisire. Questa sezione descrive come preparare il disco di avvio per l'immagine.

Ridurre al minimo la scrittura di dati sul disco permanente

Utilizza uno dei seguenti processi per ridurre le scritture su disco:

  • Arresta la VM in modo che possa essere arrestata e smettere di scrivere dati sul disco permanente.

  • Se non puoi arrestare la VM prima di creare l'immagine, riduci al minimo la quantità di scritture sul disco e sincronizza il file system. Per ridurre al minimo la scrittura sul disco permanente, segui questi passaggi:

    1. Metti in pausa le app o i processi del sistema operativo che scrivono dati sul disco permanente.
    2. Se necessario, esegui lo svuotamento dell'app sul disco. Ad esempio, MySQL ha un'istruzione FLUSH. Altre app potrebbero avere procedure simili.
    3. Impedisci alle tue app di scrivere sul disco permanente.
    4. Esegui sudo sync.

Disattiva l'opzione di eliminazione automatica per il disco

Per impostazione predefinita, l'opzione di eliminazione automatica è abilitata sui dischi di avvio. Prima di creare un'immagine da un disco, disattiva l'eliminazione automatica per assicurarti che il disco non venga eliminato automaticamente quando elimini la VM.

Utilizza uno dei seguenti metodi per disattivare l'eliminazione automatica per il disco.

Console

  1. Nella console Google Cloud , vai alla pagina Istanze VM.

    Vai alla pagina Istanze VM

  2. Fai clic sul nome della VM che utilizzi come origine per creare un'immagine.

    Viene visualizzata la pagina Dettagli istanza VM.

  3. Fai clic su Modifica.

  4. Nella sezione Disco di avvio, per la Regola di eliminazione, assicurati che sia selezionata l'opzione Conserva disco.

  5. Fai clic su Salva.

gcloud

In Google Cloud CLI, utilizza il comando gcloud compute instances set-disk-auto-delete per disattivare l'opzione di eliminazione automatica per il disco.

gcloud compute instances set-disk-auto-delete VM_NAME \
    --no-auto-delete \
    --disk=SOURCE_DISK

Sostituisci quanto segue:

  • VM_NAME: il nome dell'istanza VM.
  • SOURCE_DISK: il nome del disco da cui vuoi creare l'immagine.

Vai

Go

Prima di provare questo esempio, segui le istruzioni di configurazione di Go nella guida rapida di Compute Engine per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Compute Engine per Go.

Per effettuare l'autenticazione in Compute Engine, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
)

// setDiskAutodelete sets the autodelete flag of a disk to given value.
func setDiskAutoDelete(
	w io.Writer,
	projectID, zone, instanceName, diskName string, autoDelete bool,
) error {
	// projectID := "your_project_id"
	// zone := "us-west3-b"
	// instanceName := "your_instance_name"
	// diskName := "your_disk_name"
	// autoDelete := true

	ctx := context.Background()
	instancesClient, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer instancesClient.Close()

	getInstanceReq := &computepb.GetInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	instance, err := instancesClient.Get(ctx, getInstanceReq)
	if err != nil {
		return fmt.Errorf("unable to get instance: %w", err)
	}

	diskExists := false

	for _, disk := range instance.GetDisks() {
		if disk.GetDeviceName() == diskName {
			diskExists = true
			break
		}
	}

	if !diskExists {
		return fmt.Errorf(
			"instance %s doesn't have a disk named %s attached",
			instanceName,
			diskName,
		)
	}

	req := &computepb.SetDiskAutoDeleteInstanceRequest{
		Project:    projectID,
		Zone:       zone,
		Instance:   instanceName,
		DeviceName: diskName,
		AutoDelete: autoDelete,
	}

	op, err := instancesClient.SetDiskAutoDelete(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to set disk autodelete field: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "disk autoDelete field updated.\n")

	return nil
}

Java

Java

Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella guida rapida di Compute Engine per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Compute Engine per Java.

Per effettuare l'autenticazione in Compute Engine, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.


import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.SetDiskAutoDeleteInstanceRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class SetDiskAutodelete {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.

    // Project ID or project number of the Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";

    // The zone of the disk that you want to modify.
    String zone = "europe-central2-b";

    // Name of the instance the disk is attached to.
    String instanceName = "YOUR_INSTANCE_NAME";

    // The name of the disk for which you want to modify the autodelete flag.
    String diskName = "YOUR_DISK_NAME";

    // The new value of the autodelete flag.
    boolean autoDelete = true;

    setDiskAutodelete(projectId, zone, instanceName, diskName, autoDelete);
  }

  // Sets the autodelete flag of a disk to given value.
  public static void setDiskAutodelete(String projectId, String zone, String instanceName,
      String diskName, boolean autoDelete)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `instancesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      // Retrieve the instance given by the instanceName.
      Instance instance = instancesClient.get(projectId, zone, instanceName);

      // Check if the instance contains a disk that matches the given diskName.
      boolean diskNameMatch = instance.getDisksList()
          .stream()
          .anyMatch(disk -> disk.getDeviceName().equals(diskName));

      if (!diskNameMatch) {
        throw new Error(
            String.format("Instance %s doesn't have a disk named %s attached", instanceName,
                diskName));
      }

      // Create the request object.
      SetDiskAutoDeleteInstanceRequest request = SetDiskAutoDeleteInstanceRequest.newBuilder()
          .setProject(projectId)
          .setZone(zone)
          .setInstance(instanceName)
          .setDeviceName(diskName)
          // Update the autodelete property.
          .setAutoDelete(autoDelete)
          .build();

      // Wait for the update instance operation to complete.
      Operation response = instancesClient.setDiskAutoDeleteAsync(request)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Failed to update Disk autodelete field!" + response);
        return;
      }
      System.out.println(
          "Disk autodelete field updated. Operation Status: " + response.getStatus());
    }
  }
}

Node.js

Node.js

Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js nella guida rapida di Compute Engine per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Compute Engine per Node.js.

Per effettuare l'autenticazione in Compute Engine, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b';
// const instanceName = 'YOUR_INSTANCE_NAME';
// const diskName = 'YOUR_DISK_NAME';
// const autoDelete = true;

const compute = require('@google-cloud/compute');

async function setDiskAutodelete() {
  const instancesClient = new compute.InstancesClient();

  const [instance] = await instancesClient.get({
    project: projectId,
    zone,
    instance: instanceName,
  });

  if (!instance.disks.some(disk => disk.deviceName === diskName)) {
    throw new Error(
      `Instance ${instanceName} doesn't have a disk named ${diskName} attached.`
    );
  }

  const [response] = await instancesClient.setDiskAutoDelete({
    project: projectId,
    zone,
    instance: instanceName,
    deviceName: diskName,
    autoDelete,
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

  // Wait for the update instance operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log('Disk autoDelete field updated.');
}

setDiskAutodelete();

Python

Python

Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di Compute Engine per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Compute Engine per Python.

Per effettuare l'autenticazione in Compute Engine, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def set_disk_autodelete(
    project_id: str, zone: str, instance_name: str, disk_name: str, autodelete: bool
) -> None:
    """
    Set the autodelete flag of a disk to given value.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone in which is the disk you want to modify.
        instance_name: name of the instance the disk is attached to.
        disk_name: the name of the disk which flag you want to modify.
        autodelete: the new value of the autodelete flag.
    """
    instance_client = compute_v1.InstancesClient()
    instance = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )

    for disk in instance.disks:
        if disk.device_name == disk_name:
            break
    else:
        raise RuntimeError(
            f"Instance {instance_name} doesn't have a disk named {disk_name} attached."
        )

    disk.auto_delete = autodelete

    operation = instance_client.update(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instance_resource=instance,
    )

    wait_for_extended_operation(operation, "disk update")

REST

Per impostare l'opzione di eliminazione automatica di un disco, invia una richiesta POST al metodo instances.setDiskAutoDelete.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setDiskAutoDelete?autoDelete=false&deviceName=SOURCE_DISK

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto a cui appartiene la VM di origine.
  • ZONE: la zona in cui si trova la VM di origine.
  • VM_NAME: il nome della VM di origine.
  • SOURCE_DISK: il nome del dispositivo del disco da cui vuoi creare l'immagine.

Dopo aver preparato la VM, crea l'immagine.

Crea l'immagine

Puoi creare immagini dei dischi dalle seguenti origini:

  • Un disco permanente, anche se è collegato a una VM
  • Uno snapshot di un disco permanente
  • Un'altra immagine nel progetto
  • Un'immagine condivisa da un altro progetto
  • Un'immagine RAW compressa in Cloud Storage

Puoi creare un'immagine del disco una volta ogni 10 minuti. Se vuoi inviare una serie di richieste per creare un'immagine disco, puoi inviare al massimo 6 richieste in 60 minuti. Per saperne di più, consulta la sezione Limiti di frequenza degli snapshot.

Console

  1. Nella console Google Cloud , vai alla pagina Crea un'immagine.

    Vai a Crea un'immagine

  2. Specifica il Nome dell'immagine.

  3. Specifica l'Origine da cui vuoi creare un'immagine. Può trattarsi di un disco permanente, uno snapshot, un'altra immagine o un file disk.raw in Cloud Storage.

  4. Se stai creando un'immagine da un disco collegato a una VM in esecuzione, seleziona Mantieni istanza in esecuzione per confermare che vuoi creare l'immagine mentre la VM è in esecuzione. Puoi preparare la VM prima di creare l'immagine.

  5. Nell'elenco a discesa Basata sulla posizione del disco di origine (impostazione predefinita), specifica la posizione in cui archiviare l'immagine. Ad esempio, specifica us per archiviare l'immagine nella località multiregionale us oppure us-central1 per archiviarla nella regione us-central1. Se non effettui una selezione, Compute Engine archivia l'immagine nella multi-regione più vicina a quella di origine dell'immagine.

  6. (Facoltativo) Specifica le proprietà dell'immagine.

    • Famiglia: la famiglia di immagini a cui appartiene questa nuova immagine.
    • Descrizione: una descrizione dell'immagine personalizzata.
    • Etichetta: un'etichetta per raggruppare le risorse.
  7. Specifica la chiave di crittografia. Puoi scegliere tra una Google-owned and Google-managed encryption key, una chiave Cloud Key Management Service (Cloud KMS) o una chiave di crittografia fornita dal cliente (CSEK). Se non viene specificata alcuna chiave di crittografia, le immagini vengono criptate utilizzando un Google-owned and Google-managed encryption key.

  8. Fai clic su Crea per creare l'immagine.

gcloud

In Google Cloud CLI, utilizza il comando gcloud compute images create per creare un'immagine personalizzata.

Crea un'immagine da un disco di origine:

Il flag --force è un flag facoltativo che consente di creare l'immagine da un'istanza in esecuzione. Per impostazione predefinita, non puoi creare immagini da istanze in esecuzione. Specifica questo flag solo se vuoi creare l'immagine mentre l'istanza è in esecuzione.

gcloud compute images create IMAGE_NAME \
    --source-disk=SOURCE_DISK \
    --source-disk-zone=ZONE \
    [--family=IMAGE_FAMILY] \
    [--storage-location=LOCATION] \
    [--force]

Sostituisci quanto segue:

  • IMAGE_NAME: un nome per la nuova immagine
  • SOURCE_DISK: il disco da cui vuoi creare l'immagine
  • ZONE: la zona in cui si trova il disco
  • IMAGE_FAMILY: (facoltativo) un flag che specifica a quale famiglia di immagini appartiene questa immagine
  • LOCATION: (facoltativo) un flag che consente di designare la regione o le regioni in cui è archiviata l'immagine. Ad esempio, specifica us per archiviare l'immagine nella località multiregionale us oppure us-central1 per archiviarla nella regione us-central1. Se non effettui una selezione, Compute Engine archivia l'immagine nella multi-regione più vicina alla località di origine dell'immagine.

Crea un'immagine da un'immagine di origine:

gcloud compute images create IMAGE_NAME \
  --source-image=SOURCE_IMAGE \
  [--source-image-project=IMAGE_PROJECT] \
  [--family=IMAGE_FAMILY] \
  [--storage-location=LOCATION]

Sostituisci quanto segue:

  • IMAGE_NAME: un nome per la nuova immagine.
  • SOURCE_IMAGE: l'immagine da cui vuoi creare la nuova immagine.
  • IMAGE_PROJECT: (facoltativo) il progetto in cui si trova l'immagine di origine. Utilizza questo parametro se vuoi copiare un'immagine da un altro progetto.
  • IMAGE_FAMILY: (facoltativo) la famiglia di immagini a cui appartiene questa nuova immagine.
  • LOCATION: (facoltativo) consente di designare la regione o le regioni in cui è archiviata l'immagine. Ad esempio, specifica us per archiviare l'immagine nella località multiregionale us oppure us-central1 per archiviarla nella regione us-central1. Se non effettui una selezione, Compute Engine archivia l'immagine nella multi-regione più vicina a quella di origine dell'immagine.

Crea un'immagine da uno snapshot:

gcloud compute images create IMAGE_NAME \
    --source-snapshot=SOURCE_SNAPSHOT \
    [--storage-location=LOCATION]

Sostituisci quanto segue:

  • IMAGE_NAME: un nome per la nuova immagine
  • SOURCE_SNAPSHOT: lo snapshot da cui vuoi creare l'immagine
  • LOCATION: (facoltativo) un flag che consente di designare la regione o le regioni in cui è archiviata l'immagine. Ad esempio, specifica us per archiviare l'immagine nella località multiregionale us oppure us-central1 per archiviarla nella regione us-central1. Se non effettui una selezione, Compute Engine archivia l'immagine nella multi-regione più vicina alla località di origine dell'immagine.

Visualizzare la posizione di un'immagine:

Utilizza il comando gcloud compute images describe per visualizzare la posizione di un'immagine.

gcloud compute images describe IMAGE_NAME

Sostituisci IMAGE_NAME con il nome dell'immagine che vuoi esaminare.

Vai

Go

Prima di provare questo esempio, segui le istruzioni di configurazione di Go nella guida rapida di Compute Engine per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Compute Engine per Go.

Per effettuare l'autenticazione in Compute Engine, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
)

// Creates a disk image from an existing disk
func createImageFromDisk(
	w io.Writer,
	projectID, zone, sourceDiskName, imageName string,
	storageLocations []string,
	forceCreate bool,
) error {
	// projectID := "your_project_id"
	// zone := "us-central1-a"
	// sourceDiskName := "your_disk_name"
	// imageName := "my_image"
	// // If storageLocations empty, automatically selects the closest one to the source
	// storageLocations = []string{}
	// // If forceCreate is set to `true`, proceeds even if the disk is attached to
	// // a running instance. This may compromise integrity of the image!
	// forceCreate = false

	ctx := context.Background()
	disksClient, err := compute.NewDisksRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewDisksRESTClient: %w", err)
	}
	defer disksClient.Close()
	imagesClient, err := compute.NewImagesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewImagesRESTClient: %w", err)
	}
	defer imagesClient.Close()

	// Get the source disk
	source_req := &computepb.GetDiskRequest{
		Disk:    sourceDiskName,
		Project: projectID,
		Zone:    zone,
	}

	disk, err := disksClient.Get(ctx, source_req)
	if err != nil {
		return fmt.Errorf("unable to get source disk: %w", err)
	}

	// Create the image
	req := computepb.InsertImageRequest{
		ForceCreate: &forceCreate,
		ImageResource: &computepb.Image{
			Name:             &imageName,
			SourceDisk:       disk.SelfLink,
			StorageLocations: storageLocations,
		},
		Project: projectID,
	}

	op, err := imagesClient.Insert(ctx, &req)

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Disk image %s created\n", imageName)

	return nil
}

Java

Java

Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella guida rapida di Compute Engine per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Compute Engine per Java.

Per effettuare l'autenticazione in Compute Engine, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.


import com.google.cloud.compute.v1.Disk;
import com.google.cloud.compute.v1.DisksClient;
import com.google.cloud.compute.v1.Image;
import com.google.cloud.compute.v1.ImagesClient;
import com.google.cloud.compute.v1.InsertImageRequest;
import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateImage {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.

    // Project ID or project number of the Cloud project you use.
    String project = "your-project-id";
    // Zone of the disk you copy from.
    String zone = "europe-central2-b";
    // Name of the source disk you copy from.
    String sourceDiskName = "source-disk-name";
    // Name of the image you want to create.
    String imageName = "your-image-name";
    // Storage location for the image. If the value is undefined,
    // function will store the image in the multi-region closest to your image's source location.
    String storageLocation = "eu";
    // Create the image even if the source disk is attached to a running instance.
    boolean forceCreate = false;

    createImage(project, zone, sourceDiskName, imageName, storageLocation, forceCreate);
  }

  // Creates a new disk image from the specified source disk.
  public static void createImage(String project, String zone, String sourceDiskName,
      String imageName, String storageLocation, boolean forceCreate)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `client.close()` method on the client to safely
    // clean up any remaining background resources.
    try (ImagesClient imagesClient = ImagesClient.create();
        InstancesClient instancesClient = InstancesClient.create();
        DisksClient disksClient = DisksClient.create()) {

      Disk disk = disksClient.get(project, zone, sourceDiskName);

      // Getting instances where source disk is attached.
      for (String fullInstanceName : disk.getUsersList()) {
        Map<String, String> instanceInfo = parseInstanceName(fullInstanceName);
        Instance instance = instancesClient.get(instanceInfo.get("instanceProjectId"),
            instanceInfo.get("instanceZone"), instanceInfo.get("instanceName"));

        // Сheck whether the instances are stopped.
        if (!Arrays.asList("TERMINATED", "STOPPED").contains(instance.getStatus())
            && !forceCreate) {
          throw new IllegalStateException(
              String.format(
                  "Instance %s should be stopped. For Windows instances please stop the instance "
                      + "using GCESysprep command. For Linux instances just shut it down normally."
                      + " You can suppress this error and create an image of the disk by setting "
                      + "'forceCreate' parameter to true (not recommended). "
                      + "More information here: "
                      + "* https://cloud.google.com/compute/docs/instances/windows/creating-windows-os-image#api"
                      + "* https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#prepare_instance_for_image",
                  instanceInfo.get("instanceName")));
        }
      }

      if (forceCreate) {
        System.out.println(
            "Warning: forceCreate option compromise the integrity of your image. "
                + "Stop the instance before you create the image if possible.");
      }

      // Create Image.
      IImageimage = IImagenewBuilder()
          .setName(imageName)
          .setSourceDisk(String.format("/zones/%s/disks/%s", zone, sourceDiskName))
          .addStorageLocations(storageLocation.isEmpty() ? "" : storageLocation)
          .build();

      IInsertImageRequestinsertImageRequest = IInsertImageRequestnewBuilder()
          .setProject(project)
          .ssetForceCreateforceCreate)
          .setImageResource(image)
          .build();

      OOperationresponse = imagesClient.insertAsync(insertImageRequest).get(5, TimeUnit.MINUTES);

      if (rresponse.hasError() {
        System.out.println("Image creation failed ! ! " + response);
        return;
      }

      System.out.println("Image created.");
    }
  }


  public static Map<String, String> parseInstanceName(String name) {
    String[] parsedName = name.split("/");
    int splitLength = parsedName.length;

    if (splitLength < 5) {
      throw new IllegalArgumentException(
          "Provide correct instance name in the following format: "
              + "https://www.googleapis.com/compute/v1/projects/PROJECT/zones/ZONE/instances/INSTANCE_NAME");
    }

    return new HashMap<>() {
      {
        put("instanceName", parsedName[splitLength - 1]);
        put("instanceZone", parsedName[splitLength - 3]);
        put("instanceProjectId", parsedName[splitLength - 5]);
      }
    };
  }

}

Python

Python

Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di Compute Engine per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Compute Engine per Python.

Per effettuare l'autenticazione in Compute Engine, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

from __future__ import annotations

import sys
from typing import Any
import warnings

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


STOPPED_MACHINE_STATUS = (
    compute_v1.Instance.Status.TERMINATED.name,
    compute_v1.Instance.Status.STOPPED.name,
)


def create_image_from_disk(
    project_id: str,
    zone: str,
    source_disk_name: str,
    image_name: str,
    storage_location: str | None = None,
    force_create: bool = False,
) -> compute_v1.Image:
    """
    Creates a new disk image.

    Args:
        project_id: project ID or project number of the Cloud project you use.
        zone: zone of the disk you copy from.
        source_disk_name: name of the source disk you copy from.
        image_name: name of the image you want to create.
        storage_location: storage location for the image. If the value is undefined,
            function will store the image in the multi-region closest to your image's
            source location.
        force_create: create the image even if the source disk is attached to a
            running instance.

    Returns:
        An Image object.
    """
    image_client = compute_v1.ImagesClient()
    disk_client = compute_v1.DisksClient()
    instance_client = compute_v1.InstancesClient()

    # Get source disk
    disk = disk_client.get(project=project_id, zone=zone, disk=source_disk_name)

    for disk_user in disk.users:
        instance_name = disk_user.split("/")[-1]
        instance = instance_client.get(
            project=project_id, zone=zone, instance=instance_name
        )
        if instance.status in STOPPED_MACHINE_STATUS:
            continue
        if not force_create:
            raise RuntimeError(
                f"Instance {disk_user} should be stopped. For Windows instances please "
                f"stop the instance using `GCESysprep` command. For Linux instances just "
                f"shut it down normally. You can supress this error and create an image of"
                f"the disk by setting `force_create` parameter to true (not recommended). \n"
                f"More information here: \n"
                f" * https://cloud.google.com/compute/docs/instances/windows/creating-windows-os-image#api \n"
                f" * https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#prepare_instance_for_image"
            )
        else:
            warnings.warn(
                f"Warning: The `force_create` option may compromise the integrity of your image. "
                f"Stop the {disk_user} instance before you create the image if possible."
            )

    # Create image
    image = compute_v1.Image()
    image.source_disk = disk.self_link
    image.name = image_name
    if storage_location:
        image.storage_locations = [storage_location]

    operation = image_client.insert(project=project_id, image_resource=image)

    wait_for_extended_operation(operation, "image creation from disk")

    return image_client.get(project=project_id, image=image_name)

REST

Invia una richiesta POST al metodo images().insert, un URL nel corpo della richiesta che rimanda all'oggetto di origine da cui vuoi creare l'immagine. Specifica gli URL delle tue risorse utilizzando il tuo ID progetto e i nomi delle risorse.

Crea un'immagine da un disco permanente:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images

{
  "name": "IMAGE_NAME",
  "sourceDisk": "/zones/ZONE/disks/SOURCE_DISK",
  ("storageLocations": "LOCATION",)
  ("forceCreate": "TRUE")
}

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto a cui appartiene l'immagine.
  • IMAGE_NAME: un nome per la nuova immagine che vuoi creare.
  • ZONE: la zona in cui si trova il disco di origine.
  • SOURCE_DISK: il disco da cui vuoi creare l'immagine.
  • LOCATION: (Facoltativo) la posizione di archiviazione dell'immagine. Ad esempio, specifica us per archiviare l'immagine nella località multiregionale us oppure us-central1 per archiviarla nella regione us-central1. Se non effettui una selezione, Compute Engine archivia l'immagine nella località multiregionale più vicina a quella di origine dell'immagine.

Il parametro facoltativo forceCreate consente di creare l'immagine da una VM in esecuzione. Specifica TRUE solo se vuoi creare l'immagine da una VM in esecuzione. L'forceCreateimpostazione predefinita è FALSE.

Creare un'immagine da un'altra immagine:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images

{
  "name": "IMAGE_NAME",
  "sourceImage": "/global/images/SOURCE_IMAGE",
  ("storageLocations": "LOCATION")
}

Sostituisci quanto segue:

  • PROJECT_ID: il progetto a cui appartiene l'immagine.
  • IMAGE_NAME: un nome per la nuova immagine che vuoi creare.
  • SOURCE_IMAGE: l'immagine da cui vuoi creare l'immagine.
  • LOCATION: (Facoltativo) la posizione di archiviazione dell'immagine. Ad esempio, specifica us per archiviare l'immagine nella località multiregionale us oppure us-central1 per archiviarla nella regione us-central1. Se non effettui una selezione, Compute Engine archivia l'immagine nella multi-regione più vicina alla località di origine dell'immagine.

Crea un'immagine da uno snapshot:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images
{
  "name": "IMAGE_NAME",
  "sourceSnapshot": "(/SOURCE_PROJECT_ID)/global/snapshots/SOURCE_SNAPSHOT",
  ("storageLocations": "LOCATION")
}

Sostituisci quanto segue:

  • PROJECT_ID: il progetto a cui appartiene l'immagine.
  • IMAGE_NAME: un nome per la nuova immagine che vuoi creare.
  • SOURCE_PROJECT_ID: (facoltativo) il progetto in cui si trova lo snapshot. Devi disporre dell'autorizzazione per accedere alla risorsa snapshot in quel progetto.
  • SOURCE_SNAPSHOT: lo snapshot da cui vuoi creare l'immagine.
  • LOCATION: (Facoltativo) la posizione di archiviazione dell'immagine. Ad esempio, specifica us per archiviare l'immagine nella località multiregionale us oppure us-central1 per archiviarla nella regione us-central1. Se non effettui una selezione, Compute Engine archivia l'immagine nella località multiregionale più vicina a quella di origine dell'immagine.

Per saperne di più sull'aggiunta di immagini, consulta la documentazione di riferimento sulle immagini.

Condividere l'immagine

Dopo aver creato un'immagine personalizzata, puoi condividerla tra i progetti. Se consenti agli utenti di un altro progetto di utilizzare le tue immagini personalizzate, questi possono accedere a queste immagini specificando il progetto di immagini nella loro richiesta.

Attivare le funzionalità del sistema operativo guest

Utilizza le funzionalità del sistema operativo guest per configurare le seguenti opzioni di rete, sicurezza, archiviazione e sistema operativo sulle immagini personalizzate. Le immagini personalizzate con queste funzionalità configurate vengono utilizzate come dischi di avvio.

gcloud

Utilizza il comando gcloud compute images create con il flag --guest-os-features per creare una nuova immagine personalizzata da un'immagine personalizzata esistente.

gcloud compute images create IMAGE_NAME \
    --source-image=SOURCE_IMAGE \
    [--source-image-project=IMAGE_PROJECT] \
    --guest-os-features="FEATURES,..." \
    [--storage-location=LOCATION]

Sostituisci quanto segue:

  • IMAGE_NAME: il nome della nuova immagine
  • SOURCE_IMAGE: un'immagine su cui basare la nuova immagine
  • IMAGE_PROJECT: (facoltativo) il progetto contenente l'immagine di origine

    Utilizza questo parametro per copiare un'immagine da un altro progetto.

  • FEATURES: tag del sistema operativo guest per attivare le funzionalità per le VM che crei dalle immagini

    Per aggiungere più valori, utilizza le virgole per separarli. Imposta uno o più dei seguenti valori:

    • VIRTIO_SCSI_MULTIQUEUE. Utilizza su dispositivi SSD locali come alternativa a NVMe. Per saperne di più sulle immagini che supportano SCSI, consulta Scelta di un'interfaccia.

      Per le immagini Linux, puoi attivare SCSI multi-queue sui dispositivi SSD locali sulle immagini con versioni del kernel 3.17 o successive. Per le immagini Windows, puoi attivare SCSI multi-coda sui dispositivi SSD locali sulle immagini con il driver Windows di Compute Engine versione 1.2.

    • WINDOWS. Tagga le immagini di avvio personalizzate di Windows Server come immagini Windows.
    • MULTI_IP_SUBNET. Configura le interfacce con una maschera di rete diversa da /32. Per ulteriori informazioni su più interfacce di rete e sul loro funzionamento, consulta Panoramica ed esempi di più interfacce di rete.
    • UEFI_COMPATIBLE. Avvio con firmware UEFI e le seguenti funzionalità Shielded VM:
    • GVNIC. Supporta larghezze di banda di rete più elevate fino a velocità da 50 Gbps a 100 Gbps. Per maggiori informazioni, consulta Utilizzo di Google Virtual NIC.
    • IDPF. Supporta le interfacce di rete Intel Infrastructure Data Path Function (IDPF).
    • SEV_CAPABLE o SEV_SNP_CAPABLE. Utilizza questi tag se vuoi utilizzare l'immagine su un'istanza Confidential VM con supporto di AMD Secure Encrypted Virtualization (SEV) o AMD Secure Encrypted Virtualization-Secure Nested Paging (SEV-SNP). Per verificare se il kernel supporta AMD SEV o AMD SEV-SNP, consulta Dettagli del kernel Linux.
    • SEV_LIVE_MIGRATABLE_V2. Utilizza questo tag se vuoi utilizzare la tua immagine su un'istanza Confidential VM che supporta la migrazione live su AMD SEV. Per verificare se il kernel supporta la migrazione live, consulta Dettagli del kernel Linux.
    • TDX_CAPABLE. Utilizza questo tag se vuoi utilizzare la tua immagine su un'istanza Confidential VM con supporto per Intel Trust Domain Extensions (TDX). Per controllare se il kernel supporta Intel TDX, vedi Dettagli del kernel Linux.
  • LOCATION: (facoltativo) la regione o la multiregione in cui archiviare l'immagine

    Ad esempio, specifica us per archiviare l'immagine nella località multiregionale us oppure us-central1 per archiviarla nella regione us-central1. Se non effettui una selezione, Compute Engine archivia l'immagine nella multi-regione più vicina a quella di origine dell'immagine.

REST

Utilizza il metodo images().insert con il flag guestOsFeatures per creare una nuova immagine personalizzata da un'immagine personalizzata esistente.


POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images

{
 "name": "IMAGE_NAME",
 "sourceImage": "(projects/IMAGE_PROJECT)/global/images/SOURCE_IMAGE",
 ("storageLocations": "LOCATION",)
 "guestOsFeatures": [
  {
   "type": "FEATURES"
  }
 ]
}

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto in cui creare la nuova immagine
  • IMAGE_NAME: un nome per la nuova immagine
  • IMAGE_PROJECT: (facoltativo) il progetto contenente l'immagine di origine

    Utilizza questo parametro per copiare un'immagine da un altro progetto.

  • SOURCE_IMAGE: l'immagine su cui basare la nuova immagine

  • LOCATION: (facoltativo) una regione o più regioni in cui archiviare l'immagine

    Ad esempio, specifica us per archiviare l'immagine nella località multiregionale us oppure us-central1 per archiviarla nella regione us-central1. Se non effettui una selezione, Compute Engine archivia l'immagine nella località multiregionale più vicina a quella di origine dell'immagine.

  • FEATURES: tag del sistema operativo guest per attivare le funzionalità per le VM che crei dalle immagini

    Per aggiungere più valori, utilizza le virgole per separarli. Imposta uno o più dei seguenti valori:

    • VIRTIO_SCSI_MULTIQUEUE. Utilizza su dispositivi SSD locali come alternativa a NVMe. Per saperne di più sulle immagini che supportano SCSI, consulta Scelta di un'interfaccia.

      Per le immagini Linux, puoi attivare SCSI multi-queue sui dispositivi SSD locali sulle immagini con versioni del kernel 3.17 o successive. Per le immagini Windows, puoi attivare SCSI multi-coda sui dispositivi SSD locali sulle immagini con il driver Windows di Compute Engine versione 1.2.

    • WINDOWS. Tagga le immagini di avvio personalizzate di Windows Server come immagini Windows.
    • MULTI_IP_SUBNET. Configura le interfacce con una maschera di rete diversa da /32. Per ulteriori informazioni su più interfacce di rete e sul loro funzionamento, consulta Panoramica ed esempi di più interfacce di rete.
    • UEFI_COMPATIBLE. Avvio con firmware UEFI e le seguenti funzionalità Shielded VM:
    • GVNIC. Supporta larghezze di banda di rete più elevate fino a velocità da 50 Gbps a 100 Gbps. Per maggiori informazioni, consulta Utilizzo di Google Virtual NIC.
    • IDPF. Supporta le interfacce di rete Intel Infrastructure Data Path Function (IDPF).
    • SEV_CAPABLE o SEV_SNP_CAPABLE. Utilizza questi tag se vuoi utilizzare l'immagine su un'istanza Confidential VM con supporto di AMD Secure Encrypted Virtualization (SEV) o AMD Secure Encrypted Virtualization-Secure Nested Paging (SEV-SNP). Per verificare se il kernel supporta AMD SEV o AMD SEV-SNP, consulta Dettagli del kernel Linux.
    • SEV_LIVE_MIGRATABLE_V2. Utilizza questo tag se vuoi utilizzare la tua immagine su un'istanza Confidential VM che supporta la migrazione live su AMD SEV. Per verificare se il kernel supporta la migrazione live, consulta Dettagli del kernel Linux.
    • TDX_CAPABLE. Utilizza questo tag se vuoi utilizzare la tua immagine su un'istanza Confidential VM con supporto per Intel Trust Domain Extensions (TDX). Per controllare se il kernel supporta Intel TDX, vedi Dettagli del kernel Linux.

Evitare informazioni sensibili nelle variabili UEFI

Le variabili Unified Extensible Firmware Interface (UEFI) sono variabili di coppie chiave-valore utilizzate dal firmware UEFI durante l'avvio per avviare il sistema operativo di una VM. A differenza delle macchine fisiche, in cui le variabili sono archiviate su un chip hardware, Compute Engine virtualizza l'archiviazione di queste variabili. Pertanto, in molti sistemi operativi, tutte le applicazioni e gli utenti possono raggiungere queste variabili e accedere a queste informazioni.

Per questo motivo, Google consiglia vivamente di non scrivere o archiviare informazioni sensibili o che consentono l'identificazione personale, come password o chiavi private, nelle variabili UEFI.

Considerazioni per le immagini Arm

Google offre le serie di macchine C4A e Tau T2A, che vengono eseguite su piattaforme CPU Arm. Puoi avviare una VM con una di queste serie di macchine e poi utilizzare la VM di origine per creare un'immagine Arm. La procedura per creare un'immagine Arm personalizzata è identica a quella per creare un'immagine x86.

Per aiutare gli utenti a distinguere le immagini Arm da quelle x86, le immagini Arm avranno il campo architecture impostato su ARM64. I valori possibili per questo campo sono:

  • ARCHITECTURE_UNSPECIFIED
  • X86_64
  • ARM64

Gli utenti delle immagini possono quindi filtrare in base a questo campo per trovare immagini basate su x86 o Arm.

Passaggi successivi