Créer des images personnalisées


Vous pouvez créer des images personnalisées à partir de disques, d'images, d'instantanés sources ou d'images stockées dans Cloud Storage, puis utiliser ces images pour créer des instances de machines virtuelles (VM). Les images personnalisées sont idéales lorsque vous avez créé et modifié un disque de démarrage persistant ou une image spécifique dans un certain état et devez enregistrer cet état pour créer des VM.

Vous pouvez également utiliser l'outil d'importation de disque virtuel pour importer des images de disque de démarrage dans Compute Engine à partir de vos systèmes existants et les ajouter à votre liste d'images personnalisée.

.

Avant de commencer

  • Consultez l'article Images.
  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Google Cloud. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine en sélectionnant l'une des options suivantes:

    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. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Go

      Pour utiliser les exemples Go de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. 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.

      Pour en savoir plus, consultez Set up authentication for a local development environment.

      Java

      Pour utiliser les exemples Java de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. 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.

      Pour en savoir plus, consultez Set up authentication for a local development environment.

      Node.js

      Pour utiliser les exemples Node.js de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. 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.

      Pour en savoir plus, consultez Set up authentication for a local development environment.

      Python

      Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. 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.

      Pour en savoir plus, consultez Set up authentication for a local development environment.

      REST

      Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Pour en savoir plus, consultez la section S'authentifier pour utiliser REST dans la documentation sur l'authentification Google Cloud.

Créer une image personnalisée

Cette section explique comment créer une image personnalisée sur une VM Linux. Pour en savoir plus sur la création d'une image Windows, consultez la page Créer une image Windows.

Sélectionner un emplacement de stockage d'images

Lors de la création d'une image personnalisée, vous pouvez spécifier son emplacement dans Cloud Storage, en excluant les emplacements birégionaux. En spécifiant l'emplacement de stockage de l'image, vous répondez aux exigences réglementaires et de conformité liées à la localisation des données ainsi qu'à vos exigences de haute disponibilité, en assurant la redondance entre régions. Pour créer, modifier et supprimer des images stockées dans Cloud Storage, vous devez disposer de roles/compute.storageAdmin.

La fonctionnalité d'emplacement de stockage est facultative. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke votre image dans l'emplacement multirégional le plus proche de l'image source. Par exemple, si vous créez une image à partir d'un disque source situé dans us-central1 et que vous ne spécifiez pas d'emplacement pour l'image personnalisée, Compute Engine stocke l'image dans l'emplacement multirégional us.

Si l'image n'est pas disponible dans une région où vous créez une VM, Compute Engine la met en cache dans cette région la première fois que vous créez une VM.

Pour connaître l'emplacement de stockage actuel d'une image, exécutez la commande images describe de gcloud compute :

gcloud compute images describe IMAGE_NAME \
    --project=PROJECT_ID

Remplacez l'élément suivant :

  • IMAGE_NAME : nom de votre image.

  • PROJECT_ID : l'ID de projet auquel appartient l'image.

Toutes les images existant avant le lancement de cette fonctionnalité restent à leur emplacement. La seule différence est que vous pouvez consulter l'emplacement de toutes vos images. Si vous souhaitez déplacer une image existante, vous devez la recréer à l'emplacement souhaité.

Préparer votre VM pour une image

Vous pouvez créer une image à partir d'un disque même si celui-ci est associé à une machine virtuelle en cours d'exécution. Cependant, votre image sera plus fiable si vous placez la VM dans un état rendant l'image plus facile à capturer. Cette section explique comment préparer votre disque de démarrage pour l'image.

Réduire l'écriture de données sur le disque persistant

Utilisez l'un des processus suivants pour réduire les écritures de disque :

  • Arrêtez la VM afin qu'elle puisse s'interrompre et arrêtez toute écriture de données sur le disque persistant.

  • Si vous ne pouvez pas arrêter votre VM avant de créer l'image, réduisez la quantité d'écritures sur le disque et synchronisez votre système de fichiers. Pour minimiser l'écriture sur votre disque persistant, procédez comme suit :

    1. Mettez en veille les applications ou les processus du système d'exploitation qui écrivent des données sur ce disque persistant.
    2. Si nécessaire, exécutez une application pour vider le disque. Par exemple, MySQL possède une instruction FLUSH. D'autres applications peuvent avoir des processus similaires.
    3. Empêchez vos applications d'écrire sur votre disque persistant.
    4. Exécutez sudo sync.

Désactiver l'option de suppression automatique du disque

Par défaut, l'option de suppression automatique est activée sur les disques de démarrage. Avant de créer une image à partir d'un disque, désactivez la suppression automatique pour vous assurer que le disque ne sera pas automatiquement supprimé lorsque vous supprimerez la VM.

Utilisez l'une des méthodes suivantes pour désactiver la suppression automatique du disque.

Console

  1. Dans Google Cloud Console, accédez à la page Instances de VM.

    Accéder à la page "Instances de VM"

  2. Cliquez sur le nom de la VM que vous utilisez comme source pour créer une image.

    La page Informations sur l'instance de VM s'affiche.

  3. Cliquez sur Modifier.

  4. Dans la section Disque de démarrage, pour la Règle de suppression, assurez-vous que l'option Conserver le disque est sélectionnée.

  5. Cliquez sur Enregistrer.

gcloud

Dans Google Cloud CLI, exécutez la commande gcloud compute instances set-disk-auto-delete pour désactiver l'option de suppression automatique du disque.

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

Remplacez les éléments suivants :

  • VM_NAME : nom de votre instance de VM.
  • SOURCE_DISK : nom du disque à partir duquel vous souhaitez créer l'image.

Go

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Go Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Java Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Node.js Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

/**
 * 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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Python Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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

Pour définir l'option de suppression automatique d'un disque, envoyez une requête POST à la méthode instances.setDiskAutoDelete.

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

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet auquel appartient la VM source.
  • ZONE : zone où se trouve la VM source.
  • VM_NAME : nom de la VM source.
  • SOURCE_DISK : nom d'appareil du disque à partir duquel vous souhaitez créer l'image.

Après avoir préparé la VM, créez l'image.

Créer l'image

Vous pouvez créer des images de disque à partir des sources suivantes :

  • Un disque persistant, même lorsque ce disque est associé à une VM
  • Un instantané d'un disque persistant
  • Une autre image dans votre projet
  • Une image partagée par un autre projet
  • Une image RAW compressée dans Google Cloud Storage

Vous pouvez créer une image disque toutes les dix minutes. Si vous souhaitez effectuer une série de requêtes de création d'images disque, vous ne pouvez pas émettre plus de six requêtes en 60 minutes. Pour en savoir plus, consultez la section Limites de fréquence des instantanés.

Console

  1. Dans Google Cloud Console, accédez à la page Créer une image.

    Accéder à la page "Créer une image"

  2. Indiquez le Nom de votre image.

  3. Spécifiez la Source à partir de laquelle vous souhaitez créer une image. Il peut s'agir d'un disque persistant, d'un instantané, d'une autre image ou d'un fichier au format disk.raw dans Google Cloud Storage.

  4. Si vous créez une image à partir d'un disque associé à une VM en cours d'exécution, cochez l'option Conserver l'instance en cours d'exécution pour confirmer que vous souhaitez créer l'image pendant l'exécution de la VM. Vous pouvez préparer votre VM avant de créer l'image.

  5. Dans la liste déroulante Basée sur l'emplacement du disque source (par défaut), spécifiez l'emplacement de stockage de l'image. Par exemple, spécifiez us pour stocker l'image dans l'emplacement multirégional us, ou us-central1 pour la stocker dans la région us-central1. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke l'image dans l'emplacement multirégional le plus proche de l'emplacement source de votre image.

  6. Facultatif : spécifiez les propriétés de votre image.

    • Famille : famille d'images à laquelle cette nouvelle image appartient.
    • Description : description de votre image personnalisée.
    • Libellé : libellé permettant de regrouper les ressources.
  7. Spécifiez la clé de chiffrement. Vous pouvez choisir entre une clé appartenant à Google et gérée par Google, une clé Cloud Key Management Service (Cloud KMS) ou une clé de chiffrement fournie par le client (CSEK). Si aucune clé de chiffrement n'est spécifiée, les images sont chiffrées à l'aide d'une clé appartenant à Google et gérée par Google.

  8. Cliquez sur Créer pour créer l'image.

gcloud

Dans Google Cloud CLI, utilisez la commande gcloud compute images create pour créer une image personnalisée.

Créer une image à partir d'un disque source :

L'option --force est une option facultative qui vous permet de créer l'image à partir d'une instance en cours d'exécution. Par défaut, vous ne pouvez pas créer d'images à partir d'instances en cours d'exécution. Ne spécifiez cette option que si vous êtes certain de vouloir créer l'image pendant que l'instance est en cours d'exécution.

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

Remplacez l'élément suivant :

  • IMAGE_NAME : nom de la nouvelle image.
  • SOURCE_DISK : disque à partir duquel vous souhaitez créer l'image.
  • ZONE : zone où se trouve le disque.
  • IMAGE_FAMILY : option facultative spécifiant la famille d'images à laquelle cette image appartient.
  • LOCATION : option facultative permettant de spécifier la région ou l'emplacement multirégional dans lequel l'image est stockée. Par exemple, spécifiez us pour stocker l'image dans l'emplacement multirégional us, ou us-central1 pour la stocker dans la région us-central1. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke l'image dans l'emplacement multirégional le plus proche de l'emplacement source de votre image.

Créer une image à partir d'une image source :

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

Remplacez les éléments suivants :

  • IMAGE_NAME : nom de la nouvelle image.
  • SOURCE_IMAGE : image à partir de laquelle vous souhaitez créer l'image.
  • IMAGE_PROJECT : projet contenant l'image source (facultatif). Utilisez ce paramètre si vous souhaitez copier une image d'un autre projet.
  • IMAGE_FAMILY : option facultative spécifiant la famille d'images à laquelle cette nouvelle image appartient.
  • LOCATION : option facultative permettant de spécifier la région ou l'emplacement multirégional dans lequel l'image est stockée. Par exemple, spécifiez us pour stocker l'image dans l'emplacement multirégional us, ou us-central1 pour la stocker dans la région us-central1. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke l'image dans l'emplacement multirégional le plus proche de l'emplacement source de votre image.

Créer une image à partir d'un instantané :

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

Remplacez l'élément suivant :

  • IMAGE_NAME : nom de la nouvelle image.
  • SOURCE_SNAPSHOT : instantané à partir duquel vous souhaitez créer l'image.
  • LOCATION : option facultative permettant de spécifier la région ou l'emplacement multirégional dans lequel l'image est stockée. Par exemple, spécifiez us pour stocker l'image dans l'emplacement multirégional us, ou us-central1 pour la stocker dans la région us-central1. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke l'image dans l'emplacement multirégional le plus proche de l'emplacement source de votre image.

Afficher l'emplacement d'une image :

Exécutez la commande gcloud compute images describe pour afficher l'emplacement d'une image.

gcloud compute images describe IMAGE_NAME

Remplacez IMAGE_NAME par le nom de l'image que vous souhaitez examiner.

Go

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Go Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Java Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


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.
      Image image = Image.newBuilder()
          .setName(imageName)
          .setSourceDisk(String.format("/zones/%s/disks/%s", zone, sourceDiskName))
          .addStorageLocations(storageLocation.isEmpty() ? "" : storageLocation)
          .build();

      InsertImageRequest insertImageRequest = InsertImageRequest.newBuilder()
          .setProject(project)
          .setForceCreate(forceCreate)
          .setImageResource(image)
          .build();

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

      if (response.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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Compute Engine à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Python Compute Engine.

Pour vous authentifier auprès de Compute Engine, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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

Envoyez une requête POST à la méthode images().insert, une URL dans le corps de la requête pointant vers l'objet source à partir duquel vous souhaitez créer l'image. Spécifiez les URL de vos ressources en utilisant vos propres ID de projet et noms de ressources.

Créer une image à partir d'un disque persistant :

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")
}

Remplacez l'élément suivant :

  • PROJECT_ID : l'ID de projet auquel appartient l'image.
  • IMAGE_NAME : nom de la nouvelle image que vous souhaitez créer.
  • ZONE : zone où se trouve le disque source.
  • SOURCE_DISK : disque à partir duquel vous souhaitez créer l'image.
  • LOCATION : emplacement de stockage de votre image (facultatif). Par exemple, spécifiez us pour stocker l'image dans l'emplacement multirégional us, ou us-central1 pour la stocker dans la région us-central1. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke l'image dans l'emplacement multirégional le plus proche de l'emplacement source de votre image.

Le paramètre facultatif forceCreate vous permet de créer l'image à partir d'une VM en cours d'exécution. Spécifiez TRUE uniquement si vous êtes certain de vouloir créer l'image à partir d'une VM en cours d'exécution. Le paramètre par défaut de forceCreate est FALSE.

Créer une image à partir d'une autre image :

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

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

Remplacez les éléments suivants :

  • PROJECT_ID : projet auquel appartient l'image.
  • IMAGE_NAME : nom de la nouvelle image que vous souhaitez créer.
  • SOURCE_IMAGE : image à partir de laquelle vous souhaitez créer l'image.
  • LOCATION : emplacement de stockage de votre image (facultatif). Par exemple, spécifiez us pour stocker l'image dans l'emplacement multirégional us, ou us-central1 pour la stocker dans la région us-central1. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke l'image dans l'emplacement multirégional le plus proche de la source de l'image.

Créer une image à partir d'un instantané :

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")
}

Remplacez les éléments suivants :

  • PROJECT_ID : projet auquel appartient l'image.
  • IMAGE_NAME : nom de la nouvelle image que vous souhaitez créer.
  • SOURCE_PROJECT_ID : projet contenant l'instantané (facultatif). Vous devez être autorisé à accéder à la ressource d'instantané dans ce projet.
  • SOURCE_SNAPSHOT : instantané à partir duquel vous souhaitez créer l'image.
  • LOCATION : emplacement de stockage de votre image (facultatif). Par exemple, spécifiez us pour stocker l'image dans l'emplacement multirégional us, ou us-central1 pour la stocker dans la région us-central1. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke l'image dans l'emplacement multirégional le plus proche de l'emplacement source de votre image.

Pour plus d'informations sur l'ajout d'images, consultez la documentation de référence sur les images.

Partager l'image

Après avoir créé une image personnalisée, vous pouvez la partager entre projets. Si vous autorisez les utilisateurs d'un autre projet à utiliser vos images personnalisées, ils peuvent accéder à ces images en spécifiant le projet d'images dans leur requête.

Activer les fonctionnalités du système d'exploitation invité

Utilisez les fonctionnalités de système d'exploitation invité (OS) pour configurer les options suivantes de mise en réseau, de sécurité, de stockage et de système d'exploitation sur des images personnalisées. Les images personnalisées avec ces fonctionnalités configurées sont utilisées comme disques de démarrage.

gcloud

Utilisez la commande gcloud compute images create avec l'option --guest-os-features pour créer une image personnalisée à partir d'une image personnalisée existante.

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

Remplacez les éléments suivants :

  • IMAGE_NAME : nom de la nouvelle image.
  • SOURCE_IMAGE : image sur laquelle sera basée la nouvelle image.
  • IMAGE_PROJECT : projet contenant l'image source (facultatif).

    Utilisez ce paramètre pour copier une image d'un autre projet.

  • FEATURES : tags du système d'exploitation invité pour activer les fonctionnalités des VM que vous créez à partir d'images.

    Pour ajouter plusieurs valeurs, séparez-les par des virgules. Définissez ce paramètre sur une ou plusieurs des valeurs suivantes :

    • VIRTIO_SCSI_MULTIQUEUE : utilisez sur les disques SSD locaux comme alternative à NVMe. Pour en savoir plus sur les images compatibles SCSI, consultez la section Choisir une interface.

      Pour les images Linux, vous pouvez activer la fonctionnalité SCSI à files d'attente multiples sur les disques SSD locaux pour les images dotées de la version 3.17 ou ultérieure du noyau. Pour les images Windows, vous pouvez activer la fonctionnalité SCSI à files d'attente multiples sur les disques SSD locaux pour les images dotées de la version 1.2 du pilote Windows Compute Engine.

    • WINDOWS. Ajoutez des tags aux images de démarrage personnalisées Windows Server en tant qu'images Windows.
    • MULTI_IP_SUBNET. Configurez des interfaces avec un masque de réseau autre que /32. Pour en savoir plus sur les interfaces réseau multiples et leur fonctionnement, consultez la section Présentation des interfaces réseau multiples et exemples.
    • UEFI_COMPATIBLE. Démarrez avec le micrologiciel UEFI et les fonctionnalités de VM protégée suivantes :
    • GVNIC. Compatibilité avec des bandes passantes réseau élevées ( de 50 Gbit/s à 100 Gbit/s). Pour en savoir plus, consultez la section Utiliser la carte d'interface réseau virtuelle Google.
    • IDPF. Prise en charge des interfaces réseau IDPF (Infrastructure Data Path Function) d'Intel.
    • SEV_CAPABLE ou SEV_SNP_CAPABLE. Utilisez ces balises si vous souhaitez utiliser votre image sur une instance de VM confidentielle avec la prise en charge de la fonctionnalité AMD SEV (Secure Encrypted Virtualization) ou AMD SEV-SNP (Secure Encrypted Virtualization-Secure Nested Paging). Pour vérifier si votre kernel est compatible avec AMD SEV ou AMD SEV-SNP, consultez la page Détails du kernel Linux.
    • SEV_LIVE_MIGRATABLE_V2. Utilisez cette balise si vous souhaitez utiliser votre image sur une instance de VM confidentielle compatible avec la migration à chaud sur AMD SEV. Pour vérifier si votre kernel est compatible avec la migration à chaud, consultez les détails du kernel Linux.
    • TDX_CAPABLE. Utilisez cette balise si vous souhaitez utiliser votre image sur une instance de VM confidentielle compatible avec les extensions de domaine de confiance (TDX) Intel. Pour vérifier si votre kernel est compatible avec Intel TDX, consultez la page Détails du kernel Linux.
    • SUSPEND_RESUME_COMPATIBLE. Activez la suspension et la réactivation d'une VM. Pour en savoir plus, consultez la section Compatibilité des systèmes d'exploitation.
  • LOCATION : région ou emplacement multirégional où stocker l'image (facultatif).

    Par exemple, spécifiez us pour stocker l'image dans l'emplacement multirégional us, ou us-central1 pour la stocker dans la région us-central1. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke l'image dans l'emplacement multirégional le plus proche de l'emplacement source de votre image.

REST

Utilisez la méthode images().insert avec l'option guestOsFeatures pour créer une image personnalisée à partir d'une image personnalisée existante.


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"
  }
 ]
}

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet dans lequel créer l'image.
  • IMAGE_NAME : nom de la nouvelle image.
  • IMAGE_PROJECT : projet contenant l'image source (facultatif).

    Utilisez ce paramètre pour copier une image d'un autre projet.

  • SOURCE_IMAGE : image sur laquelle sera basée la nouvelle image.

  • LOCATION : région ou emplacement multirégional où stocker l'image (facultatif).

    Par exemple, spécifiez us pour stocker l'image dans l'emplacement multirégional us, ou us-central1 pour la stocker dans la région us-central1. Si vous ne sélectionnez pas d'emplacement, Compute Engine stocke l'image dans l'emplacement multirégional le plus proche de l'emplacement source de votre image ;

  • FEATURES : tags du système d'exploitation invité pour activer les fonctionnalités des VM que vous créez à partir d'images.

    Pour ajouter plusieurs valeurs, séparez-les par des virgules. Définissez ce paramètre sur une ou plusieurs des valeurs suivantes :

    • VIRTIO_SCSI_MULTIQUEUE : utilisez sur les disques SSD locaux comme alternative à NVMe. Pour en savoir plus sur les images compatibles SCSI, consultez la section Choisir une interface.

      Pour les images Linux, vous pouvez activer la fonctionnalité SCSI à files d'attente multiples sur les disques SSD locaux pour les images dotées de la version 3.17 ou ultérieure du noyau. Pour les images Windows, vous pouvez activer la fonctionnalité SCSI à files d'attente multiples sur les disques SSD locaux pour les images dotées de la version 1.2 du pilote Windows Compute Engine.

    • WINDOWS. Ajoutez des tags aux images de démarrage personnalisées Windows Server en tant qu'images Windows.
    • MULTI_IP_SUBNET. Configurez des interfaces avec un masque de réseau autre que /32. Pour en savoir plus sur les interfaces réseau multiples et leur fonctionnement, consultez la section Présentation des interfaces réseau multiples et exemples.
    • UEFI_COMPATIBLE. Démarrez avec le micrologiciel UEFI et les fonctionnalités de VM protégée suivantes :
    • GVNIC. Compatibilité avec des bandes passantes réseau élevées ( de 50 Gbit/s à 100 Gbit/s). Pour en savoir plus, consultez la section Utiliser la carte d'interface réseau virtuelle Google.
    • IDPF. Prise en charge des interfaces réseau IDPF (Infrastructure Data Path Function) d'Intel.
    • SEV_CAPABLE ou SEV_SNP_CAPABLE. Utilisez ces balises si vous souhaitez utiliser votre image sur une instance de VM confidentielle avec la prise en charge de la fonctionnalité AMD SEV (Secure Encrypted Virtualization) ou AMD SEV-SNP (Secure Encrypted Virtualization-Secure Nested Paging). Pour vérifier si votre kernel est compatible avec AMD SEV ou AMD SEV-SNP, consultez la page Détails du kernel Linux.
    • SEV_LIVE_MIGRATABLE_V2. Utilisez cette balise si vous souhaitez utiliser votre image sur une instance de VM confidentielle compatible avec la migration à chaud sur AMD SEV. Pour vérifier si votre kernel est compatible avec la migration à chaud, consultez les détails du kernel Linux.
    • TDX_CAPABLE. Utilisez cette balise si vous souhaitez utiliser votre image sur une instance de VM confidentielle compatible avec les extensions de domaine de confiance (TDX) Intel. Pour vérifier si votre kernel est compatible avec Intel TDX, consultez la page Détails du kernel Linux.
    • SUSPEND_RESUME_COMPATIBLE. Activez la suspension et la réactivation d'une VM. Pour en savoir plus, consultez la section Compatibilité des systèmes d'exploitation.

Éviter d'inclure des informations sensibles dans les variables UEFI

Les variables UEFI (Unified Extensible Firmware Interface) sont des variables de paires clé-valeur utilisées par le micrologiciel UEFI au démarrage pour démarrer le système d'exploitation d'une VM. Contrairement aux machines physiques, où les variables sont stockées sur une puce matérielle, Compute Engine virtualise le stockage de ces variables. Par conséquent, dans de nombreux systèmes d'exploitation, toutes les applications et tous les utilisateurs peuvent accéder à ces variables et à ces informations.

C'est pourquoi Google vous recommande vivement de ne pas écrire ni stocker d'informations sensibles ou permettant d'identifier personnellement l'utilisateur, telles que des mots de passe ou des clés privées, dans des variables UEFI.

Éléments à prendre en compte pour les images Arm

Google propose les séries de machines C4A et Tau T2A, qui s'exécutent sur des plates-formes de processeur Arm. Vous pouvez démarrer une VM avec l'une de ces séries de machines, puis utiliser cette VM source pour créer une image Arm. Le processus de création d'une image Arm personnalisée est identique à la création d'une image x86.

Pour aider vos utilisateurs à différencier les images Arm des images x86, le champ architecture des images Arm est défini sur ARM64. Les valeurs possibles pour ce champ sont les suivantes :

  • ARCHITECTURE_UNSPECIFIED
  • X86_64
  • ARM64

Les utilisateurs d'images peuvent ensuite filtrer ce champ pour trouver des images x86 ou Arm.

Étape suivante