Criar imagens personalizadas do BYOL do Windows


Para criar uma VM do Windows no Google Cloud, você precisa usar uma imagem de VM que tenha o Windows ou o Windows Server pré-instalado. O Google Cloud fornece imagens públicas para versões comumente usadas do Windows Server, mas essas imagens são adequadas apenas para licenciamento sob demanda. Para trazer sua própria licença do Windows (BYOL, na sigla em inglês), é necessário importar uma imagem atual ou criar uma imagem personalizada.

Neste guia, descrevemos como criar uma imagem personalizada usando as mesmas ferramentas e processos que o Google Cloud usa para criar as imagens públicas.

Para concluir este guia, você precisa ter:

  • Um arquivo ISO que contém a mídia de instalação do Windows ou do Windows Server.
  • Opcionalmente, um ou mais pacotes de atualização do Windows (no formato .msu) para aplicar à imagem.

Antes de começar

Entenda o processo de compilação

Para instalar o Windows do zero, uma abordagem comum é inicializar um computador de um arquivo DVD ou ISO que contenha os arquivos de instalação do Windows. Ao contrário de alguns hipervisores locais, o Compute Engine não permite a inicialização de um arquivo ISO.

Para instalar o Windows do zero, siga uma abordagem diferente que siga estas etapas:

  1. Criação de um novo disco
  2. Extraindo a imagem do Windows (install.wim da mídia de instalação) para o disco.
  3. Adicionar os drivers necessários, configurar o Windows Setup para que ele seja executado sem necessidade e tornar o disco inicializável.
  4. Inicializar a partir do novo disco para executar a Instalação do Windows.
  5. Como instalar software adicional, incluindo o agente do SO convidado.
  6. Como criar uma imagem a partir do disco.

Em vez de realizar essas etapas manualmente, este guia descreve como é possível usar o Cloud Build, a ferramenta daisy e os fluxos de trabalho de referência que estão disponíveis. no GitHub para automatizar o processo.

daisy é uma ferramenta de linha de comando de código aberto que permite executar fluxos de trabalho. Os fluxos de trabalho são criados como arquivos JSON e contêm uma sequência de etapas. Cada uma delas descreve uma operação do Compute Engine, como a criação de um disco ou o encerramento de uma instância de VM. Portanto, os fluxos de trabalho barulhentos são adequados para automatizar as etapas necessárias para criar uma imagem do Windows do zero.

Os fluxos de trabalho da lei para criar imagens personalizadas do Windows criam duas instâncias de VM temporárias. A primeira instância de VM (prefixada bootstrap) executa as etapas necessárias para criar um disco inicializável. A segunda instância de VM, prefixada install, executa a Configuração do Windows e executa todas as etapas restantes.

Prepare o projeto para criar imagens

Para evitar que a ferramenta da ferramenta interfira na instância ou na infraestrutura de VM, crie um projeto dedicado para a criação de imagens:

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Ative a API Compute Engine, a API Cloud Build e a API Cloud Storage.

    Ative as APIs

As próximas etapas serão diferentes se você usar o Windows ou o Linux no computador local:

Windows

  1. No computador local, abra uma janela do Windows PowerShell.
  2. Inicialize uma variável:

    $PROJECT_ID = "PROJECT_ID"
    

    em que PROJECT_ID é o ID do projeto do Cloud que você criou na seção anterior.

  3. Inicialize outra variável para que ela contenha o número do projeto:

    $PROJECT_NUMBER = gcloud projects describe $PROJECT_ID --format=value`(projectNumber`)
    
  4. Desative as regras de firewall padrão para acesso ao RDP e SSH:

    gcloud compute firewall-rules update default-allow-rdp --project $PROJECT_ID --disabled
    gcloud compute firewall-rules update default-allow-ssh --project $PROJECT_ID --disabled
    
  5. Conceda os papéis Administrador da instância do Compute e Usuário da conta de serviço ao Cloud Build para que o Cloud Build crie as instâncias de VM temporárias necessárias para criar imagens:

    gcloud projects add-iam-policy-binding $PROJECT_ID `
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com `
       --role roles/compute.instanceAdmin.v1
    gcloud projects add-iam-policy-binding $PROJECT_ID `
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com `
       --role roles/iam.serviceAccountUser
    

Linux

  1. No computador local, abra uma janela de terminal.
  2. Inicialize uma variável:

    PROJECT_ID=PROJECT_ID
    

    em que PROJECT_ID é o ID do projeto do Cloud que você criou na seção anterior.

  3. Inicialize outra variável para que ela contenha o número do projeto:

    PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format=value\(projectNumber\)`
    
  4. Desative as regras de firewall padrão para acesso ao RDP e SSH:

    gcloud compute firewall-rules update default-allow-rdp --project $PROJECT_ID --disabled
    gcloud compute firewall-rules update default-allow-ssh --project $PROJECT_ID --disabled
    
  5. Conceda os papéis Administrador da instância do Compute e Usuário da conta de serviço ao Cloud Build para que o Cloud Build possa criar as instâncias de VM temporárias necessárias para criar imagens:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
       --role roles/compute.instanceAdmin.v1
    gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountUser
    

Faça upload de arquivos de instalação

Agora você coleta todos os arquivos de instalação necessários para a imagem personalizada e os envia para um bucket do Cloud Storage. Ao armazenar os arquivos em um bucket do Cloud Storage, você garante que os arquivos possam ser acessados por daisy e pelas instâncias de VM temporárias que o daisy usa para criar a imagem.

  1. No computador local, faça o download dos pacotes de instalação necessários:

  2. Crie um novo bucket do Cloud Storage para armazenar os arquivos de instalação:

    gsutil mb -p $PROJECT_ID gs://$PROJECT_ID-media
    
  3. Conceda o papel Leitor de objetos do Storage ao Cloud Build para que ele possa ler os arquivos de instalação:

    gsutil iam ch serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com:objectViewer  gs://$PROJECT_ID-media
    
  4. Faça o upload do pacote de instalação do PowerShell:

    gsutil cp POWERSHELL_PACKAGE gs://$PROJECT_ID-media/PowerShell.msi
    

    em que POWERSHELL_PACKAGE é o caminho para o pacote de instalação do PowerShell.

  5. Faça upload do pacote de instalação do .NET Framework:

    gsutil cp DOTNET_PACKAGE gs://$PROJECT_ID-media/dotnet-sdk.exe
    

    em que DOTNET_PACKAGE é o caminho para o pacote de instalação do NET Framework.

  6. Faça upload do pacote de instalação da CLI gcloud:

    gsutil cp CLOUDSDK_PACKAGE gs://$PROJECT_ID-media/GoogleCloudSDKInstaller.exe
    

    em que CLOUDSDK_PACKAGE é o caminho para o pacote de instalação da CLI gcloud.

  7. Faça o upload do arquivo ISO que contém a mídia de instalação do Windows:

    gsutil cp ISO gs://$PROJECT_ID-media/
    

    em que ISO é o nome do arquivo ISO.

  8. Opcionalmente, faça upload de pacotes de atualização adicionais:

    gsutil cp UPDATE_DIR/*.msu gs://$PROJECT_ID-media/updates/
    

    em que UPDATE_DIR é o diretório que contém os pacotes de atualização.

Agora você está pronto para criar a imagem personalizada.

Criar a imagem

A execução do fluxo de trabalho daisy para criar uma imagem personalizada leva até quatro horas. Em vez de executar daisy localmente, crie uma configuração do Cloud Build para permitir que o Cloud Build execute o fluxo de trabalho em segundo plano.

  1. No computador local, clone o repositório do Git que contém os fluxos de trabalho daisy para criar imagens do Windows:

    git clone https://github.com/GoogleCloudPlatform/compute-image-tools.git
    
  2. Alterne para o diretório windows:

    cd compute-image-tools/daisy_workflows/image_build/windows/
    
  3. No diretório windows, você encontra uma seleção de arquivos com o sufixo .wf.json. Esses arquivos contêm definições de fluxo de trabalho Daisy para versões do Windows mais usadas:

    Versão do Windows Arquivo de fluxo de trabalho
    Windows Server 2019 (64 bits) windows-server-2019-dc-uefi-byol.wf.json
    Windows Server Core 2019 (64 bits) windows-server-2019-dc-core-uefi-byol.wf.json
    Windows Server 2016 (64 bits) windows-server-2016-dc-uefi-byol.wf.json
    Windows Server Core 2016 (64 bits) windows-server-2016-dc-core-uefi-byol.wf.json
    Windows 10 (64-bit) windows-10-20h2-ent-x64-uefi-byol.wf.json

    Abra o arquivo de fluxo de trabalho que mais se aproxima da versão do Windows que você quer instalar. Se necessário, altere as configurações do Windows (edition) e da chave de licença (product_key) nos arquivos de fluxo de trabalho para que correspondam à mídia de instalação.

    Caso não tenha certeza sobre o nome correto, abra um prompt elevado do PowerShell e execute os seguintes comandos para listar todas as edições compatíveis com sua mídia de instalação:

    $IsoFile = "ISO"
    
    $Mount = Mount-DiskImage -ImagePath (Resolve-Path $IsoFile)
    
    $DriveLetter = ($Mount | Get-Volume).DriveLetter
    Get-WindowsImage -ImagePath "$($DriveLetter):\sources\install.wim" | select ImageName
    
    Dismount-DiskImage -InputObject $Mount | Out-Null
    

    Substitua ISO pelo caminho local para a imagem ISO.

  4. No diretório windows, crie um novo arquivo chamado cloudbuild.yaml e cole o seguinte código:

    timeout: 14400s  # 4 hour timeout for entire build
    steps:
    - name: 'gcr.io/compute-image-tools/daisy'
      timeout: 14400s  # 4 hour timeout for build step
      args:
        - -project=$PROJECT_ID
        - -zone=us-central1-a
        - -var:updates=gs://$PROJECT_ID-media/updates/
        - -var:pwsh=gs://$PROJECT_ID-media/PowerShell.msi
        - -var:dotnet48=gs://$PROJECT_ID-media/dotnet-sdk.exe
        - -var:cloudsdk=gs://$PROJECT_ID-media/GoogleCloudSDKInstaller.exe
        - -var:media=gs://$PROJECT_ID-media/ISO
        - WORKFLOW
    

    Substitua:

    • ISO: nome do arquivo ISO no Cloud Storage.
    • WORKFLOW: nome do arquivo de fluxo de trabalho que corresponde à versão do Windows que você está usando.
  5. Envie a compilação para o Cloud Build.

    gcloud builds submit --project $PROJECT_ID --async
    

    A compilação leva cerca de quatro horas para ser concluída. É possível acompanhar o status da build no Console do Google Cloud em Cloud Build > Histórico.

    Histórico do Cloud Build

Usar a imagem personalizada

Após a conclusão da criação, é possível encontrar a imagem BYOL personalizada no console do Google Cloud em Compute Engine > Imagens.

Para ajudar a diferenciar entre várias versões da mesma imagem, o processo de criação incorpora um carimbo de data/hora no nome da imagem, por exemplo, windows-server-2019-dc-v1613488342. Além disso, o processo associa a imagem a uma família de imagens personalizada, por exemplo, windows-server-2019.

Para criar uma instância de VM que usa a imagem BYOL personalizada, você precisa provisionar a instância de VM em um nó de locatário individual.

Solução de problemas

Se você suspeitar que o processo de compilação falhou ou não progrediu, use as seguintes abordagens para diagnosticar a situação:

  • Verifique se você fez upload dos pacotes de instalação e do arquivo ISO corretos.
  • Verifique se você selecionou um fluxo de trabalho que corresponde à versão do Windows do arquivo ISO.
  • Verifique o registro de criação no Cloud Build e verifique se há mensagens de erro.
  • Se a compilação parecer travada, analise a saída da porta serial da instância de VM criada pela compilação e verifique se há mensagens de erro.

A seguir