Para personalizar las imágenes de tus máquina virtual, como ejecutar secuencias de comandos de terminal,
actualizar parámetros de arranque, transferir archivos binarios o instalar controladores de GPU, puedes
definir acciones auxiliares 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, action y inputs adaptado a ese tipo de acción. Image Builder admite las siguientes acciones de personalización:
Shell: Ejecuta secuencias de comandos o comandos de terminal intercalados en el SO invitado del trabajador.UpdateKernelCommandLine: Modifica los parámetros de arranque 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 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(string): Comandos de shell sin procesar de varias líneas para ejecutar.command(string): Una sola cadena de comandos del sistema o una ruta de acceso relativa a un archivo binario ejecutable.
Configuraciones de muestra
En las siguientes pestañas, se muestran configuraciones de pasos de muestra 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 una secuencia de comandos 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 Shell, el aprovisionador de personalización administra las auditorías 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 su lugar, registra el hash de integridad SHA-256 de tu carga útil de secuencia de comandos en los registros de compilación. Este hash proporciona un seguimiento de auditoría inmutable de exactamente qué código se ejecutó en la imagen.
Reinicios del sistema (código de salida 3010)
Algunas acciones de shell, como las actualizaciones de parches del kernel o los ajustes de partición 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 terminar con el comando exit 3010. Cuando el aprovisionador de personalización recibe el código de salida 3010, controla el ciclo de vida de 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 de UpdateKernelCommandLine
La acción UpdateKernelCommandLine ubica, reemplaza, inserta o quita las marcas de línea de comandos que se pasan al kernel en el arranque del sistema, como cuando configuras registros de consola o ajustas los parámetros del kernel.
Especifica las siguientes propiedades en el mapa steps.inputs:
oldArguments(string, obligatorio): Los argumentos exactos de la línea de comandos para ubicar, quitar o reemplazar dentro de la configuración del bootloader.newArguments(string, opcional): Los argumentos de reemplazo que se escribirán en lugar de las marcas de destino. Si omites la propiedadnewArguments, Image Builder quita por completo los parámetros configurados en laoldArgumentspropiedad de la línea de arranque.
Configuraciones de muestra
En las siguientes pestañas, se muestran configuraciones de pasos de muestra para reemplazar o quitar argumentos de arranque del kernel:
Reemplaza los argumentos de arranque
La siguiente configuración ubica la clave de 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"
Quita los 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.
- Activa la partición 12, la partición EFI, del dispositivo de arranque.
- Actualiza directamente los parámetros del bootloader dentro de
/efi/boot/grub.cfg. - Desactiva 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 de paquete
update-grubpara regenerar las configuraciones del bootloader.
Acción de FileCopy
La acción FileCopy copia archivos de configuración, archivos binarios o certificados de un bucket remoto o de tu repositorio local a tu imagen personalizada. El aprovisionador de personalización descarga o lee el archivo de origen, lo escribe en la ruta de acceso invitada especificada en la VM de trabajador y configura los permisos.
Especifica cualquiera de las siguientes entradas en steps.inputs:
destination(string, obligatorio): La ruta de acceso absoluta en el SO invitado donde se crea el archivo.permissions(string, obligatorio): La representación octal de los permisos de configuración de destino, como"0755"o"0644".- Especifica cualquiera de las siguientes propiedades de origen:
gcsSourcePath(string): El URI de Cloud Storage del archivo de origen, que debe seguir el formatogs://BUCKET_NAME/OBJECT_NAME.localSourcePath(string): La ruta de acceso relativa al archivo dentro de la carpeta del repositorio del espacio de trabajo local. El salto de directorio con../está bloqueado por seguridad.
Configuraciones de muestra
En las siguientes pestañas, se muestran configuraciones de pasos de muestra para copiar un archivo de Cloud Storage en comparación con la copia 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 una secuencia de comandos de aplicación compilada 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 de 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, haz 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 de acceso adecuadas.
Ubuntu
Las imágenes de Ubuntu cuentan con 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 de acceso del sistema estándar, como
/etc, /usr/local/bin, /var, o /home, siempre que el perfil de usuario o la
carpeta de destino tengan los permisos de configuración adecuados en la VM de trabajador.
Acción de 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 cualquiera de las siguientes entradas en steps.inputs:
version(string): El número de versión del controlador NVIDIA de destino, como"595.129.03". Si especificas soloversion, el orquestador descarga el controlador del repositorio oficial de NVIDIA (https://us.download.nvidia.com/tesla/<version>).gcsRunfile(string): La ruta de acceso de Cloud Storage de un archivo instalador de controlador NVIDIA personalizado, que debe usar el formatogs://BUCKET_NAME/OBJECT_NAME.run.sourceRunfile(string): La ruta de acceso relativa a un archivo.runinstalador dentro de la carpeta del repositorio del espacio de trabajo local.
Configuraciones de muestra
En las siguientes pestañas, se muestran configuraciones de pasos de muestra 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 del 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 .run de controlador NVIDIA personalizado 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 .run de controlador NVIDIA personalizado desde tu 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 invitada
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 Identifica 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 están preinstalados.Para mostrar una lista de las imágenes de acelerador disponibles, ejecuta el siguiente comando en la CLI de
gcloud:gcloud compute images list \ --project=ubuntu-os-accelerator-images \ --no-standard-images
Archivos ejecutables personalizados
Si debes instalar una versión de controlador personalizada que no esté precompilada por Google o Canonical, puedes especificar archivos ejecutables de instalador directos para la compilación de la siguiente manera:
- Ubuntu: Realiza la compilación en el invitado. El aprovisionador de personalización instala automáticamente los encabezados del kernel coincidentes (
linux-headers-$(uname -r)), compila el archivo.rundel controlador NVIDIA en la VM de trabajador y lo registra con la compatibilidad con módulos de kernel dinámicos (DKMS). El registro con DKMS garantiza que los controladores permanezcan activos en las actualizaciones menores 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 invitado, Image Builder compila automáticamente de forma cruzada
tu utilidad
.runde controlador personalizado dentro del contenedor de compilación y luego instala el paquete resultante en/var/lib/nvidiaen la VM de trabajador. - Imágenes de 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 invitado, Image Builder compila automáticamente de forma cruzada
tu 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 canalización en el esquema del archivo de configuración de compilación de Cloud Build.
- Sigue el instructivo para crear una canalización de Image Builder.