Membuat image kustom


Anda dapat membuat image kustom dari disk sumber, image, snapshot, atau image yang disimpan di Cloud Storage dan menggunakan image ini untuk membuat instance virtual machine (VM). Image kustom ideal untuk situasi saat Anda telah membuat dan mengubah persistent disk boot atau image tertentu ke status tertentu dan perlu menyimpan status tersebut untuk membuat VM.

Atau, Anda dapat menggunakan alat impor disk virtual untuk mengimpor image disk booting ke Compute Engine dari sistem yang ada dan menambahkannya ke daftar image kustom.

Sebelum memulai

  • Baca dokumen Gambar.
  • Jika Anda belum melakukannya, siapkan autentikasi. Autentikasi adalah proses verifikasi identitas Anda untuk mengakses layanan dan API Google Cloud. Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat mengautentikasi ke Compute Engine dengan memilih salah satu opsi berikut:

    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

      Untuk menggunakan contoh Go di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      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.

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      Java

      Untuk menggunakan contoh Java di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      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.

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      Node.js

      Untuk menggunakan contoh Node.js di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      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.

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      Python

      Untuk menggunakan contoh Python di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      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.

      Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

      REST

      Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.

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

        gcloud init

      Untuk informasi selengkapnya, lihat Melakukan autentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud.

Membuat image kustom

Bagian ini menjelaskan cara membuat image kustom di VM Linux. Untuk mengetahui informasi tentang cara membuat image Windows, lihat Membuat image Windows.

Memilih lokasi penyimpanan gambar

Saat membuat image kustom, Anda dapat menentukan lokasi Cloud Storage image, tidak termasuk lokasi dual-region. Dengan menentukan lokasi penyimpanan image, Anda dapat memenuhi persyaratan peraturan dan kepatuhan untuk lokalitas data serta kebutuhan ketersediaan tinggi dengan memastikan redundansi di seluruh region. Untuk membuat, mengubah, dan menghapus gambar yang disimpan di Cloud Storage, Anda harus memiliki roles/compute.storageAdmin.

Fitur lokasi penyimpanan bersifat opsional. Jika Anda tidak memilih lokasi, Compute Engine akan menyimpan image Anda di multi-region yang paling dekat dengan sumber image. Misalnya, saat Anda membuat image dari disk sumber yang terletak di us-central1 dan jika Anda tidak menentukan lokasi untuk image kustom, Compute Engine akan menyimpan image di multi-region us.

Jika image tidak tersedia di region tempat Anda membuat VM, Compute Engine akan meng-cache image di region tersebut saat pertama kali Anda membuat VM.

Untuk melihat lokasi penyimpanan image, gunakan perintah images describe dari gcloud compute:

gcloud compute images describe IMAGE_NAME \
    --project=PROJECT_ID

Ganti kode berikut:

  • IMAGE_NAME: nama image Anda.

  • PROJECT_ID: project ID tempat image berada.

Semua image yang ada sebelum peluncuran fitur ini akan tetap ada di tempatnya, satu-satunya perubahan adalah Anda dapat melihat lokasi image dari semua image Anda. Jika Anda memiliki image yang ingin dipindahkan, Anda harus membuatnya ulang di lokasi baru.

Menyiapkan VM untuk image

Anda dapat membuat image dari disk meskipun disk terpasang ke VM yang sedang berjalan. Namun, image Anda akan lebih andal jika Anda menempatkan VM dalam status yang lebih mudah diambil oleh image. Bagian ini menjelaskan cara menyiapkan disk booting untuk image.

Meminimalkan penulisan data ke persistent disk

Gunakan salah satu proses berikut untuk mengurangi penulisan disk:

  • Hentikan VM agar dapat dimatikan dan berhenti menulis data apa pun ke persistent disk.

  • Jika Anda tidak dapat menghentikan VM sebelum membuat image, minimalkan jumlah operasi tulis ke disk dan sinkronkan sistem file Anda. Untuk meminimalkan penulisan ke disk persisten, ikuti langkah-langkah berikut:

    1. Jeda aplikasi atau proses sistem operasi yang menulis data ke persistent disk tersebut.
    2. Jalankan aplikasi ke disk jika perlu. Misalnya, MySQL memiliki pernyataan FLUSH. Aplikasi lain mungkin memiliki proses serupa.
    3. Hentikan aplikasi Anda agar tidak menulis ke persistent disk.
    4. Jalankan sudo sync.

Menonaktifkan opsi hapus otomatis untuk disk

Secara default, opsi hapus otomatis diaktifkan di disk booting. Sebelum membuat image dari disk, nonaktifkan hapus otomatis untuk memastikan bahwa disk tidak otomatis dihapus saat Anda menghapus VM.

Gunakan salah satu metode berikut untuk menonaktifkan penghapusan otomatis untuk disk.

Konsol

  1. Di Konsol Google Cloud, buka halaman VM instances.

    Buka halaman Instance VM

  2. Klik nama VM yang Anda gunakan sebagai sumber untuk membuat image.

    Halaman VM instance details akan ditampilkan.

  3. Klik Edit.

  4. Di bagian Boot disk, untuk Deletion rule, pastikan opsi Keep disk dipilih.

  5. Klik Simpan.

gcloud

Di Google Cloud CLI, gunakan perintah gcloud compute instances set-disk-auto-delete untuk menonaktifkan opsi penghapusan otomatis untuk disk.

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

Ganti kode berikut:

  • VM_NAME: nama instance VM Anda.
  • SOURCE_DISK: nama disk tempat Anda ingin membuat image.

Go

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Go Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Java Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Node.js Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Python Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Untuk menetapkan opsi hapus otomatis disk, buat permintaan POST ke metode instances.setDiskAutoDelete.

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

Ganti kode berikut:

  • PROJECT_ID: project ID tempat VM sumber berada.
  • ZONE: zona tempat VM sumber berada.
  • VM_NAME: nama VM sumber.
  • SOURCE_DISK: nama perangkat disk tempat Anda ingin membuat image.

Setelah menyiapkan VM, buat image.

Membuat gambar

Anda dapat membuat disk image dari sumber berikut:

  • Persistent disk, meskipun disk tersebut terpasang ke VM
  • Snapshot persistent disk
  • Image lain dalam project Anda
  • Image yang dibagikan dari project lain
  • Gambar RAW yang dikompresi di Cloud Storage

Anda dapat membuat image disk sekali setiap 10 menit. Jika ingin mengirimkan burst permintaan untuk membuat image disk, Anda dapat mengirimkan maksimal 6 permintaan dalam 60 menit. Untuk mengetahui informasi selengkapnya, lihat Batas frekuensi snapshot.

Konsol

  1. Di konsol Google Cloud, buka halaman Create an image.

    Buka Buat image

  2. Tentukan Nama image Anda.

  3. Tentukan Source tempat Anda ingin membuat image. Ini dapat berupa persistent disk, snapshot, image lain, atau file disk.raw di Cloud Storage.

  4. Jika Anda membuat image dari disk yang terpasang ke VM yang sedang berjalan, centang Keep instance running untuk mengonfirmasi bahwa Anda ingin membuat image saat VM sedang berjalan. Anda dapat menyiapkan VM sebelum membuat image.

  5. Di menu drop-down Berdasarkan lokasi disk sumber (default), tentukan lokasi untuk menyimpan image. Misalnya, tentukan us untuk menyimpan image di multi-region us, atau us-central1 untuk menyimpannya di region us-central1. Jika Anda tidak menentukan pilihan, Compute Engine akan menyimpan image di multi-region yang paling dekat dengan lokasi sumber image Anda.

  6. Opsional: tentukan properti untuk image Anda.

    • Keluarga: kelompok image yang mencakup image baru ini.
    • Deskripsi: deskripsi untuk gambar kustom Anda.
    • Label: label untuk mengelompokkan resource.
  7. Tentukan kunci enkripsi. Anda dapat memilih antara kunci milik dan dikelola Google, kunci Cloud Key Management Service (Cloud KMS), atau kunci enkripsi yang disediakan pelanggan (CSEK). Jika kunci enkripsi tidak ditentukan, gambar akan dienkripsi menggunakan kunci milik dan dikelola Google.

  8. Klik Create untuk membuat image.

gcloud

Di Google Cloud CLI, gunakan perintah gcloud compute images create untuk membuat image kustom.

Membuat image dari disk sumber:

Flag --force adalah flag opsional yang memungkinkan Anda membuat image dari instance yang sedang berjalan. Secara default, Anda tidak dapat membuat image dari instance yang sedang berjalan. Tentukan flag ini hanya jika Anda yakin ingin membuat image saat instance berjalan.

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

Ganti kode berikut:

  • IMAGE_NAME: nama untuk image baru
  • SOURCE_DISK: disk tempat Anda ingin membuat image
  • ZONE: zona tempat disk berada
  • IMAGE_FAMILY: Opsional: tanda yang menentukan kelompok image yang mencakup image ini
  • LOCATION: Opsional: tanda yang memungkinkan Anda menentukan region atau multi-region tempat image Anda disimpan. Misalnya, tentukan us untuk menyimpan image di multi-region us, atau us-central1 untuk menyimpannya di region us-central1. Jika Anda tidak menentukan pilihan, Compute Engine akan menyimpan image dalam multi-region yang paling dekat dengan lokasi sumber image Anda.

Membuat gambar dari gambar sumber:

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

Ganti kode berikut:

  • IMAGE_NAME: nama untuk image baru.
  • SOURCE_IMAGE: image yang akan digunakan untuk membuat image baru.
  • IMAGE_PROJECT: Opsional: project tempat image sumber berada. Gunakan parameter ini jika Anda ingin menyalin gambar dari project lain.
  • IMAGE_FAMILY: Opsional: image family yang mencakup image baru ini.
  • LOCATION: Opsional: memungkinkan Anda menentukan region atau multi-region tempat image Anda disimpan. Misalnya, tentukan us untuk menyimpan image di multi-region us, atau us-central1 untuk menyimpannya di region us-central1. Jika Anda tidak menentukan pilihan, Compute Engine akan menyimpan image di multi-region yang paling dekat dengan lokasi sumber image Anda.

Membuat image dari snapshot:

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

Ganti kode berikut:

  • IMAGE_NAME: nama untuk image baru
  • SOURCE_SNAPSHOT: snapshot tempat Anda ingin membuat image
  • LOCATION: Opsional: tanda yang memungkinkan Anda menentukan region atau multi-region tempat image Anda disimpan. Misalnya, tentukan us untuk menyimpan image di multi-region us, atau us-central1 untuk menyimpannya di region us-central1. Jika Anda tidak menentukan pilihan, Compute Engine akan menyimpan image dalam multi-region yang paling dekat dengan lokasi sumber image Anda.

Melihat lokasi gambar:

Gunakan perintah gcloud compute images describe untuk melihat lokasi gambar.

gcloud compute images describe IMAGE_NAME

Ganti IMAGE_NAME dengan nama image yang ingin Anda tinjau.

Go

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Go Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Java Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Python Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Buat permintaan POST ke metode images().insert, URL dalam isi permintaan yang mengarah ke objek sumber tempat Anda ingin membuat gambar. Tentukan URL ke resource menggunakan project ID dan nama resource Anda sendiri.

Buat image dari persistent disk:

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

Ganti kode berikut:

  • PROJECT_ID: project ID tempat image berada.
  • IMAGE_NAME: nama untuk image baru yang ingin Anda buat.
  • ZONE: zona tempat disk sumber berada.
  • SOURCE_DISK: disk tempat Anda ingin membuat image.
  • LOCATION: Opsional: lokasi penyimpanan gambar Anda. Misalnya, tentukan us untuk menyimpan image di multi-region us, atau us-central1 untuk menyimpannya di region us-central1. Jika Anda tidak menentukan pilihan, Compute Engine akan menyimpan image di multi-region yang paling dekat dengan lokasi sumber image Anda.

Parameter forceCreate opsional memungkinkan Anda membuat image dari VM yang sedang berjalan. Tentukan TRUE hanya jika Anda yakin ingin membuat image dari VM yang sedang berjalan. Setelan default forceCreate adalah FALSE.

Membuat gambar dari gambar lain:

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

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

Ganti kode berikut:

  • PROJECT_ID: project tempat image berada.
  • IMAGE_NAME: nama untuk image baru yang ingin Anda buat.
  • SOURCE_IMAGE: image tempat Anda ingin membuat image.
  • LOCATION: Opsional: lokasi penyimpanan gambar Anda. Misalnya, tentukan us untuk menyimpan image di multi-region us, atau us-central1 untuk menyimpannya di region us-central1. Jika Anda tidak menentukan pilihan, Compute Engine akan menyimpan image di multi-region yang paling dekat dengan lokasi sumber image Anda.

Membuat image dari snapshot:

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

Ganti kode berikut:

  • PROJECT_ID: project tempat image berada.
  • IMAGE_NAME: nama untuk image baru yang ingin Anda buat.
  • SOURCE_PROJECT_ID: Opsional: project tempat snapshot berada. Anda harus memiliki izin untuk mengakses resource snapshot dalam project tersebut.
  • SOURCE_SNAPSHOT: snapshot tempat Anda ingin membuat image.
  • LOCATION: Opsional: lokasi penyimpanan gambar Anda. Misalnya, tentukan us untuk menyimpan image di multi-region us, atau us-central1 untuk menyimpannya di region us-central1. Jika Anda tidak menentukan pilihan, Compute Engine akan menyimpan image di multi-region yang paling dekat dengan lokasi sumber image Anda.

Untuk mengetahui informasi selengkapnya tentang menambahkan image, lihat referensi image.

Membagikan gambar

Setelah membuat gambar kustom, Anda dapat membagikannya di seluruh project. Jika Anda mengizinkan pengguna dari project lain untuk menggunakan image kustom, mereka dapat mengakses image ini dengan menentukan project image dalam permintaan mereka.

Mengaktifkan fitur sistem operasi tamu

Gunakan fitur sistem operasi (OS) tamu untuk mengonfigurasi opsi jaringan, keamanan, penyimpanan, dan OS berikut pada image kustom. Image kustom dengan fitur yang dikonfigurasi ini digunakan sebagai boot disk.

gcloud

Gunakan perintah gcloud compute images create dengan flag --guest-os-features untuk membuat image kustom baru dari image kustom yang ada.

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

Ganti kode berikut:

  • IMAGE_NAME: nama untuk image baru
  • SOURCE_IMAGE: image yang akan menjadi dasar image baru
  • IMAGE_PROJECT: Opsional: project yang berisi image sumber

    Gunakan parameter ini untuk menyalin image dari project lain.

  • FEATURES: tag OS tamu untuk mengaktifkan fitur bagi VM yang Anda buat dari image

    Untuk menambahkan beberapa nilai, gunakan koma untuk memisahkan nilai. Tetapkan ke satu atau beberapa nilai berikut:

    • VIRTIO_SCSI_MULTIQUEUE. Digunakan pada perangkat SSD lokal sebagai alternatif untuk NVMe. Untuk informasi selengkapnya tentang image yang mendukung SCSI, lihat Memilih antarmuka.

      Untuk image Linux, Anda dapat mengaktifkan SCSI multi-antrean di perangkat SSD lokal pada image dengan kernel versi 3.17 atau yang lebih baru. Untuk image Windows, Anda dapat mengaktifkan SCSI multi-antrean di perangkat SSD lokal pada image dengan driver Windows Compute Engine versi 1.2.

    • WINDOWS. Beri tag pada image booting kustom Windows Server sebagai image Windows.
    • MULTI_IP_SUBNET. Konfigurasi antarmuka dengan netmask selain /32. Untuk mengetahui informasi selengkapnya tentang beberapa antarmuka jaringan dan cara kerjanya, lihat Ringkasan dan contoh beberapa antarmuka jaringan.
    • UEFI_COMPATIBLE. Boot dengan firmware UEFI dan fitur Shielded VM berikut:
    • GVNIC. Mendukung bandwidth jaringan yang lebih tinggi hingga kecepatan 50 Gbps hingga 100 Gbps. Untuk informasi selengkapnya, lihat Menggunakan NIC Virtual Google.
    • IDPF. Mendukung antarmuka jaringan Fungsi Jalur Data Infrastruktur Intel (IDPF).
    • SEV_CAPABLE atau SEV_SNP_CAPABLE. Gunakan tag ini jika Anda ingin menggunakan image di instance Confidential VM dengan dukungan AMD Secure Encrypted Virtualization (SEV) atau AMD Secure Encrypted Virtualization-Secure Nested Paging (SEV-SNP). Untuk memeriksa apakah kernel Anda mendukung AMD SEV atau AMD SEV-SNP, lihat detail kernel Linux.
    • SEV_LIVE_MIGRATABLE_V2. Gunakan tag ini jika Anda ingin menggunakan image di instance Confidential VM yang mendukung live migration di AMD SEV. Untuk memeriksa apakah kernel Anda mendukung migrasi langsung, lihat Detail kernel Linux.
    • TDX_CAPABLE. Gunakan tag ini jika Anda ingin menggunakan image di instance Confidential VM dengan dukungan Intel Trust Domain Extensions (TDX). Untuk memeriksa apakah kernel Anda mendukung Intel TDX, lihat detail kernel Linux.
    • SUSPEND_RESUME_COMPATIBLE. Mendukung penangguhan dan kelanjutan di VM. Untuk mengetahui informasi selengkapnya, lihat Kompatibilitas OS.
  • LOCATION: Opsional: region atau multi-region tempat menyimpan image

    Misalnya, tentukan us untuk menyimpan image di multi-region us, atau us-central1 untuk menyimpannya di region us-central1. Jika Anda tidak menentukan pilihan, Compute Engine akan menyimpan image di multi-region yang paling dekat dengan lokasi sumber image Anda.

REST

Gunakan metode images().insert dengan flag guestOsFeatures untuk membuat image kustom baru dari image kustom yang ada.


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

Ganti kode berikut:

  • PROJECT_ID: ID project tempat membuat image baru
  • IMAGE_NAME: nama untuk image baru
  • IMAGE_PROJECT: Opsional: project yang berisi image sumber

    Gunakan parameter ini untuk menyalin image dari project lain.

  • SOURCE_IMAGE: image yang akan menjadi dasar image baru

  • LOCATION: Opsional: region atau multi-region tempat menyimpan image

    Misalnya, tentukan us untuk menyimpan image di multi-region us, atau us-central1 untuk menyimpannya di region us-central1. Jika Anda tidak menentukan pilihan, Compute Engine akan menyimpan image di multi-region yang paling dekat dengan lokasi sumber image Anda.

  • FEATURES: tag OS tamu untuk mengaktifkan fitur bagi VM yang Anda buat dari image

    Untuk menambahkan beberapa nilai, gunakan koma untuk memisahkan nilai. Tetapkan ke satu atau beberapa nilai berikut:

    • VIRTIO_SCSI_MULTIQUEUE. Digunakan pada perangkat SSD lokal sebagai alternatif untuk NVMe. Untuk informasi selengkapnya tentang image yang mendukung SCSI, lihat Memilih antarmuka.

      Untuk image Linux, Anda dapat mengaktifkan SCSI multi-antrean di perangkat SSD lokal pada image dengan kernel versi 3.17 atau yang lebih baru. Untuk image Windows, Anda dapat mengaktifkan SCSI multi-antrean di perangkat SSD lokal pada image dengan driver Windows Compute Engine versi 1.2.

    • WINDOWS. Beri tag pada image booting kustom Windows Server sebagai image Windows.
    • MULTI_IP_SUBNET. Konfigurasi antarmuka dengan netmask selain /32. Untuk mengetahui informasi selengkapnya tentang beberapa antarmuka jaringan dan cara kerjanya, lihat Ringkasan dan contoh beberapa antarmuka jaringan.
    • UEFI_COMPATIBLE. Boot dengan firmware UEFI dan fitur Shielded VM berikut:
    • GVNIC. Mendukung bandwidth jaringan yang lebih tinggi hingga kecepatan 50 Gbps hingga 100 Gbps. Untuk informasi selengkapnya, lihat Menggunakan NIC Virtual Google.
    • IDPF. Mendukung antarmuka jaringan Fungsi Jalur Data Infrastruktur Intel (IDPF).
    • SEV_CAPABLE atau SEV_SNP_CAPABLE. Gunakan tag ini jika Anda ingin menggunakan image di instance Confidential VM dengan dukungan AMD Secure Encrypted Virtualization (SEV) atau AMD Secure Encrypted Virtualization-Secure Nested Paging (SEV-SNP). Untuk memeriksa apakah kernel Anda mendukung AMD SEV atau AMD SEV-SNP, lihat detail kernel Linux.
    • SEV_LIVE_MIGRATABLE_V2. Gunakan tag ini jika Anda ingin menggunakan image di instance Confidential VM yang mendukung live migration di AMD SEV. Untuk memeriksa apakah kernel Anda mendukung migrasi langsung, lihat Detail kernel Linux.
    • TDX_CAPABLE. Gunakan tag ini jika Anda ingin menggunakan image di instance Confidential VM dengan dukungan Intel Trust Domain Extensions (TDX). Untuk memeriksa apakah kernel Anda mendukung Intel TDX, lihat detail kernel Linux.
    • SUSPEND_RESUME_COMPATIBLE. Mendukung penangguhan dan kelanjutan di VM. Untuk mengetahui informasi selengkapnya, lihat Kompatibilitas OS.

Menghindari informasi sensitif dalam variabel UEFI

Variabel Unified Extensible Firmware Interface (UEFI) adalah variabel key-value pair yang digunakan oleh firmware UEFI selama waktu booting untuk mem-booting sistem operasi VM. Tidak seperti mesin fisik, yang menyimpan variabel di chip hardware, Compute Engine memvirtualisasi penyimpanan variabel ini. Dengan demikian, di banyak sistem operasi, semua aplikasi dan pengguna dapat menjangkau variabel ini dan mengakses informasi ini.

Karena alasan ini, Google sangat menyarankan agar Anda tidak menulis atau menyimpan informasi identitas pribadi atau sensitif seperti sandi atau kunci pribadi ke variabel UEFI.

Pertimbangan untuk image Arm

Google menawarkan seri mesin C4A dan Tau T2A, yang berjalan di platform CPU Arm. Anda dapat memulai VM dengan salah satu seri mesin ini, lalu menggunakan VM sumber tersebut untuk membuat image Arm. Proses untuk membuat image Arm kustom sama dengan membuat image x86.

Untuk membantu pengguna membedakan antara image Arm dan x86, image Arm akan memiliki kolom architecture yang ditetapkan ke ARM64. Kemungkinan nilai untuk kolom ini adalah:

  • ARCHITECTURE_UNSPECIFIED
  • X86_64
  • ARM64

Pengguna image kemudian dapat memfilter kolom ini untuk menemukan image berbasis x86 atau Arm.

Langkah selanjutnya