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


A mídia de instalação para aplicativos do Windows geralmente é fornecida como um arquivo ISO, mas 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, você pode fazer o seguinte:

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

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

Este documento descreve como você pode criar um disco permanente a partir do arquivo ISO e anexar o disco em modo somente leitura a uma ou mais VMs.

Antes de começar

  • Se ainda não o fez, configure a autenticação. Autenticação é o processo pelo qual sua identidade é verificada para acesso a Google Cloud serviços e APIs. Para executar códigos ou amostras em um ambiente de desenvolvimento local, você pode se autenticar 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. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

Prepare o arquivo ISO

Se o arquivo ISO estiver disponível publicamente via HTTP, você não precisará fazer 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 em Ativar Cloud ShellAtive o Cloud Shell. botão.

    Acesse o console do Google Cloud

  2. Crie uma variável de ambiente para o URL de download. A URL pode ser uma URL HTTP ou HTTPS, mas deve ser acessível 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. Carregue o arquivo ISO .

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

  3. No navegador de armazenamento , navegue até 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 em Ativar Cloud ShellAtive o Cloud Shell. botão.

    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
    

Crie um disco contendo o conteúdo do arquivo ISO

Para copiar o conteúdo do arquivo ISO para um novo disco, crie uma VM temporária e, em seguida, 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 seu 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. Baixe o arquivo ISO do URL HTTP ou Cloud Storage que você especificou.
    3. Monte o arquivo ISO e copie seu 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 inicialização e o disco que você 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
    

    A VM leva cerca de 2 minutos para iniciar. Dependendo do tamanho do arquivo ISO, pode levar de 5 a 15 minutos para que a operação de cópia do arquivo seja concluída. Você 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 a VM terminar 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. Desligue e exclua a VM:

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

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

O disco agora está pronto para ser usado. Você pode anexar o disco no modo somente leitura a uma ou mais instâncias de VM na mesma zona.

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

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 incorrer em custos adicionais após concluir esse processo, você pode excluir os recursos que criou:

  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
    

O que vem a seguir