Benutzerdefinierte Images erstellen


Sie können benutzerdefinierte Images von Quelllaufwerken, Images, Snapshots oder von in Cloud Storage gespeicherten Images erstellen und diese Images verwenden, um VM-Instanzen zu erstellen. Benutzerdefinierte Images sind ideal, wenn Sie ein nichtflüchtiges Bootlaufwerk oder ein bestimmtes Image in einem bestimmten Zustand erstellt und geändert haben und diesen Zustand zum Erstellen von VMs speichern müssen.

Alternativ können Sie das Tool zum Importieren virtueller Laufwerke verwenden, um Images von Bootlaufwerken aus vorhandenen Systemen in Compute Engine zu importieren und der Liste Ihrer benutzerdefinierten Images hinzuzufügen.

Hinweise

  • Lesen Sie das Dokument zu Images.
  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud-Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich bei Compute Engine authentifizieren. Wählen Sie dazu eine der folgenden Optionen aus:

    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

      Wenn Sie die Go Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

      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.

      Weitere Informationen unter Set up authentication for a local development environment.

      Java

      Wenn Sie die Java Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

      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.

      Weitere Informationen unter Set up authentication for a local development environment.

      Node.js

      Wenn Sie die Node.js Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

      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.

      Weitere Informationen unter Set up authentication for a local development environment.

      Python

      Wenn Sie die Python Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

      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.

      Weitere Informationen unter Set up authentication for a local development environment.

      REST

      Verwenden Sie die von der gcloud CLI bereitgestellten Anmeldedaten, um die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung zu verwenden.

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

        gcloud init

      Weitere Informationen finden Sie unter Für die Verwendung von REST authentifizieren in der Dokumentation zur Google Cloud-Authentifizierung.

Benutzerdefiniertes Image erstellen

In diesem Abschnitt wird beschrieben, wie Sie ein benutzerdefiniertes Image auf einer Linux-VM erstellen. Weitere Informationen zum Erstellen eines Windows-Images finden Sie unter Windows-Image erstellen.

Image-Speicherort auswählen

Beim Erstellen eines benutzerdefinierten Images können Sie dessen Speicherort in Cloud Storage angeben, sofern es sich nicht um Standorte mit zwei Regionen handelt. Die Angabe des Image-Speicherorts ermöglicht es Ihnen, geltende Vorschriften und Compliance-Anforderungen hinsichtlich der Datenlokalität einzuhalten. Außerdem können Sie Ihre hohen Verfügbarkeitsanforderungen erfüllen, da Sie für regionsübergreifende Redundanz sorgen. Zum Erstellen, Ändern und Löschen von in Cloud Storage gespeicherten Images benötigen Sie roles/compute.storageAdmin.

Die Angabe des Speicherorts ist optional. Wenn Sie keinen Speicherort auswählen, speichert Compute Engine das Image in der Multiregion, die der Image-Quelle am nächsten liegt. Wenn Sie beispielsweise ein Image von einem Quelllaufwerk erstellen, das sich in us-central1 befindet, und Sie keinen Speicherort für das benutzerdefinierte Image angeben, speichert Compute Engine das Image in der Multi-Region us.

Wenn das Image in einer Region nicht verfügbar ist, in der Sie eine VM erstellen, speichert Compute Engine das Image in dieser Region beim ersten Erstellen einer VM im Cache.

Den Speicherort eines Images können Sie mit dem Befehl images describe von gcloud compute abrufen:

gcloud compute images describe IMAGE_NAME \
    --project=PROJECT_ID

Dabei gilt:

  • IMAGE_NAME ist der Name des Images.

  • PROJECT_ID ist das Projekt, zu dem das Image gehört.

Alle Images, die Sie vor der Einführung dieses Features erstellt haben, bleiben an ihrem bisherigen Speicherort. Der einzige Unterschied ist, dass Sie den Speicherort aller Images sehen können. Wenn Sie ein vorhandenes Image verschieben möchten, müssen Sie es am neuen Speicherort neu erstellen.

VM für ein Image vorbereiten

Sie können ein Image von einem Laufwerk erstellen, auch wenn es mit einer ausgeführten VM verknüpft ist. Das Image wird jedoch zuverlässiger, wenn Sie die VM in einen Zustand versetzen, den das Image leichter erfassen kann. In diesem Abschnitt wird beschrieben, wie Sie Ihr Bootlaufwerk für das Image vorbereiten.

Schreiben von Daten in den nichtflüchtigen Speicher minimieren

Verwenden Sie einen der folgenden Prozesse, um die Schreibvorgänge auf dem Laufwerk zu reduzieren:

  • Beenden Sie die VM, sodass sie herunterfahren und das Schreiben von Daten auf den nichtflüchtigen Speicher beenden kann.

  • Wenn Sie Ihre VM nicht beenden können, bevor Sie das Image erstellen, minimieren Sie die Anzahl der Schreibvorgänge auf das Laufwerk und synchronisieren Sie Ihr Dateisystem. So minimieren Sie das Schreiben in Ihren nichtflüchtigen Speicher:

    1. Pausieren Sie alle Anwendungen oder Prozesse des Betriebssystems, die Daten in den nichtflüchtigen Speicher schreiben.
    2. Leeren Sie die Anwendungsdaten auf das Laufwerk, falls erforderlich. MySQL bietet hierfür zum Beispiel die Anweisung FLUSH. Andere Anwendungen haben möglicherweise ähnliche Prozesse.
    3. Beenden Sie das Schreiben von Daten auf den nichtflüchtigen Speicher durch Anwendungen.
    4. Führen Sie sudo sync aus.

Option zum automatischen Löschen des Laufwerks deaktivieren

Standardmäßig ist die Option zum automatischen Löschen auf den Bootlaufwerken aktiviert. Deaktivieren Sie vor dem Erstellen eines Images von einem Laufwerk die automatische Löschfunktion, damit das Laufwerk nicht automatisch gelöscht wird, wenn Sie die VM löschen.

Verwenden Sie eine der folgenden Methoden, um das automatische Löschen für das Laufwerk zu deaktivieren.

Console

  1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zur Seite „VM-Instanzen"

  2. Klicken Sie auf den Namen der VM, die Sie als Quelle zum Erstellen eines Images verwenden.

    Die Seite VM-Instanzdetails wird angezeigt.

  3. Klicken Sie auf Bearbeiten.

  4. Achten Sie darauf, dass im Abschnitt Bootlaufwerk für die Löschregel die Option Laufwerk behalten ausgewählt ist.

  5. Klicken Sie auf Speichern.

gcloud

Verwenden Sie in der Google Cloud CLI den Befehl gcloud compute instances set-disk-auto-delete, um die Option zum automatischen Löschen des Laufwerks zu deaktivieren.

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

Dabei gilt:

  • VM_NAME ist der Name Ihrer VM-Instanz.
  • SOURCE_DISK ist der Name des Laufwerks, von dem Sie das Image erstellen möchten.

Go

Go

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Go in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Go API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Java in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Java API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.


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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Node.js in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Node.js API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Python API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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

Senden Sie eine POST-Anfrage an die Methode instances.setDiskAutoDelete, um die Option zum automatischen Löschen eines Laufwerks festzulegen.

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

Dabei gilt:

  • PROJECT_ID: die Projekt-ID, zu der die Quell-VM gehört.
  • ZONE: die Zone, in der sich die Quell-VM befindet
  • VM_NAME: der Name der Quell-VM.
  • SOURCE_DISK: Gerätename des Laufwerks, von dem Sie das Image erstellen möchten.

Nachdem die VM vorbereitet wurde, können Sie das Image erstellen.

Image erstellen

Sie können folgende Quellen verwenden, um Laufwerk-Images zu erstellen:

  • einen nichtflüchtigen Speicher, auch wenn dieser mit einer VM verbunden ist
  • einen Snapshot eines nichtflüchtigen Speichers
  • ein anderes Image in Ihrem Projekt
  • ein Image, das von einem anderen Projekt freigegeben wird
  • Ein komprimiertes RAW-Image in Cloud Storage

Sie können alle 10 Minuten ein Laufwerk-Image erstellen. Wenn Sie mehrere Anfragen zum Erstellen eines Laufwerk-Images senden möchten, können Sie maximal 6 Anfragen innerhalb von 60 Minuten senden. Weitere Informationen finden Sie unter Limits für die Snapshot-Häufigkeit.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Image erstellen auf.

    Zur Seite „Image erstellen“

  2. Geben Sie im Feld Name den Image-Namen an.

  3. Geben Sie die Quelle an, auf deren Grundlage Sie ein Image erstellen möchten. Dies kann ein nichtflüchtiger Speicher, ein Snapshot, ein anderes Image oder eine disk.raw-Datei in Cloud Storage sein.

  4. Wenn Sie ein Image von einem Laufwerk erstellen, das mit einer ausgeführten VM verbunden ist, aktivieren Sie Instanz weiter ausführen, um zu bestätigen, dass Sie das Image erstellen möchten, während die VM ausgeführt wird. Sie können die VM vorbereiten, bevor Sie das Image erstellen.

  5. Geben Sie in der Drop-down-Liste Basierend auf dem Standort des Quelllaufwerks (Standard) den Speicherort für das Image an. Geben Sie beispielsweise us an, um das Image in der Multiregion us zu speichern, oder us-central1, um es in der Region us-central1 zu speichern. Wenn Sie keine Auswahl treffen, speichert Compute Engine das Image in der Multiregion, die dem Speicherort Ihrer Image-Quelle am nächsten ist.

  6. Optional: Legen Sie die gewünschten Attribute des Images fest.

    • Familie: die Image-Familie, zu der das neue Image gehört.
    • Beschreibung: Eine Beschreibung für Ihr benutzerdefiniertes Image.
    • Label: ein Label, um Ressourcen zu gruppieren.
  7. Geben Sie den Verschlüsselungsschlüssel an. Sie können zwischen einem Google-eigenen und einem von Google verwalteten Schlüssel, einem Cloud Key Management Service (Cloud KMS)-Schlüssel oder einem vom Kunden bereitgestellten Verschlüsselungsschlüssel (CSEK) wählen. Wenn kein Verschlüsselungsschlüssel angegeben ist, werden die Images mit einem von Google verwalteten Schlüssel verschlüsselt.

  8. Klicken Sie auf Erstellen, um das Image zu erstellen.

gcloud

Verwenden Sie in der Google Cloud CLI den Befehl gcloud compute images create, um ein benutzerdefiniertes Image zu erstellen.

Image von einem Quelllaufwerk erstellen:

Das Flag --force ist ein optionales Flag, mit dem Sie das Image von einer laufenden Instanz erstellen können. Standardmäßig können Sie keine Images von ausgeführten Instanzen erstellen. Geben Sie dieses Flag nur an, wenn Sie sicher sind, dass Sie das Image erstellen möchten, während die Instanz ausgeführt wird.

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

Dabei gilt:

  • IMAGE_NAME ist ein Name für das neue Image
  • SOURCE_DISK ist das Laufwerk, von dem Sie das Image erstellen möchten
  • ZONE ist die Zone, in der sich das Laufwerk befindet
  • IMAGE_FAMILY (Optional): Ein Flag, das angibt, zu welcher Image-Familie dieses Image gehört
  • LOCATION (Optional): Ein Flag, mit dem Sie die Region oder Multiregion festlegen können, in der Ihr Image gespeichert wird. Geben Sie beispielsweise us an, um das Image in der Multiregion us zu speichern, oder us-central1, um es in der Region us-central1 zu speichern. Wenn Sie keine Auswahl treffen, speichert Compute Engine das Image in der Multiregion, die dem Speicherort Ihrer Image-Quelle am nächsten ist.

Image von einem Quell-Image erstellen:

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

Dabei gilt:

  • IMAGE_NAME ist ein Name für das neue Image.
  • SOURCE_IMAGE ist das Image, von dem Sie das neue Image erstellen möchten.
  • IMAGE_PROJECT (Optional): das Projekt, in dem sich das Quell-Image befindet. Verwenden Sie diesen Parameter, wenn Sie ein Image aus einem anderen Projekt kopieren möchten.
  • IMAGE_FAMILY (Optional): Die Image-Familie, zu der das neue Image gehört.
  • LOCATION (Optional): Hiermit können Sie die Region oder Multiregion festlegen, in der Ihr Image gespeichert wird. Geben Sie beispielsweise us an, um das Image in der Multiregion us zu speichern, oder us-central1, um es in der Region us-central1 zu speichern. Wenn Sie keine Auswahl treffen, speichert Compute Engine das Image in der Multiregion, die dem Speicherort Ihrer Image-Quelle am nächsten ist.

Image von einem Snapshot erstellen:

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

Dabei gilt:

  • IMAGE_NAME ist ein Name für das neue Image
  • SOURCE_SNAPSHOT ist der Snapshot, von dem Sie das Image erstellen möchten.
  • LOCATION (Optional): Ein Flag, mit dem Sie die Region oder Multiregion festlegen können, in der Ihr Image gespeichert wird. Geben Sie beispielsweise us an, um das Image in der Multiregion us zu speichern, oder us-central1, um es in der Region us-central1 zu speichern. Wenn Sie keine Auswahl treffen, speichert Compute Engine das Image in der Multiregion, die dem Speicherort Ihrer Image-Quelle am nächsten ist.

Image-Speicherort ansehen:

Mit dem Befehl gcloud compute images describe rufen Sie den Speicherort eines Images ab.

gcloud compute images describe IMAGE_NAME

Ersetzen Sie IMAGE_NAME durch den Namen des Images, das Sie sich ansehen möchten.

Go

Go

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Go in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Go API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Java in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Java API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.


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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Python API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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

Stellen Sie eine POST-Anfrage an die Methode images().insert. Fügen Sie in den Anfragetext eine URL ein, die auf das Quellobjekt verweist, aus dem Sie das Image erstellen möchten. Geben Sie URLs zu Ihren Ressourcen an und verwenden Sie dazu Ihre eigene Projekt-ID und Ihre Ressourcennamen.

Image von einem nichtflüchtigen Speicher erstellen:

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

Dabei gilt:

  • PROJECT_ID ist das Projekt, zu dem das Image gehört.
  • IMAGE_NAME ist ein Name für das neue Image, das Sie erstellen möchten.
  • ZONE ist die Zone, in der sich das Quelllaufwerk befindet.
  • SOURCE_DISK ist das Laufwerk, von dem Sie das Image erstellen möchten.
  • LOCATION (Optional): Der Speicherort Ihres Images. Geben Sie beispielsweise us an, um das Image in der Multiregionus zu speichern, oder us-central1, um es in der Region us-central1 zu speichern. Wenn Sie keine Auswahl treffen, speichert Compute Engine das Image in der Multiregion, die dem Speicherort Ihrer Image-Quelle am nächsten ist.

Mit dem optionalen Parameter forceCreate können Sie das Image von einer laufenden VM erstellen. Geben Sie den Wert TRUE nur an, wenn Sie sicher sind, dass Sie das Image von einer ausgeführten VM erstellen möchten. Die Standardeinstellung von forceCreate ist FALSE.

Ein Image von einem anderen Image erstellen:

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

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

Dabei gilt:

  • PROJECT_ID ist das Projekt, zu dem das Image gehört.
  • IMAGE_NAME ist ein Name für das neue Image, das Sie erstellen möchten.
  • SOURCE_IMAGE ist das Image, von dem Sie das Image erstellen möchten.
  • LOCATION (Optional): Der Speicherort Ihres Images. Geben Sie beispielsweise us an, um das Image in der Multiregion us zu speichern, oder us-central1, um es in der Region us-central1 zu speichern. Wenn Sie keine Auswahl treffen, wird das Image von Compute Engine an dem multiregionalen Standort gespeichert, der dem Quellspeicherort des Images am nächsten liegt.

Image von einem Snapshot erstellen:

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

Dabei gilt:

  • PROJECT_ID ist das Projekt, zu dem das Image gehört.
  • IMAGE_NAME ist ein Name für das neue Image, das Sie erstellen möchten.
  • SOURCE_PROJECT_ID (Optional): Das Projekt, in dem sich der Snapshot befindet. Sie benötigen die Zugriffsberechtigung für die Snapshot-Ressource in diesem Projekt.
  • SOURCE_SNAPSHOT ist der Snapshot, von dem Sie das Image erstellen möchten.
  • LOCATION (Optional): Der Speicherort Ihres Images. Geben Sie beispielsweise us an, um das Image in der Multiregionus zu speichern, oder us-central1, um es in der Region us-central1 zu speichern. Wenn Sie keine Auswahl treffen, speichert Compute Engine das Image in der Multiregion, die dem Speicherort Ihrer Image-Quelle am nächsten ist.

Weitere Informationen zum Hinzufügen von Images finden Sie in der Image-Referenz.

Image freigeben

Nachdem Sie ein benutzerdefiniertes Image erstellt haben, können Sie es projektübergreifend freigeben. Wenn Sie Nutzern aus einem anderen Projekt die Verwendung Ihrer benutzerdefinierten Images erlauben, können sie auf diese Images zugreifen, indem sie in ihrer Anfrage das Image-Projekt angeben.

Gastbetriebssystem-Funktionen aktivieren

Verwenden Sie Gastbetriebssystem-Funktionen (OS), um die folgenden Netzwerk-, Sicherheits-, Speicher- und Betriebssystemoptionen für benutzerdefinierte Images zu konfigurieren. Benutzerdefinierte Images mit diesen konfigurierten Features werden als Bootlaufwerke verwendet.

gcloud

Verwenden Sie den Befehl gcloud compute images create mit dem Flag --guest-os-features, um ein neues benutzerdefiniertes Image aus einem vorhandenen benutzerdefinierten Image zu erstellen.

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

Dabei gilt:

  • IMAGE_NAME: der Name für das neue Image
  • SOURCE_IMAGE: ein Image, auf dem das neue Image basieren soll
  • IMAGE_PROJECT (optional): das Projekt, das das Quell-Image enthält

    Verwenden Sie diesen Parameter, um ein Image aus einem anderen Projekt zu kopieren.

  • FEATURES: Gastbetriebssystem-Tags zum Aktivieren von Features für VMs, die Sie aus Images erstellen

    Wenn Sie mehrere Werte hinzufügen möchten, trennen Sie die Werte durch Kommas. Legen Sie einen oder mehrere der folgenden Werte fest:

    • VIRTIO_SCSI_MULTIQUEUE. Verwendung auf lokalen SSD-Geräten als Alternative zu NVMe. Weitere Informationen zu Images, die SCSI unterstützen, finden Sie unter Schnittstelle auswählen.

      Sie können für Linux-Images Multi-Queue-SCSI auf lokalen SSD-Geräten bei Images mit Kernel-Versionen ab 3.17 aktivieren. Sie können für Windows-Images Multi-Queue-SCSI auf lokalen SSD-Geräten bei Images mit Compute Engine-Windows-Treibern der Version 1.2 aktivieren.

    • WINDOWS Benutzerdefinierte Windows Server-Boot-Images als Windows-Images taggen.
    • MULTI_IP_SUBNET Schnittstellen mit einer anderen Netzmaske als /32 konfigurieren. Weitere Informationen zu mehreren Netzwerkschnittstellen und ihrer Funktionsweise finden Sie unter Übersicht über mehrere Netzwerkschnittstellen und Beispiele.
    • UEFI_COMPATIBLE Booten mit UEFI-Firmware und den folgenden Shielded VM-Features:
    • GVNIC Höhere Netzwerkbandbreiten von bis zu 50 Gbit/s bis 100 Gbit/s unterstützen. Weitere Informationen finden Sie unter Google Virtual NIC verwenden.
    • IDPF Unterstützung für IDPF-Netzwerkschnittstellen (Intel Infrastructure Data Path Function)
    • SEV_CAPABLE oder SEV_SNP_CAPABLE. Verwenden Sie diese Tags, wenn Sie Ihr Image auf einer Confidential VM-Instanz mit AMD Secure Encrypted Virtualization (SEV) oder AMD Secure Encrypted Virtualization-Secure Nested Paging (SEV-SNP) verwenden möchten. Informationen dazu, ob Ihr Kernel AMD SEV oder AMD SEV-SNP unterstützt, finden Sie unter Linux-Kernel – Details.
    • SEV_LIVE_MIGRATABLE_V2 Verwenden Sie dieses Tag, wenn Sie Ihr Image auf einer Confidential VM-Instanz verwenden möchten, die die Live-Migration auf AMD SEV unterstützt. Informationen dazu, ob Ihr Kernel die Live-Migration unterstützt, finden Sie unter Linux-Kernel – Details.
    • TDX_CAPABLE Verwenden Sie dieses Tag, wenn Sie Ihr Image auf einer Confidential VM-Instanz mit Unterstützung für Intel Trust Domain Extensions (TDX) verwenden möchten. Ob Ihr Kernel Intel TDX unterstützt, erfahren Sie unter Linux-Kernel – Details.
    • SUSPEND_RESUME_COMPATIBLE Anhalten und Fortsetzen auf einer VM unterstützen. Weitere Informationen finden Sie unter Betriebssystemkompatibilität.
  • LOCATION (optional): Region oder Multiregion, in der das Image gespeichert werden soll

    Geben Sie beispielsweise us an, um das Image in der Multiregion us zu speichern, oder us-central1, um es in der Region us-central1 zu speichern. Wenn Sie keine Auswahl treffen, speichert Compute Engine das Image in der Multiregion, die dem Speicherort Ihrer Image-Quelle am nächsten ist.

REST

Verwenden Sie die Methode images().insert mit dem Flag guestOsFeatures, um ein neues benutzerdefiniertes Image aus einem vorhandenen benutzerdefinierten Image zu erstellen.


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

Dabei gilt:

  • PROJECT_ID: ID des Projekts, in dem das neue Image erstellt werden soll
  • IMAGE_NAME ist ein Name für das neue Image
  • IMAGE_PROJECT (optional): das Projekt, das das Quell-Image enthält

    Verwenden Sie diesen Parameter, um ein Image aus einem anderen Projekt zu kopieren.

  • SOURCE_IMAGE: Image, auf dem das neue Image basieren soll.

  • LOCATION (optional): Region oder Multiregion, in der das Image gespeichert werden soll

    Geben Sie beispielsweise us an, um das Image in der Multiregion us zu speichern, oder us-central1, um es in der Region us-central1 zu speichern. Wenn Sie keine Auswahl treffen, speichert Compute Engine das Image in der Multiregion, die dem Speicherort Ihrer Image-Quelle am nächsten ist.

  • FEATURES: Gastbetriebssystem-Tags zum Aktivieren von Features für VMs, die Sie aus Images erstellen

    Wenn Sie mehrere Werte hinzufügen möchten, trennen Sie die Werte durch Kommas. Legen Sie einen oder mehrere der folgenden Werte fest:

    • VIRTIO_SCSI_MULTIQUEUE. Verwendung auf lokalen SSD-Geräten als Alternative zu NVMe. Weitere Informationen zu Images, die SCSI unterstützen, finden Sie unter Schnittstelle auswählen.

      Sie können für Linux-Images Multi-Queue-SCSI auf lokalen SSD-Geräten bei Images mit Kernel-Versionen ab 3.17 aktivieren. Sie können für Windows-Images Multi-Queue-SCSI auf lokalen SSD-Geräten bei Images mit Compute Engine-Windows-Treibern der Version 1.2 aktivieren.

    • WINDOWS Benutzerdefinierte Windows Server-Boot-Images als Windows-Images taggen.
    • MULTI_IP_SUBNET Schnittstellen mit einer anderen Netzmaske als /32 konfigurieren. Weitere Informationen zu mehreren Netzwerkschnittstellen und ihrer Funktionsweise finden Sie unter Übersicht über mehrere Netzwerkschnittstellen und Beispiele.
    • UEFI_COMPATIBLE Booten mit UEFI-Firmware und den folgenden Shielded VM-Features:
    • GVNIC Höhere Netzwerkbandbreiten von bis zu 50 Gbit/s bis 100 Gbit/s unterstützen. Weitere Informationen finden Sie unter Google Virtual NIC verwenden.
    • IDPF Unterstützung für IDPF-Netzwerkschnittstellen (Intel Infrastructure Data Path Function)
    • SEV_CAPABLE oder SEV_SNP_CAPABLE. Verwenden Sie diese Tags, wenn Sie Ihr Image auf einer Confidential VM-Instanz mit AMD Secure Encrypted Virtualization (SEV) oder AMD Secure Encrypted Virtualization-Secure Nested Paging (SEV-SNP) verwenden möchten. Ob Ihr Kernel AMD SEV oder AMD SEV-SNP unterstützt, erfahren Sie unter Linux-Kernel – Details.
    • SEV_LIVE_MIGRATABLE_V2 Verwenden Sie dieses Tag, wenn Sie Ihr Image auf einer Confidential VM-Instanz verwenden möchten, die die Live-Migration auf AMD SEV unterstützt. Informationen dazu, ob Ihr Kernel die Live-Migration unterstützt, finden Sie unter Linux-Kernel – Details.
    • TDX_CAPABLE Verwenden Sie dieses Tag, wenn Sie Ihr Image auf einer Confidential VM-Instanz mit Unterstützung für Intel Trust Domain Extensions (TDX) verwenden möchten. Ob Ihr Kernel Intel TDX unterstützt, erfahren Sie unter Linux-Kernel – Details.
    • SUSPEND_RESUME_COMPATIBLE Anhalten und Fortsetzen auf einer VM unterstützen. Weitere Informationen finden Sie unter Betriebssystemkompatibilität.

Vertrauliche Informationen in UEFI-Variablen vermeiden

UEFI-Variablen (Unified Extensible Firmware Interface) sind Schlüssel/Wert-Paare, die von der UEFI-Firmware während des Bootens zum Starten des Betriebssystems einer VM verwendet werden. Im Gegensatz zu physischen Maschinen, auf denen die Variablen auf einem Hardwarechip gespeichert werden, virtualisiert die Compute Engine den Speicher dieser Variablen. Daher können in vielen Betriebssystemen alle Anwendungen und Nutzer auf diese Variablen zugreifen und auf diese Informationen zugreifen.

Aus diesem Grund empfiehlt Google dringend, keine vertraulichen oder personenidentifizierbaren Informationen wie Passwörter oder private Schlüssel in UEFI-Variablen zu schreiben oder zu speichern.

Überlegungen zu Arm-Images

Google bietet die Maschinenreihen C4A und Tau T2A an, die auf Arm-CPU-Plattformen ausgeführt werden. Sie können eine VM mit einer dieser Maschinenreihen starten und dann diese Quell-VM verwenden, um ein Arm-Image zu erstellen. Der Vorgang zum Erstellen eines benutzerdefinierten Arm-Images ist identisch mit dem Erstellen eines x86-Images.

Damit Ihre Nutzer zwischen Arm- und x86-Images unterscheiden können, ist für Arm-Images das Feld architecture auf ARM64 festgelegt. Folgende Werte sind für dieses Feld möglich:

  • ARCHITECTURE_UNSPECIFIED
  • X86_64
  • ARM64

Image-Nutzer können dann nach diesem Feld filtern, um x86- oder ARM-basierte Images zu finden.

Nächste Schritte