Crea imágenes de BYOL de Windows personalizadas


Para crear una VM de Windows en Google Cloud, debes usar una imagen de VM que tenga Windows o Windows Server preinstalado. Google Cloud proporciona imágenes públicas para las versiones de Windows Server de uso general, pero estas imágenes solo son adecuadas para las licencias a pedido. Para usar tu propia licencia de Windows (BYOL), debes importar una imagen existente o compilar una imagen personalizada.

En esta guía, se describe cómo puedes crear una imagen personalizada con las mismas herramientas y procesos que usa Google Cloud para crear las imágenes públicas.

Para completar esta guía, necesitas lo siguiente:

  • Un archivo ISO que contenga los medios de instalación de Windows o Windows Server
  • De manera opcional, uno o más paquetes de actualización de Windows (en formato .msu) para aplicar a la imagen.

Antes de comenzar

Comprende el proceso de compilación

Para instalar Windows desde cero, un enfoque común es iniciar una computadora desde un archivo ISO o DVD que contiene los archivos de instalación de Windows. A diferencia de algunos hipervisores locales, Compute Engine no te permite iniciar desde un archivo ISO.

Por lo tanto, para instalar Windows desde cero, debes seguir un enfoque diferente que implica los siguientes pasos:

  1. Crear un disco nuevo.
  2. Extraer la imagen de Windows (install.wim desde los medios de instalación) en el disco.
  3. Agregar los controladores necesarios, configurar Windows Setup para que se ejecute sin supervisión y hacer que el disco se pueda iniciar
  4. Iniciar desde el disco nuevo para ejecutar la configuración de Windows.
  5. Instalar software adicional, incluido el agente de SO invitado
  6. Crear una imagen a partir del disco.

En lugar de realizar estos pasos de forma manual, en esta guía, se describe cómo puedes usar Cloud Build, la herramienta de daisy y los flujos de trabajo de referencia que están disponibles en GitHub para automatizar el proceso.

daisy es una herramienta de línea de comandos de código abierto que te permite ejecutar flujos de trabajo. Los flujos de trabajo se crean como archivos JSON y contienen una secuencia de pasos. En cada uno de estos pasos, se describe una operación de Compute Engine, por ejemplo, crear un disco o cerrar una instancia de VM. Por lo tanto, los flujos de trabajo de Daisy son adecuados para automatizar los pasos necesarios a fin de compilar una imagen de Windows desde cero.

Los flujos de trabajo Daisy para compilar imágenes personalizadas de Windows crean dos instancias de VM temporales. La primera instancia de VM (con el prefijo bootstrap) realiza los pasos necesarios para crear un disco que se pueda iniciar. La segunda instancia de VM (con el prefijo install) ejecuta la configuración de Windows y realiza todos los pasos restantes.

Prepara el proyecto para compilar imágenes

Para evitar que la herramienta Daisy interfiera con las instancias de VM o la infraestructura existentes, crea un proyecto dedicado para compilar imágenes:

  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. Habilita la API de Compute Engine, la API de Cloud Build y la API de Cloud Storage.

    Habilite las API

Los siguientes pasos varían en función de si usas Windows o Linux en tu computadora local:

Windows

  1. En tu computadora local, abre una ventana de Windows PowerShell.
  2. Inicializa una variable:

    $PROJECT_ID = "PROJECT_ID"
    

    En el ejemplo anterior, PROJECT_ID es el ID del proyecto de Cloud que creaste en la sección anterior.

  3. Inicializa otra variable para que contenga el número del proyecto:

    $PROJECT_NUMBER = gcloud projects describe $PROJECT_ID --format=value`(projectNumber`)
    
  4. Inhabilita las reglas de firewall predeterminadas para el acceso RDP y 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. Otorga el rol administrador de instancias de procesamiento y usuario de cuenta de servicio a Cloud Build para que Cloud Build pueda crear las instancias de VM temporales necesarias a fin de compilar imágenes:

    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. En tu computadora local, abre una ventana de la terminal.
  2. Inicializa una variable:

    PROJECT_ID=PROJECT_ID
    

    En el ejemplo anterior, PROJECT_ID es el ID del proyecto de Cloud que creaste en la sección anterior.

  3. Inicializa otra variable para que contenga el número del proyecto:

    PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format=value\(projectNumber\)`
    
  4. Inhabilita las reglas de firewall predeterminadas para el acceso RDP y 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. Otorga el rol administrador de instancias de procesamiento y usuario de cuenta de servicio a Cloud Build para que Cloud Build pueda crear las instancias de VM temporales necesarias a fin de compilar imágenes:

    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
    

Sube archivos de instalación

Ahora, recopilas todos los archivos de instalación necesarios para la imagen personalizada y los subes a un bucket de Cloud Storage. Si almacenas los archivos en un bucket de Cloud Storage, te aseguras de que los archivos sean accesibles de daisy y de las instancias de VM temporales que usa daisy a fin de compilar la imagen.

  1. En tu computadora local, descarga los paquetes de instalación necesarios:

  2. Crea un bucket de Cloud Storage nuevo para almacenar los archivos de instalación:

    gsutil mb -p $PROJECT_ID gs://$PROJECT_ID-media
    
  3. Otorga el rol Visualizador de objetos de Storage a Cloud Build para que pueda leer los archivos de instalación:

    gsutil iam ch serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com:objectViewer  gs://$PROJECT_ID-media
    
  4. Sube el paquete de instalación de PowerShell:

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

    En el ejemplo anterior, POWERSHELL_PACKAGE es la ruta al paquete de instalación de PowerShell.

  5. Sube el paquete de instalación de .NET Framework:

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

    En el ejemplo anterior, DOTNET_PACKAGE es la ruta al paquete de instalación de NET Framework.

  6. Sube el paquete de instalación de la CLI de gcloud:

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

    En el ejemplo anterior, CLOUDSDK_PACKAGE es la ruta de acceso al paquete de instalación de la CLI de gcloud.

  7. Sube el archivo ISO que contiene los medios de instalación de Windows:

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

    En el ejemplo anterior, ISO es el nombre del archivo ISO.

  8. De manera opcional, sube paquetes de actualización adicionales:

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

    En el ejemplo anterior, UPDATE_DIR es el directorio que contiene los paquetes de actualización.

Ya estás listo para compilar la imagen personalizada.

Compila la imagen

Ejecutar el flujo de trabajo daisy para compilar una imagen personalizada puede tardar hasta cuatro horas. En lugar de ejecutar daisy de manera local, debes crear una configuración de Cloud Build para permitir que Cloud Build ejecute el flujo de trabajo en segundo plano.

  1. En tu computadora local, clona el repositorio de Git que contiene los flujos de trabajo de daisy para compilar imágenes de Windows:

    git clone https://github.com/GoogleCloudPlatform/compute-image-tools.git
    
  2. Cambia al directorio windows:

    cd compute-image-tools/daisy_workflows/image_build/windows/
    
  3. En el directorio windows, encontrarás una selección de archivos con el sufijo .wf.json. Estos archivos contienen definiciones de flujo de trabajo de Daisy para las versiones de Windows de uso general:

    Versión de Windows Archivo de flujo de trabajo
    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 bits) windows-10-20h2-ent-x64-uefi-byol.wf.json

    Abre el archivo de flujo de trabajo que más se asemeje a la versión de Windows que deseas instalar. Si es necesario, cambia la configuración de la edición de Windows (edition) y de la clave de licencia (product_key) en los archivos de flujo de trabajo para que coincidan con los medios de instalación.

    Si no estás seguro del nombre de la edición correcto, abre un símbolo del sistema de PowerShell elevado y ejecuta los siguientes comandos para enumerar todas las ediciones compatibles con tu medio de instalación:

    $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
    

    Reemplaza ISO por la ruta local a la imagen ISO.

  4. En el directorio windows, crea un archivo nuevo llamado cloudbuild.yaml y pega el siguiente 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
    

    Reemplaza lo siguiente:

    • ISO: Es el nombre del archivo ISO en Cloud Storage.
    • WORKFLOW: Es el nombre del archivo de flujo de trabajo que corresponde a la versión de Windows que usas.
  5. Envía la compilación a Cloud Build:

    gcloud builds submit --project $PROJECT_ID --async
    

    La compilación toma unos cuatro horas en completarse. Puedes hacer un seguimiento del estado de la compilación en Google Cloud Console en Cloud Build > Historial.

    Historial de Cloud Build

Usa la imagen personalizada

Una vez completada la compilación, puedes encontrar la imagen BYOL personalizada en la consola de Google Cloud en Compute Engine > Imágenes.

Para ayudar a diferenciar entre varias versiones de la misma imagen, el proceso de compilación incorpora una marca de tiempo en el nombre de la imagen, por ejemplo windows-server-2019-dc-v1613488342. Además, el proceso asocia la imagen con una familia de imágenes personalizada, por ejemplo, windows-server-2019.

Para crear una instancia de VM que use la imagen BYOL personalizada, debes aprovisionar la instancia de VM en un nodo de usuario único.

Soluciona problemas

Si sospechas que el proceso de compilación falló o no progresa, usa los siguientes enfoques para diagnosticar la situación:

  • Verifica que hayas subido los paquetes de instalación y el archivo ISO correctos.
  • Verifica que hayas seleccionado un flujo de trabajo que coincida con la versión de Windows del archivo ISO.
  • Revisa el registro de compilación en Cloud Build y verifica si hay mensajes de error.
  • Si la compilación parece detenida, revisa el resultado del puerto en serie de la instancia de VM que creó la compilación y busca mensajes de error.

¿Qué sigue?