Pour personnaliser vos images de machines virtuelles (par exemple, en exécutant des scripts de terminal, en mettant à jour les paramètres de démarrage, en transférant des binaires ou en installant des pilotes de GPU), vous pouvez définir des actions d'assistance spécifiques dans le bloc spec.steps de votre recette de personnalisation (imagebuilder.yaml).
Présentation
Pendant la phase d'exécution d'une compilation Image Builder, l'orchestrateur exécute séquentiellement les étapes déclarées dans votre recette de personnalisation (spec.steps) sur la VM de nœud de calcul temporaire.
Chaque étape doit spécifier un bloc name, un bloc action et un bloc inputs adaptés à ce type d'action. Image Builder est compatible avec les actions de personnalisation suivantes :
Shell: exécute des scripts ou des commandes de terminal intégrés sur l'OS invité du worker.UpdateKernelCommandLine: modifie les paramètres de démarrage et les flags de ligne de commande du noyau.FileCopy: transfère les fichiers de configuration, les scripts ou les composants depuis Cloud Storage ou des espaces de travail locaux vers la VM.InstallGPU: télécharge, compile et enregistre les pilotes de GPU NVIDIA.
Action du shell
L'action Shell vous permet d'exécuter des scripts de terminal intégrés ou des commandes shell uniques sur l'OS invité de la VM de nœud de calcul temporaire pour effectuer des personnalisations telles que la mise à jour de packages, la configuration de comptes utilisateur ou la compilation de logiciels.
Spécifiez l'une des entrées suivantes sous steps.inputs :
inlineScript(chaîne) : commandes shell brutes multilignes à exécuter.command(chaîne) : chaîne de commande système unique ou chemin d'accès relatif à un fichier binaire exécutable.
Exemples de configurations
Les onglets suivants présentent des exemples de configurations d'étapes pour exécuter un script intégré ou une seule commande :
Exécuter un script intégré
La configuration suivante exécute un script multiligne qui met à jour les packages à l'aide de 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
Exécuter une seule commande
La configuration suivante exécute une seule commande shell pour vérifier la version du noyau du système d'exploitation actif :
- name: "Log kernel identifier"
action: Shell
inputs:
command: "uname -a"
Comportements spéciaux
Lorsque vous exécutez des actions Shell, le provisionneur de personnalisation gère l'audit de sécurité et les redémarrages système automatisés, comme décrit dans les sections suivantes :
Audits de sécurité
Pour éviter que des jetons, des secrets ou du code propriétaire sensibles ne soient divulgués dans les journaux d'exécution, le provisionneur de personnalisation n'imprime pas les lignes brutes de vos scripts, sauf si le débogage interactif est activé (debug: true). Au lieu de cela, il enregistre le hachage d'intégrité SHA-256 de la charge utile de votre script dans les journaux de compilation. Ce hachage fournit une trace d'audit immuable du code exécuté sur l'image.
Redémarrages du système (code d'erreur 3010)
Certaines actions shell, telles que les mises à jour des correctifs du noyau ou les ajustements des partitions de stockage, nécessitent un redémarrage du système avant que les étapes suivantes puissent s'exécuter.
Pour demander un redémarrage du système lors de la personnalisation, votre script shell doit se terminer par la commande exit 3010. Lorsque le provisionneur de personnalisation reçoit le code de sortie 3010, il gère le cycle de vie du redémarrage comme suit :
- Le provisionneur détecte le code de sortie
3010, met l'exécution en pause et marque l'index de progression de l'étape. - Le provisionneur redémarre la VM de nœud de calcul.
- Une fois la VM redémarrée, le provisionneur monte l'espace de travail et reprend automatiquement le pipeline à l'étape suivante de la file d'attente.
Exemple de redémarrage :
L'exemple suivant montre une configuration d'étape qui met à jour les packages et demande un redémarrage :
- 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"
Action UpdateKernelCommandLine
L'action UpdateKernelCommandLine permet de localiser, de remplacer, d'insérer ou de supprimer des indicateurs de ligne de commande transmis au noyau au démarrage du système, par exemple lorsque vous configurez les journaux de la console ou ajustez les paramètres du noyau.
Spécifiez les propriétés suivantes dans la carte steps.inputs :
oldArguments(chaîne, obligatoire) : arguments de ligne de commande exacts pour localiser, supprimer ou remplacer dans la configuration du bootloader.newArguments(chaîne, facultatif) : arguments de remplacement à écrire à la place des indicateurs cibles. Si vous omettez la propriéténewArguments, Image Builder supprime entièrement les paramètres configurés dans la propriétéoldArgumentsde la ligne de démarrage.
Exemples de configurations
Les onglets suivants présentent des exemples de configurations d'étapes pour remplacer ou supprimer des arguments de démarrage du noyau :
Remplacer les arguments de démarrage
La configuration suivante localise la clé de niveau de journal du noyau loglevel=4 et la remplace par des paramètres plus détaillés loglevel=6 console=ttyS0 :
- name: "Configure detailed boot logging"
action: UpdateKernelCommandLine
inputs:
oldArguments: "loglevel=4"
newArguments: "loglevel=6 console=ttyS0"
Supprimer les arguments de démarrage
La configuration suivante recherche le paramètre quiet et le supprime des arguments de démarrage pour activer la journalisation détaillée lors des phases de vérification du démarrage :
- name: "Enable verbose startup diagnostics"
action: UpdateKernelCommandLine
inputs:
oldArguments: "quiet"
Détails d'exécution spécifiques à l'OS
Les onglets suivants décrivent comment le provisionneur de personnalisation gère les modifications d'image en fonction du système d'exploitation invité source :
Container-Optimized OS (COS)
Étant donné que COS dispose d'une mise en page de partition en lecture seule, il omet les outils de configuration standards. L'approvisionneur de personnalisation effectue les opérations suivantes :
- Détermine le chemin d'accès au périphérique de démarrage actif.
- Monte la partition 12, la partition EFI, du périphérique de démarrage.
- Met à jour directement les paramètres du bootloader dans
/efi/boot/grub.cfg. - Démonte la partition 12 de manière sécurisée.
Ubuntu
Sur les images Ubuntu, l'approvisionneur de personnalisation effectue les opérations suivantes :
- Ouvre
/etc/default/grubet les fichiers sous/etc/default/grub.d/*.cfg. - Insère, modifie ou supprime les arguments cibles sous le bloc
GRUB_CMDLINE_LINUX. - Exécute la commande de package
update-grubpour régénérer les configurations du bootloader.
Action FileCopy
L'action FileCopy copie les fichiers de configuration, les binaires ou les certificats d'un bucket distant ou de votre dépôt local vers votre image personnalisée. Le provisionneur de personnalisation télécharge ou lit le fichier source, l'écrit dans le chemin d'accès invité que vous avez spécifié sur la VM de nœud de calcul et configure les autorisations.
Spécifiez les entrées suivantes sous steps.inputs :
destination(chaîne, obligatoire) : chemin absolu dans l'OS invité où le fichier est créé.permissions(chaîne, obligatoire) : représentation octale des autorisations de configuration cibles, telles que"0755"ou"0644".- Spécifiez l'une des propriétés de source suivantes :
gcsSourcePath(chaîne) : URI Cloud Storage du fichier source, qui doit respecter le formatgs://BUCKET_NAME/OBJECT_NAME.localSourcePath(chaîne) : chemin d'accès relatif au fichier dans le dossier du dépôt de l'espace de travail local. La traversée de répertoire à l'aide de../est bloquée pour des raisons de sécurité.
Exemples de configurations
Les onglets suivants présentent des exemples de configurations d'étapes pour copier un fichier depuis Cloud Storage ou depuis votre espace de travail local :
Cloud Storage
La configuration suivante copie un modèle de configuration depuis un bucket Cloud Storage vers l'image de VM invitée :
- name: "Import licensing configuration"
action: FileCopy
inputs:
gcsSourcePath: "gs://enterprise-configs-bucket/licensing/license.key"
destination: "/etc/app/license.key"
permissions: "0600"
Espace de travail local
La configuration suivante copie un script d'application compilé lors des étapes Cloud Build précédentes :
- name: "Deploy setup automation daemon"
action: FileCopy
inputs:
localSourcePath: "bin/setup-daemon"
destination: "/usr/local/bin/setup-daemon"
permissions: "0755"
Consignes spécifiques à l'OS
Les onglets suivants décrivent les consignes concernant l'emplacement des fichiers en fonction du système d'exploitation invité cible :
Container-Optimized OS (COS)
Les images COS contiennent une mise en page de partition en lecture seule pour des raisons de sécurité. Certaines cibles système standards, telles que /usr/ ou /bin/, sont protégées en écriture.
Lorsque vous configurez des destinations de fichiers sur COS :
- Spécifiez les fichiers uniquement dans des emplacements avec état accessibles en écriture, tels que
/varou/home. - Consultez la documentation officielle sur les disques et le système de fichiers de Container-Optimized OS pour identifier les chemins d'accès appropriés.
Ubuntu
Les images Ubuntu présentent une disposition standard de partition racine Linux en lecture/écriture (/). Vous pouvez spécifier des destinations de fichiers dans n'importe quel chemin d'accès système standard, tel que /etc, /usr/local/bin, /var ou /home, à condition que le profil utilisateur ou le dossier de destination disposent des autorisations de configuration appropriées sur la VM de nœud de calcul.
Action InstallGPU
Utilisez l'action InstallGPU pour créer des images de VM optimisées pour les charges de travail de machine learning, de data science ou scientifiques. Image Builder télécharge, compile et enregistre les pilotes de GPU NVIDIA sur vos images personnalisées. Selon le type d'image de base et le matériel cible, vous pouvez choisir d'installer des pilotes précompilés ou de compiler des fichiers .run de pilote personnalisé.
Spécifiez l'une des entrées suivantes sous steps.inputs :
version(chaîne) : numéro de version du pilote NVIDIA cible, tel que"595.129.03". Si vous ne spécifiez queversion, l'orchestrateur télécharge le pilote à partir du dépôt NVIDIA officiel (https://us.download.nvidia.com/tesla/<version>).gcsRunfile(chaîne) : chemin d'accès Cloud Storage d'un fichier d'installation de pilote NVIDIA personnalisé, qui doit utiliser le formatgs://BUCKET_NAME/OBJECT_NAME.run.sourceRunfile(chaîne) : chemin d'accès relatif à un fichier.rund'installation dans le dossier du dépôt de l'espace de travail local.
Exemples de configurations
Les onglets suivants présentent des exemples de configurations d'étapes pour l'installation d'une version spécifique de pilote préconfiguré par rapport à l'installation d'un fichier .run personnalisé :
Télécharger la version standard
La configuration suivante télécharge et installe une version spécifique du pilote NVIDIA à partir du dépôt officiel :
- name: "Configure default NVIDIA drivers"
action: InstallGPU
inputs:
version: "<var>DRIVER_VERSION</var>"
Fichier d'exécution Cloud Storage
La configuration suivante déploie un programme d'installation de pilote NVIDIA personnalisé .run directement à partir d'un bucket 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"
Fichier d'exécution de l'espace de travail local
La configuration suivante déploie un programme d'installation de pilote NVIDIA personnalisé .run à partir de l'espace de travail de votre dépôt local :
- name: "Deploy custom GPU driver from workspace"
action: InstallGPU
inputs:
sourceRunfile: "drivers/NVIDIA-Linux-x86_64-<var>DRIVER_VERSION</var>.run"
Méthodes de configuration
Les onglets suivants décrivent les méthodes compatibles pour configurer les pilotes de GPU NVIDIA sur vos images personnalisées :
Pilotes précompilés
Nous vous recommandons d'utiliser des versions de pilotes pré-emballées pour éviter la surcharge de calcul et le temps de compilation des pilotes à partir de zéro.
Container-Optimized OS (COS) : si vous spécifiez une version de pilote pré-packagée par Google, le provisionneur de personnalisation exécute l'outil invité
cos-extensions install gpupour l'activer.Pour afficher la liste des versions de pilotes précompilés compatibles avec votre version de COS, exécutez
sudo cos-extensions listsur une instance COS en cours d'exécution ou consultez Identifier la version du pilote de GPU.Ubuntu : pour gagner du temps de compilation sur Ubuntu, nous vous recommandons de sélectionner des images de base préconfigurées à partir du projet public
ubuntu-os-accelerator-images, où les pilotes NVIDIA sont préinstallés.Pour lister les images d'accélérateur disponibles, exécutez la commande suivante dans la CLI
gcloud:gcloud compute images list \ --project=ubuntu-os-accelerator-images \ --no-standard-images
Fichiers d'exécution personnalisés
Si vous devez installer une version de pilote personnalisée qui n'est pas précompilée par Google ou Canonical, vous pouvez spécifier des fichiers d'exécution d'installation directe pour la compilation comme suit :
- Ubuntu : effectue la compilation dans le système invité. Le provisionneur de personnalisation installe automatiquement les en-têtes de noyau correspondants (
linux-headers-$(uname -r)), compile le fichier de pilote NVIDIA.runsur la VM de nœud de calcul et l'enregistre auprès de DKMS (Dynamic Kernel Module Support). L'enregistrement auprès de DKMS garantit que les pilotes restent actifs lors des mises à jour mineures du noyau. - Container-Optimized OS (COS) : le comportement de compilation varie en fonction de l'architecture du processeur de votre image de VM de base source :
- Images ARM64 : comme les VM COS ARM64 ne sont pas compatibles avec la compilation d'en-têtes dans le guest, Image Builder effectue automatiquement une compilation croisée de votre utilitaire de pilote personnalisé
.rundans le conteneur de compilation et installe le bundle résultant dans/var/lib/nvidiasur la VM de nœud de calcul. - Images x86-64 : effectue la compilation dans le guest directement sur la VM de nœud de calcul.
- Images ARM64 : comme les VM COS ARM64 ne sont pas compatibles avec la compilation d'en-têtes dans le guest, Image Builder effectue automatiquement une compilation croisée de votre utilitaire de pilote personnalisé
Étapes suivantes
- Consultez les blocs de schéma de premier niveau dans le schéma du fichier de personnalisation des images.
- Configurez les paramètres d'orchestration du pipeline dans le schéma du fichier de configuration de compilation Cloud Build.
- Suivez le tutoriel Créer un pipeline Image Builder.