Criar uma imagem de disco permanente a partir de um arquivo ISO


A mídia de instalação de aplicativos do Windows geralmente é fornecida como um arquivo ISO. No entanto, o Compute Engine não permite expor um arquivo ISO como uma unidade de DVD virtual para uma instância de VM.

Para acessar o conteúdo do arquivo ISO em uma única VM do Windows, siga um destes procedimentos:

  • Copie o arquivo ISO para a VM e ative-o localmente. Essa abordagem funciona bem se você só precisar acessar o conteúdo do arquivo ISO em uma única instância de VM.

  • Crie um disco permanente no arquivo ISO e conecte o disco no modo somente leitura a uma ou mais instâncias de VM. Essa abordagem funciona bem se várias VMs precisarem acessar o conteúdo do arquivo ISO.

Neste documento, você verá como criar um disco permanente no arquivo ISO e anexar o disco no modo somente leitura a uma ou mais VMs.

Antes de começar

Preparar o arquivo ISO

Se o arquivo ISO estiver disponível publicamente via HTTP, você não precisará fazer o download do arquivo ISO primeiro. Para usar um arquivo ISO local, faça upload do arquivo ISO para o Cloud Storage.

URL HTTP

  1. No Console do Google Cloud Platform, abra o Cloud Shell clicando no botão Ativar o Cloud Shell Ative o Cloud Shell..

    Acesse o Console do Google Cloud.

  2. Crie uma variável de ambiente para o URL de download. O URL pode ser um URL HTTP ou HTTPS, mas precisa ser acessado anonimamente.

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

Arquivo ISO local

  1. No Console do Google Cloud, crie um bucket do Cloud Storage.

    Acesse o Console do Google Cloud

  2. Faça o upload do arquivo ISO usando o Console do Google Cloud ou o gsutil.

    Dependendo do tamanho do arquivo ISO, o upload pode levar vários minutos ou horas.

  3. No navegador do Storage, navegue até o objeto enviado.

  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 o Cloud Shell Ative o Cloud Shell..

    Acesse o Console do Google Cloud.

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

    ISO_URL=URI
    

Criar um disco com o conteúdo do arquivo ISO

Para copiar o conteúdo do arquivo ISO para um novo disco, crie uma VM temporária e crie uma imagem do disco:

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

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

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

    Use um tamanho de disco maior se o arquivo ISO exceder 9 GB.

  3. Crie um script de inicialização para a VM temporária. O script de inicialização executa as seguintes ações:

    1. Formate o disco secundário com o sistema de arquivos NTFS.
    2. Faça o download do arquivo ISO do URL HTTP ou do Cloud Storage especificado.
    3. Ative o arquivo ISO e copie o conteúdo dele 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:')) {
        & 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. Crie uma VM que execute o Windows Server 2019 Core e conecte o disco secundário:

    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
    

    A VM leva cerca de dois minutos para ser iniciada. Dependendo do tamanho do arquivo ISO, pode levar de cinco a 15 minutos para que a operação de cópia de arquivos seja concluída. Para observar o progresso, execute 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 de executar o script de inicialização:

    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 exclua a VM:

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

    O disco secundário não foi excluído porque foi ativado com o parâmetro auto-delete=no.

O disco está pronto para ser usado. É possível conectar o disco no modo somente leitura a uma ou mais instâncias de VM na mesma zona.

Criar uma imagem para compartilhar o disco entre zonas e regiões

Para disponibilizar o conteúdo do arquivo ISO em outras zonas ou regiões, crie uma imagem do Compute Engine:

  1. No Cloud Shell, crie uma imagem do disco criado na seção anterior:

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

Limpar

Para evitar outros custos depois de concluir esse processo, exclua os recursos criados:

  1. Exclua o disco:

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

    gcloud compute images delete $DISK_NAME
    

A seguir