Acciones de personalización compatibles

Para personalizar las imágenes de tu máquina virtual, como ejecutar secuencias de comandos de la terminal, actualizar parámetros de arranque, transferir archivos binarios o instalar controladores de GPU, puedes definir acciones de ayuda específicas dentro del bloque spec.steps de tu receta de personalización (imagebuilder.yaml).

Descripción general

Durante la fase de ejecución de una compilación de Image Builder, el orquestador ejecuta los pasos declarados en tu receta de personalización (spec.steps) de forma secuencial en la VM de trabajador temporal.

Cada paso debe especificar un bloque name, un bloque action y un bloque inputs adaptados a ese tipo de acción. Image Builder admite las siguientes acciones de personalización:

  • Shell: Ejecuta comandos o secuencias de comandos de terminal intercalados en el SO invitado del trabajador.
  • UpdateKernelCommandLine: Modifica los parámetros de inicio y las marcas de línea de comandos del kernel.
  • FileCopy: Transfiere archivos de configuración, secuencias de comandos o recursos de Cloud Storage o de espacios de trabajo locales a la VM.
  • InstallGPU: Descarga, compila y registra los controladores de la GPU de NVIDIA.

Acción de shell

La acción Shell te permite ejecutar secuencias de comandos de terminal intercaladas o comandos de shell únicos en el SO invitado de la VM de trabajador temporal para realizar personalizaciones, como actualizar paquetes, configurar cuentas de usuario o compilar software.

Especifica cualquiera de las siguientes entradas en steps.inputs:

  • inlineScript (cadena): Comandos de shell sin procesar de varias líneas para ejecutar.
  • command (cadena): Es una sola cadena de comando del sistema o una ruta de acceso relativa a un archivo binario ejecutable.

Configuraciones de muestra

En las siguientes pestañas, se muestran ejemplos de configuraciones de pasos para ejecutar una secuencia de comandos intercalada en comparación con la ejecución de un solo comando:

Ejecuta una secuencia de comandos intercalada

La siguiente configuración ejecuta un script de varias líneas que actualiza paquetes con apt:

- name: "Update guest packages and configure groups"
  action: Shell
  inputs:
    inlineScript: |
      #!/bin/bash
      apt-get update -y
      apt-get install -y fail2ban build-essential
      groupadd -r adminusers

Ejecuta un solo comando

La siguiente configuración ejecuta un solo comando de shell para verificar la versión de kernel activa del sistema operativo:

- name: "Log kernel identifier"
  action: Shell
  inputs:
    command: "uname -a"

Comportamientos especiales

Cuando ejecutas acciones de Shell, el aprovisionador de personalización administra la auditoría de seguridad y los reinicios automáticos del sistema, como se describe en las siguientes secciones:

Auditorías de seguridad

Para evitar que los tokens sensibles, los secretos o el código propietario se filtren en los registros de ejecución, el aprovisionador de personalización no imprime las líneas sin procesar de tus secuencias de comandos, a menos que se habilite la depuración interactiva (debug: true). En cambio, registra el hash de integridad SHA-256 de la carga útil de tu secuencia de comandos en los registros de compilación. Este hash proporciona un registro de auditoría inmutable de exactamente qué código se ejecutó en la imagen.

Reinicio del sistema (código de salida 3010)

Algunas acciones de shell, como las actualizaciones de parches del kernel o los ajustes de particiones de almacenamiento, requieren un reinicio del sistema antes de que se puedan ejecutar los pasos posteriores.

Para solicitar un reinicio del sistema durante la personalización, tu secuencia de comandos de shell debe finalizar con el comando exit 3010. Cuando el aprovisionador de personalización recibe el código de salida 3010, controla el ciclo de vida del reinicio de la siguiente manera:

  1. El aprovisionador detecta el código de salida 3010, pausa la ejecución y marca el índice de progreso del paso.
  2. El aprovisionador reinicia la VM de trabajador.
  3. Después de que se reinicia la VM, el aprovisionador activa el espacio de trabajo y reanuda automáticamente la canalización en el siguiente paso de la cola.
Ejemplo de reinicio:

En el siguiente ejemplo, se muestra una configuración de paso que actualiza paquetes y solicita un reinicio:

- name: "Install core updates and request reboot"
  action: Shell
  inputs:
    inlineScript: |
      #!/bin/bash
      echo "Applying configuration package upgrades..."
      apt-get dist-upgrade -y
      # Terminate with return code 3010 to trigger a system reboot
      exit 3010
- name: "Post-reboot verification"
  action: Shell
  inputs:
    command: "uname -r"

Acción UpdateKernelCommandLine

La acción UpdateKernelCommandLine ubica, reemplaza, inserta o quita marcas de línea de comandos que se pasan al kernel durante el inicio del sistema, por ejemplo, cuando configuras registros de la consola o ajustas parámetros del kernel.

Especifica las siguientes propiedades en el mapa steps.inputs:

  • oldArguments (cadena, obligatorio): Son los argumentos exactos de la línea de comandos para ubicar, quitar o reemplazar dentro de la configuración del bootloader.
  • newArguments (cadena, opcional): Son los argumentos de reemplazo que se escribirán en lugar de las marcas de destino. Si omites la propiedad newArguments, Image Builder quitará por completo los parámetros configurados en la propiedad oldArguments de la línea de arranque.

Configuraciones de muestra

En las siguientes pestañas, se muestran ejemplos de configuraciones de pasos para reemplazar o quitar argumentos de arranque del kernel:

Reemplaza los argumentos de arranque

La siguiente configuración ubica la clave del nivel de registro del kernel loglevel=4 y la reemplaza por parámetros más detallados loglevel=6 console=ttyS0:

- name: "Configure detailed boot logging"
  action: UpdateKernelCommandLine
  inputs:
    oldArguments: "loglevel=4"
    newArguments: "loglevel=6 console=ttyS0"

Cómo quitar argumentos de arranque

La siguiente configuración busca el parámetro quiet y lo quita de los argumentos de arranque para habilitar el registro detallado durante las fases de verificación de inicio:

- name: "Enable verbose startup diagnostics"
  action: UpdateKernelCommandLine
  inputs:
    oldArguments: "quiet"

Detalles de ejecución específicos del SO

En las siguientes pestañas, se describe cómo el aprovisionador de personalización controla las modificaciones de imágenes según el sistema operativo invitado de origen:

Container-Optimized OS (COS)

Debido a que COS cuenta con un diseño de partición de solo lectura, omite las herramientas de configuración estándar. El aprovisionador de personalización hace lo siguiente:

  1. Determina la ruta de acceso del dispositivo de arranque activo.
  2. Se monta la partición 12, la partición EFI, del dispositivo de inicio.
  3. Actualiza directamente los parámetros del bootloader dentro de /efi/boot/grub.cfg.
  4. Desmonta de forma segura la partición 12.

Ubuntu

En las imágenes de Ubuntu, el aprovisionador de personalización hace lo siguiente:

  1. Abre /etc/default/grub y los archivos en /etc/default/grub.d/*.cfg.
  2. Inserta, modifica o borra los argumentos de destino en el bloque GRUB_CMDLINE_LINUX.
  3. Ejecuta el comando del paquete update-grub para regenerar las configuraciones del cargador de arranque.

Acción FileCopy

La acción FileCopy copia archivos de configuración, archivos binarios o certificados desde un bucket remoto o tu repositorio local a tu imagen personalizada. El aprovisionador de personalización descarga o lee el archivo fuente, lo escribe en la ruta de acceso del invitado que especificaste en la VM de trabajador y configura los permisos.

Especifica las siguientes entradas en steps.inputs:

  • destination (cadena, obligatorio): Es la ruta de acceso absoluta en el SO invitado donde se crea el archivo.
  • permissions (cadena, obligatorio): Es la representación octal de los permisos de configuración de destino, como "0755" o "0644".
  • Especifica cualquiera de las siguientes propiedades de la fuente:
    • gcsSourcePath (cadena): Es el URI de Cloud Storage del archivo fuente, que debe seguir el formato gs://BUCKET_NAME/OBJECT_NAME.
    • localSourcePath (cadena): Es la ruta relativa al archivo dentro de la carpeta del repositorio del espacio de trabajo local. El salto de directorio con ../ está bloqueado por motivos de seguridad.

Configuraciones de muestra

En las siguientes pestañas, se muestran ejemplos de configuraciones de pasos para copiar un archivo desde Cloud Storage y desde tu espacio de trabajo local:

Cloud Storage

La siguiente configuración copia una plantilla de configuración de un bucket de Cloud Storage en la imagen de VM invitada:

- name: "Import licensing configuration"
  action: FileCopy
  inputs:
    gcsSourcePath: "gs://enterprise-configs-bucket/licensing/license.key"
    destination: "/etc/app/license.key"
    permissions: "0600"

Espacio de trabajo local

La siguiente configuración copia un script de aplicación compilado durante los pasos anteriores de Cloud Build:

- name: "Deploy setup automation daemon"
  action: FileCopy
  inputs:
    localSourcePath: "bin/setup-daemon"
    destination: "/usr/local/bin/setup-daemon"
    permissions: "0755"

Lineamientos específicos del SO

En las siguientes pestañas, se describen los lineamientos para la ubicación de archivos según el sistema operativo invitado de destino:

Container-Optimized OS (COS)

Las imágenes de COS contienen un diseño de partición de solo lectura por motivos de seguridad. Algunos destinos del sistema estándar, como /usr/ o /bin/, están protegidos contra escritura.

Cuando configures destinos de archivos en COS, ten en cuenta lo siguiente:

Ubuntu

Las imágenes de Ubuntu incluyen un diseño de partición raíz de lectura y escritura de Linux estándar (/). Puedes especificar destinos de archivos dentro de cualquier ruta del sistema estándar, como /etc, /usr/local/bin, /var o /home, siempre que el perfil del usuario o la carpeta de destino tengan los permisos de configuración adecuados en la VM de trabajador.

Acción InstallGPU

Usa la acción InstallGPU para compilar imágenes de VM optimizadas para cargas de trabajo de aprendizaje automático, ciencia de datos o científicas. Image Builder descarga, compila y registra los controladores de GPU de NVIDIA en tus imágenes personalizadas. Según el tipo de imagen base y el hardware de destino, puedes elegir entre instalar controladores precompilados o compilar archivos .run de controladores personalizados.

Especifica una de las siguientes entradas en steps.inputs:

  • version (cadena): Es el número de versión del controlador NVIDIA de destino, como "595.129.03". Si solo especificas version, el orquestador descargará el controlador del repositorio oficial de NVIDIA (https://us.download.nvidia.com/tesla/<version>).
  • gcsRunfile (cadena): Es la ruta de acceso de Cloud Storage a un archivo de instalación personalizado del controlador NVIDIA, que debe usar el formato gs://BUCKET_NAME/OBJECT_NAME.run.
  • sourceRunfile (cadena): Es la ruta relativa a un archivo de instalación .run dentro de la carpeta del repositorio del espacio de trabajo local.

Configuraciones de muestra

En las siguientes pestañas, se muestran ejemplos de configuraciones de pasos para instalar una versión específica del controlador preempaquetado en comparación con la instalación de un archivo ejecutable personalizado:

Descarga de la versión estándar

La siguiente configuración descarga e instala una versión especificada del controlador NVIDIA desde el repositorio oficial:

- name: "Configure default NVIDIA drivers"
  action: InstallGPU
  inputs:
    version: "<var>DRIVER_VERSION</var>"

Archivo ejecutable de Cloud Storage

La siguiente configuración implementa un instalador personalizado del controlador de NVIDIA .run directamente desde un bucket de Cloud Storage:

- name: "Deploy custom GPU driver from Cloud Storage"
  action: InstallGPU
  inputs:
    gcsRunfile: "gs://<var>BUCKET_NAME</var>/drivers/NVIDIA-Linux-aarch64-<var>DRIVER_VERSION</var>.run"

Archivo ejecutable del espacio de trabajo local

La siguiente configuración implementa un instalador personalizado del controlador NVIDIA .run desde el espacio de trabajo del repositorio local:

- name: "Deploy custom GPU driver from workspace"
  action: InstallGPU
  inputs:
    sourceRunfile: "drivers/NVIDIA-Linux-x86_64-<var>DRIVER_VERSION</var>.run"

Métodos de configuración

En las siguientes pestañas, se describen los métodos admitidos para configurar los controladores de GPU de NVIDIA en tus imágenes personalizadas:

Controladores precompilados

Te recomendamos que uses versiones de controladores preempaquetados para evitar la sobrecarga de procesamiento y el tiempo de compilación de los controladores desde cero.

  • Container-Optimized OS (COS): Si especificas una versión del controlador preempaquetada por Google, el aprovisionador de personalización ejecuta la herramienta para invitados cos-extensions install gpu para activarla.

    Para ver la lista de versiones de controladores precompilados compatibles con tu versión de COS, ejecuta sudo cos-extensions list en una instancia de COS en ejecución o consulta Cómo identificar la versión del controlador de GPU.

  • Ubuntu: Para ahorrar tiempo de compilación en Ubuntu, te recomendamos que selecciones imágenes base preconfiguradas del proyecto público ubuntu-os-accelerator-images en el que los controladores de NVIDIA ya están preinstalados.

    Para enumerar las imágenes de aceleradores disponibles, ejecuta el siguiente comando en la CLI de gcloud:

    gcloud compute images list \
        --project=ubuntu-os-accelerator-images \
        --no-standard-images
    

Archivos de ejecución personalizados

Si debes instalar una versión personalizada del controlador que no está precompilada por Google o Canonical, puedes especificar archivos ejecutables del instalador directo para la compilación de la siguiente manera:

  • Ubuntu: Realiza la compilación en el huésped. El aprovisionador de personalización instala automáticamente los encabezados del kernel correspondientes (linux-headers-$(uname -r)), compila el archivo .run del controlador de NVIDIA en la VM de trabajador y lo registra con la compatibilidad con el módulo de kernel dinámico (DKMS). Registrarse en DKMS garantiza que los controladores permanezcan activos en las actualizaciones secundarias del kernel.
  • Container-Optimized OS (COS): El comportamiento de compilación varía según la arquitectura de la CPU de la imagen de VM base de origen:
    • Imágenes de ARM64: Debido a que las VMs de COS de ARM64 no admiten la compilación de encabezados en el huésped, Image Builder realiza automáticamente la compilación cruzada de la utilidad .run de tu controlador personalizado dentro del contenedor de compilación y, luego, instala el paquete resultante en /var/lib/nvidia en la VM de trabajador.
    • Imágenes x86-64: Realiza la compilación en el invitado directamente en la VM de trabajador.

¿Qué sigue?