Modificare un disco permanente


Puoi utilizzare un disco permanente come disco di avvio per un'istanza di una macchina virtuale (VM) o come disco dati da collegare a una VM. Questo documento spiega come modificare i dischi permanenti esistenti per:

  • Passa a un tipo di disco diverso.
  • Eliminazione automatica dei dischi quando vengono eliminate le VM collegate.

Per informazioni generali sui dischi permanenti e sui tipi di disponibili, leggi la panoramica sui dischi permanenti.

Modificare il tipo di volume del disco permanente

A volte è necessario modificare il tipo di un determinato volume di disco permanente per soddisfare i requisiti di prestazioni o prezzo. Ad esempio, potresti voler modifica il disco dati di un carico di lavoro da un Persistent Disk standard a uno bilanciato Persistent Disk.

Non puoi modificare direttamente il tipo di un volume di disco permanente esistente. Devi creare uno snapshot del disco esistente e utilizzarlo per creare un disco del nuovo tipo.

Ad esempio, per cambiare un disco permanente standard in un disco permanente SSD, segui la procedura riportata di seguito:

Console

  1. Crea uno snapshot del disco permanente standard.
  2. Crea un nuovo disco permanente basato sullo snapshot. Nell'elenco a discesa Tipo, seleziona "Disco permanente SSD".

gcloud

  1. Crea uno snapshot del tuo disco permanente standard.
  2. Crea un nuovo disco permanente basato sullo snapshot. Includi il flag --type e specifica pd-ssd.

REST

  1. Crea uno snapshot del disco permanente standard.
  2. Crea un nuovo disco permanente basato sullo snapshot. Nel campo type, specifica "zones/ZONE/diskTypes/pd-ssd" e sostituisci ZONE con la zona in cui l'istanza e il nuovo disco in cui si trovano.

Dopo aver creato e testato il nuovo disco, puoi: elimina l'istantanea ed elimina il disco originale.

Impostare lo stato di eliminazione automatica di un volume del disco permanente

Puoi eliminare automaticamente i volumi Persistent Disk di lettura/scrittura quando un'istanza VM associata è stata eliminata. Questo comportamento è controllato dalla proprietà autoDelete nell'istanza VM per un determinato disco collegato e può essere aggiornato in qualsiasi momento. Analogamente, puoi impedire l'eliminazione di un volume del disco persistente impostando il valore autoDelete su false.

Console

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

    Vai a Istanze VM

  2. Seleziona l'istanza a cui sono associati i dischi.

  3. Fai clic sul nome dell'istanza. Viene visualizzata la pagina Dettagli dell'istanza VM.

  4. Fai clic su Modifica.

  5. Nella sezione Archiviazione, sotto l'intestazione Dischi aggiuntivi, fai clic sull'icona a forma di matita per modifica la regola di eliminazione del disco.

  6. Fai clic su Salva per aggiornare l'istanza.

gcloud

Imposta lo stato di eliminazione automatica di un disco permanente con il comando gcloud compute instances set-disk-auto-delete. Per conservare il disco, usa il flag --no-auto-delete. Per eliminare il disco: usa il flag --auto-delete.

gcloud compute instances set-disk-auto-delete VM_NAME \
  AUTO_DELETE_SETTING \
  --disk DISK_NAME

Sostituisci quanto segue:

  • VM_NAME: il nome dell'istanza
  • AUTO_DELETE_SETTING: se eliminare o meno automaticamente il disco. Specifica --no-auto-delete per conservare il disco dopo l'eliminazione la VM e --auto-delete per eliminare il disco contemporaneamente alla VM
  • DISK_NAME: il nome del disco

Vai

Prima di provare questo esempio, segui le istruzioni per la configurazione di Go nel Guida rapida di Compute Engine con librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Compute Engine Go.

Per eseguire l'autenticazione su Compute Engine, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

import (
	"context"
	"fmt"
	"io"

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

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

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

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

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

	diskExists := false

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

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

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

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

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

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

	return nil
}

Java

Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella guida rapida di Compute Engine che utilizza le librerie client. Per ulteriori informazioni, consulta API Java Compute Engine documentazione di riferimento.

Per eseguire l'autenticazione su Compute Engine, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.


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

public class SetDiskAutodelete {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Node.js

Prima di provare questo esempio, segui le istruzioni di configurazione di Node.js nella guida rapida di Compute Engine che utilizza le librerie client. Per ulteriori informazioni, consulta API Node.js Compute Engine documentazione di riferimento.

Per autenticarti a Compute Engine, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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

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

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

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

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

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

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

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

setDiskAutodelete();

Python

Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di Compute Engine che utilizza le librerie client. Per ulteriori informazioni, consulta API Python Compute Engine documentazione di riferimento.

Per autenticarti a Compute Engine, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

from __future__ import annotations

import sys
from typing import Any

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


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

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

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

    Returns:
        Whatever the operation.result() returns.

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

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

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

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

    return result


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

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

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

    disk.auto_delete = autodelete

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

    wait_for_extended_operation(operation, "disk update")

REST

Per impostare lo stato di eliminazione automatica utilizzando l'API, invia una richiesta POST al metodo instances.setDiskAutoDelete.

Utilizza il parametro autoDelete per indicare se eliminare il disco.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setDiskAutoDelete?deviceName=DISK_NAME,autoDelete=AUTO_DELETE_OPTION

Sostituisci quanto segue:

  • PROJECT_ID: il tuo ID progetto
  • ZONE: la zona in cui si trovano l'istanza e il disco localizzato
  • VM_NAME: il nome dell'istanza
  • DISK_NAME: il nome del disco collegato al in esecuzione in un'istanza Compute Engine.
  • AUTO_DELETE_OPTION: indica se attivare o meno automaticamente elimina il disco quando la VM viene eliminata. Per eliminare il disco, imposta il valore su true. Imposta su false per conservare il disco dopo l'eliminazione della VM.

Risoluzione dei problemi

Per trovare metodi per diagnosticare e risolvere i problemi relativi ai dischi completi Ridimensionamento del disco, consulta Risoluzione dei problemi relativi ai dischi completi e al ridimensionamento dei dischi.

Passaggi successivi