Crie uma imagem de disco persistente a partir de um ficheiro ISO


Os suportes de instalação para aplicações Windows são frequentemente fornecidos como um ficheiro ISO, mas o Compute Engine não lhe permite expor um ficheiro ISO como uma unidade de DVD virtual a uma instância de VM.

Para aceder ao conteúdo do ficheiro ISO numa única VM do Windows, pode fazer qualquer uma das seguintes ações:

  • Copie o ficheiro ISO para a MV e monte-o localmente. Esta abordagem funciona bem se só precisar de aceder ao conteúdo do ficheiro ISO numa única instância de VM.

  • Crie um disco persistente a partir do ficheiro ISO e anexe o disco no modo de leitura a uma ou mais instâncias da VM. Esta abordagem funciona bem se várias VMs precisarem de aceder ao conteúdo do ficheiro ISO.

Este documento descreve como pode criar um disco persistente a partir do ficheiro ISO e anexar o disco no modo de leitura a uma ou mais VMs.

Antes de começar

  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Google Cloud serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:

    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. Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    2. Set a default region and zone.

Prepare o ficheiro ISO

Se o ficheiro ISO estiver disponível publicamente através de HTTP, não precisa de transferir o ficheiro ISO primeiro. Para usar um ficheiro ISO local, pode carregar o ficheiro ISO para o Cloud Storage.

URL HTTP

  1. Na Google Cloud consola, abra o Cloud Shell clicando no botão Ativar Cloud Shell Ative o Cloud Shell..

    Aceda à Google Cloud consola

  2. Crie uma variável de ambiente para o URL de transferência. O URL pode ser um URL HTTP ou HTTPS, mas tem de ser acessível anonimamente.

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

Ficheiro ISO local

  1. Na Google Cloud consola, crie um contentor do Cloud Storage.

    Aceda à Google Cloud consola

  2. Carregue o ficheiro ISO.

    Consoante o tamanho do ficheiro ISO, o carregamento pode demorar vários minutos ou horas.

  3. No navegador de armazenamento, navegue para o objeto carregado.

  4. Na página Detalhes do objeto, copie o URI do objeto. O URI começa com gs://.

  5. Abra o Cloud Shell clicando no botão Ativar Cloud Shell Ative o Cloud Shell..

    Aceda à Google Cloud consola

  6. Crie uma variável de ambiente para o URL de transferência. Substitua URI pelo URI que copiou.

    ISO_URL=URI
    

Crie um disco com o conteúdo do ficheiro ISO

Para copiar o conteúdo do ficheiro ISO para um novo disco, crie uma VM temporária e, em seguida, crie uma imagem a partir do disco:

  1. No Cloud Shell, especifique o nome que quer atribuir ao novo disco:

    DISK_NAME=iso
    
  2. Crie um novo disco para o qual copiar o conteúdo dos ficheiros ISO:

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

    Use um tamanho de disco maior se o seu ficheiro ISO exceder os 9 GB.

  3. Crie um script de arranque para a VM temporária. O script de arranque realiza as seguintes ações:

    1. Formate o disco secundário com o sistema de ficheiros NTFS.
    2. Transfira o ficheiro ISO a partir do URL HTTP ou do Cloud Storage que especificou.
    3. Monte o ficheiro ISO e copie o respetivo conteúdo para o disco secundário.
    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. Crie uma VM do Windows Server 2019 que use o script de arranque e o disco que criou anteriormente:

    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
    

    O início da VM demora cerca de 2 minutos. Consoante o tamanho do ficheiro ISO, a operação de cópia do ficheiro pode demorar mais 5 a 15 minutos a ser concluída. Pode observar o progresso executando o seguinte comando:

    gcloud compute instances tail-serial-port-output iso-copier \
        --zone=$(gcloud config get-value compute/zone)
    
  5. Aguarde até que a VM termine a execução do script de arranque:

    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. Encerre e elimine a VM:

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

    Tenha em atenção que o disco secundário não é eliminado porque foi montado com o parâmetro auto-delete=no.

O disco está agora pronto a ser usado. Pode anexar o disco no modo só de leitura a uma ou mais instâncias de VM na mesma zona.

Partilhe o disco entre zonas e regiões criando uma imagem

Para disponibilizar o conteúdo do ficheiro ISO noutras zonas ou regiões, crie uma imagem do Compute Engine:

  1. No Cloud Shell, crie uma imagem a partir do disco que criou na secção anterior:

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

Limpar

Para evitar incorrer em custos adicionais após a conclusão deste processo, pode eliminar os recursos que criou:

  1. Elimine o disco:

    gcloud compute disks delete $DISK_NAME \
        --zone=$(gcloud config get-value compute/zone) \
        --quiet
    
  2. Elimine a imagem:

    gcloud compute images delete $DISK_NAME
    

O que se segue?