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

  • Configure a autenticação, caso ainda não tenha feito isso. A autenticação é o processo de verificação da sua identidade para acesso a serviços e APIs do Google Cloud. Para executar códigos ou amostras de um ambiente de desenvolvimento local, autentique-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. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.

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, 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 upload do arquivo ISO.

    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:')) {
        & 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 inicialização e o disco criado 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
    

    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