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:
- El aprovisionador detecta el código de salida
3010, pausa la ejecución y marca el índice de progreso del paso. - El aprovisionador reinicia la VM de trabajador.
- 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 propiedadnewArguments, Image Builder quitará por completo los parámetros configurados en la propiedadoldArgumentsde 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:
- Determina la ruta de acceso del dispositivo de arranque activo.
- Se monta la partición 12, la partición EFI, del dispositivo de inicio.
- Actualiza directamente los parámetros del bootloader dentro de
/efi/boot/grub.cfg. - Desmonta de forma segura la partición 12.
Ubuntu
En las imágenes de Ubuntu, el aprovisionador de personalización hace lo siguiente:
- Abre
/etc/default/gruby los archivos en/etc/default/grub.d/*.cfg. - Inserta, modifica o borra los argumentos de destino en el bloque
GRUB_CMDLINE_LINUX. - Ejecuta el comando del paquete
update-grubpara 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 formatogs://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:
- Especifica archivos solo dentro de ubicaciones con estado de escritura, como
/varo/home. - Consulta la referencia oficial de discos y sistema de archivos de Container-Optimized OS para identificar las rutas adecuadas.
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 especificasversion, 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 formatogs://BUCKET_NAME/OBJECT_NAME.run.sourceRunfile(cadena): Es la ruta relativa a un archivo de instalación.rundentro 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 gpupara activarla.Para ver la lista de versiones de controladores precompilados compatibles con tu versión de COS, ejecuta
sudo cos-extensions listen 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-imagesen 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.rundel 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
.runde tu controlador personalizado dentro del contenedor de compilación y, luego, instala el paquete resultante en/var/lib/nvidiaen la VM de trabajador. - Imágenes x86-64: Realiza la compilación en el invitado directamente en la VM de trabajador.
- 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
¿Qué sigue?
- Revisa los bloques de esquema de nivel superior en el esquema del archivo de personalización de imágenes.
- Configura los parámetros de orquestación de la canalización en el esquema del archivo de configuración de Cloud Build.
- Sigue el instructivo para crear una canalización de Image Builder.