Creare un'immagine del disco permanente da un file ISO


I supporti di installazione per le applicazioni Windows vengono spesso forniti come file ISO, ma Compute Engine non ti consente di esporre un file ISO come unità DVD virtuale a un'istanza VM.

Per accedere ai contenuti del file ISO su una singola VM Windows, puoi svolgere una delle seguenti operazioni:

  • Copia il file ISO nella VM e montalo localmente. Questo approccio funziona bene se devi solo accedere ai contenuti del file ISO su una singola istanza VM.

  • Crea un Persistent Disk dal file ISO e collegalo in modalità di sola lettura a una o più istanze VM. Questo approccio funziona bene se più VM devono accedere ai contenuti del file ISO.

Questo documento descrive come creare un Persistent Disk dal file ISO e collegarlo in modalità di sola lettura a una o più VM.

Prima di iniziare

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

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

    Console

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

    gcloud

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

      gcloud init
    2. Set a default region and zone.

Prepara il file ISO

Se il file ISO è disponibile pubblicamente tramite HTTP, non è necessario scaricarlo prima. Per utilizzare un file ISO locale, puoi caricarlo su Cloud Storage.

URL HTTP

  1. Nella console Google Cloud, apri Cloud Shell facendo clic sul pulsante Attiva Cloud Shell Attiva Cloud Shell..

    Vai alla console Google Cloud

  2. Crea una variabile di ambiente per l'URL di download. L'URL può essere un URL HTTP o HTTPS, ma deve essere accessibile in modo anonimo.

    ISO_URL=https://example.com/big.iso
    

File ISO locale

  1. Nella console Google Cloud, crea un bucket Cloud Storage.

    Vai alla console Google Cloud

  2. Carica il file ISO.

    A seconda delle dimensioni del file ISO, il caricamento può richiedere diversi minuti o ore.

  3. Nel Browser di archiviazione, vai all'oggetto caricato.

  4. Nella pagina Dettagli oggetto, copia l'URI dell'oggetto. L'URI inizia con gs://.

  5. Apri Cloud Shell facendo clic sul pulsante Attiva Cloud Shell. Attiva Cloud Shell.

    Vai alla console Google Cloud

  6. Crea una variabile di ambiente per l'URL di download. Sostituisci URI con l'URI che hai copiato.

    ISO_URL=URI
    

Crea un disco contenente i contenuti del file ISO

Per copiare i contenuti del file ISO su un nuovo disco, crea una VM temporanea, quindi crea un'immagine dal disco:

  1. Da Cloud Shell, specifica il nome da assegnare al nuovo disco:

    DISK_NAME=iso
    
  2. Crea un nuovo disco su cui copiare i contenuti dei file ISO:

    gcloud compute disks create $DISK_NAME \
      --size=10GB \
      --zone=$(gcloud config get-value compute/zone)
    

    Utilizza una dimensione del disco maggiore se il file ISO supera i 9 GB.

  3. Crea uno script di avvio per la VM temporanea. Lo script di avvio esegue le seguenti azioni:

    1. Formatta il disco secondario con il file system NTFS.
    2. Scarica il file ISO dall'URL HTTP o Cloud Storage specificato.
    3. Monta il file ISO e copiane i contenuti sul disco secondario.
    cat << "EOF" > startup.ps1
    
    $DownloadDirectory = 'c:\download\'
    $ErrorActionPreference = 'Stop'
    $MetadataUrl = 'http://metadata.google.internal/computeMetadata/v1/instance'
    
    $DownloadUrl = (Invoke-RestMethod `
        -Headers @{"Metadata-Flavor" = "Google"} `
        -Uri "$MetadataUrl/attributes/iso")
    
    mkdir $DownloadDirectory\Source -Force
    
    Write-Host '== Formatting secondary disk... ===' -ForegroundColor Black -BackgroundColor Yellow
    Set-Disk -Number 1 -IsOffline $false
    Clear-Disk -Number 1 -RemoveData -Confirm:$false -ErrorAction SilentlyContinue
    Initialize-Disk -Number 1 -PartitionStyle MBR
    New-Partition -DiskNumber 1 -UseMaximumSize -DriveLetter D -IsActive |
    Format-Volume -FileSystem 'NTFS' -Confirm:$false
    
    Write-Host '== Downloading ISO... =============' -ForegroundColor Black -BackgroundColor Yellow
    if ($DownloadUrl.StartsWith('gs:')) {
        & gcloud storage cp $DownloadUrl "$DownloadDirectory\Source\image.iso" | Out-Default
    }
    else {
        Import-Module BitsTransfer
        Start-BitsTransfer -Source $DownloadUrl -Destination "$DownloadDirectory\Source\image.iso"
    }
    
    Write-Host '== Mounting ISO... ================' -ForegroundColor Black -BackgroundColor Yellow
    Mount-DiskImage -ImagePath "$DownloadDirectory\Source\image.iso" -StorageType ISO
    
    Write-Host '== Copying ISO contents... ========' -ForegroundColor Black -BackgroundColor Yellow
    Copy-Item 'e:\*' 'd:\' -Force -Recurse -PassThru `
        | Where-Object { -Not $_.PSIsContainer } `
        | Set-ItemProperty -Name IsReadOnly -Value $False
    
    Write-Host '== Completed. =====================' -ForegroundColor Black -BackgroundColor Yellow
    Invoke-RestMethod `
        -Headers @{'Metadata-Flavor'='Google'}  `
        -Method PUT  `
        -Uri "$MetadataUrl/guest-attributes/vm/ready" `
        -Body true
    EOF
    
  4. Crea una VM Windows Server 2019 che utilizzi lo script di avvio e il disco che hai creato in precedenza:

    gcloud compute instances create iso-copier \
        --machine-type=n1-standard-2 \
        --image-family=windows-2019-core \
        --image-project=windows-cloud \
        --disk=name=$DISK_NAME,auto-delete=no \
        --metadata=enable-guest-attributes=true,iso=$ISO_URL \
        --metadata-from-file=windows-startup-script-ps1=startup.ps1 \
        --scopes=https://www.googleapis.com/auth/devstorage.read_only
    

    L'avvio della VM richiede circa 2 minuti. A seconda delle dimensioni del file ISO, potrebbero essere necessari altri 5-15 minuti per completare l'operazione di copia del file. Puoi osservare l'avanzamento eseguendo il seguente comando:

    gcloud compute instances tail-serial-port-output iso-copier \
        --zone=$(gcloud config get-value compute/zone)
    
  5. Attendi che la VM finisca di eseguire lo script di avvio:

    until gcloud compute instances get-guest-attributes iso-copier \
        --zone=$(gcloud config get-value compute/zone) \
        --query-path=vm/ready > /dev/null 2>&1
    do
        sleep 5 && echo waiting for VM to finish...
    done
    
  6. Arresta ed elimina la VM:

    gcloud compute instances delete iso-copier \
        --zone=$(gcloud config get-value compute/zone) \
        --quiet
    

    Tieni presente che il disco secondario non viene eliminato perché è stato montato con il parametro auto-delete=no.

Il disco è ora pronto per essere utilizzato. Puoi collegare il disco in modalità di sola lettura a una o più istanze VM all'interno della stessa zona.

Condividi il disco tra zone e regioni creando un'immagine

Per rendere disponibili i contenuti del file ISO in altre zone o regioni, crea un'immagine Compute Engine:

  1. Da Cloud Shell, crea un'immagine dal disco creato nella sezione precedente:

    gcloud compute images create $DISK_NAME \
        --source-disk=$DISK_NAME \
        --source-disk-zone=$(gcloud config get-value compute/zone)
    

Esegui la pulizia

Per evitare di incorrere in ulteriori costi dopo aver completato questa procedura, puoi eliminare le risorse che hai creato:

  1. Elimina il disco:

    gcloud compute disks delete $DISK_NAME \
        --zone=$(gcloud config get-value compute/zone) \
        --quiet
    
  2. Elimina l'immagine:

    gcloud compute images delete $DISK_NAME
    

Passaggi successivi