Crea un'immagine disco permanente da un file ISO


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

Per accedere ai contenuti del file ISO su una singola VM Windows, puoi:

  • Copia il file ISO sulla VM e montalo in locale. Questo approccio è ideale se devi accedere solo ai contenuti del file ISO su una singola istanza VM.

  • Crea un disco permanente 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 disco permanente dal file ISO e collegarlo in modalità di sola lettura a una o più VM.

Prima di iniziare

Prepara il file ISO

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

URL HTTP

  1. In Google Cloud Console, apri Cloud Shell facendo clic sul pulsante Attiva Cloud Shell Attiva Cloud Shell..

    Vai a Google Cloud Console

  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 forma anonima.

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

File ISO locale

  1. In Google Cloud Console, crea un bucket Cloud Storage.

    Vai a Google Cloud Console

  2. Carica il file ISO utilizzando Google Cloud Console o gsutil.

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

  3. Nel browser Storage, 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 a Google Cloud Console

  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 con 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 che vuoi assegnare al nuovo disco:

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

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

    Utilizza un disco di dimensioni maggiori 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 il contenuto 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:')) {
        & gsutil 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 che esegue Windows Server 2019 Core e collega il disco secondario:

    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 due minuti. A seconda delle dimensioni del file ISO, potrebbero essere necessari altri 5-15 minuti per il completamento dell'operazione di copia dei file. Puoi osservare l'avanzamento eseguendo questo comando:

    gcloud compute instances tail-serial-port-output iso-copier \
        --zone=$(gcloud config get-value compute/zone)
    
  5. Attendi che la VM completi l'esecuzione dello 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 è 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 aree geografiche creando un'immagine

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

  1. Da Cloud Shell, crea un'immagine dal disco che hai 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 che ti vengano addebitati 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