Wenn Sie Ihre VM-Images anpassen möchten, z. B. durch Ausführen von Terminalskripts,
Aktualisieren von Bootparametern, Übertragen von Binärdateien oder Installieren von GPU-Treibern, können Sie
bestimmte Hilfsaktionen im Block spec.steps Ihres
Anpassungsrezepts (imagebuilder.yaml) definieren.
Übersicht
Während der Ausführungsphase eines Image Builder-Builds führt der Orchestrator die in Ihrem Anpassungsrezept (spec.steps) deklarierten Schritte sequenziell auf der temporären Worker-VM aus.
Für jeden Schritt müssen ein name, eine action und ein inputs-Block angegeben werden, die auf den jeweiligen Aktionstyp zugeschnitten sind. Image Builder unterstützt die folgenden Anpassungsaktionen:
Shell: Führt Inline-Terminalskripts oder -Befehle auf dem Gastbetriebssystem des Workers aus.UpdateKernelCommandLine: Ändert Bootparameter und Befehlszeilen-Flags des Kernels.FileCopy: Überträgt Konfigurationsdateien, Skripts oder Assets aus Cloud Storage oder lokalen Arbeitsbereichen auf die VM.InstallGPU: Lädt NVIDIA-GPU-Treiber herunter, kompiliert sie und registriert sie.
Shell-Aktion
Mit der Aktion Shell können Sie Inline-Terminalskripts oder einzelne Shell-Befehle auf dem Gastbetriebssystem der temporären Worker-VM ausführen, um Anpassungen vorzunehmen, z. B. Pakete zu aktualisieren, Nutzerkonten zu konfigurieren oder Software zu kompilieren.
Geben Sie unter steps.inputs einen der folgenden Eingaben an:
inlineScript(String): Roh-Shell-Befehle mit mehreren Zeilen, die ausgeführt werden sollen.command(String): Eine einzelne Systembefehlszeile oder ein relativer Pfad zu einer ausführbaren Binärdatei.
Beispielkonfigurationen
Auf den folgenden Tabs finden Sie Beispielkonfigurationen für Schritte zum Ausführen eines Inline-Skripts im Vergleich zum Ausführen eines einzelnen Befehls:
Inline-Skript ausführen
Die folgende Konfiguration führt ein mehrzeiliges Skript aus, das Pakete mit apt aktualisiert:
- 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
Einzelnen Befehl ausführen
Die folgende Konfiguration führt einen einzelnen Shell-Befehl aus, um die aktive Betriebssystem-Kernel-Version zu prüfen:
- name: "Log kernel identifier"
action: Shell
inputs:
command: "uname -a"
Besonderes Verhalten
Wenn Sie Shell-Aktionen ausführen, verwaltet der Anpassungsbereitsteller die Sicherheitsprüfung und automatische Systemneustarts, wie in den folgenden Abschnitten beschrieben:
Sicherheitsprüfung
Damit keine vertraulichen Tokens, Secrets oder proprietären Codes in Ausführungsprotokolle gelangen, gibt der Anpassungsbereitsteller die Rohzeilen Ihrer Skripts nur aus, wenn das interaktive Debugging aktiviert ist (debug: true). Stattdessen protokolliert er den SHA-256-Integritätshash Ihrer Skriptnutzlast in den Build-Logs. Dieser Hash bietet einen unveränderlichen Audit-Trail, der genau zeigt, welcher Code auf dem Image ausgeführt wurde.
Systemneustarts (Exit-Code 3010)
Für einige Shell-Aktionen, z. B. Kernel-Patch-Updates oder Anpassungen der Speicherpartition, ist ein Systemneustart erforderlich, bevor nachfolgende Schritte ausgeführt werden können.
Wenn Sie während der Anpassung einen Systemneustart anfordern möchten, muss Ihr Shell-Skript mit dem Befehl exit 3010 enden. Wenn der Anpassungsbereitsteller den Exit-Code 3010 empfängt, wird der Neustartzyklus so gehandhabt:
- Der Bereitsteller erkennt den Exit-Code
3010, pausiert die Ausführung und markiert den Index des Schrittfortschritts. - Der Bereitsteller startet die Worker-VM neu.
- Nach dem Neustart der VM stellt der Bereitsteller den Arbeitsbereich bereit und setzt die Pipeline automatisch mit dem nächsten Schritt in der Warteschlange fort.
Beispiel für einen Neustart:
Das folgende Beispiel zeigt eine Schrittkonfiguration, die Pakete aktualisiert und einen Neustart anfordert:
- 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"
Aktion „UpdateKernelCommandLine“
Mit der Aktion UpdateKernelCommandLine können Sie Befehlszeilen-Flags suchen, ersetzen, einfügen oder entfernen, die beim Systemstart an den Kernel übergeben werden, z. B. wenn Sie Konsolenlogs konfigurieren oder Kernelparameter anpassen.
Geben Sie die folgenden Attribute in der Map steps.inputs an:
oldArguments(String, erforderlich): Die genauen Befehlszeilenargumente, die in der Bootloader-Konfiguration gesucht, entfernt oder ersetzt werden sollen.newArguments(String, optional): Die Ersatzargumente, die anstelle der Zielflags geschrieben werden sollen. Wenn Sie das AttributnewArgumentsweglassen, entfernt Image Builder die in der EigenschaftoldArgumentskonfigurierten Parameter vollständig aus der Bootzeile.
Beispielkonfigurationen
Auf den folgenden Tabs finden Sie Beispielkonfigurationen für Schritte zum Ersetzen oder Entfernen von Kernel-Bootargumenten:
Bootargumente ersetzen
Die folgende Konfiguration sucht den Kernel-Logebenen-Schlüssel loglevel=4 und ersetzt ihn durch ausführlichere Parameter loglevel=6 console=ttyS0:
- name: "Configure detailed boot logging"
action: UpdateKernelCommandLine
inputs:
oldArguments: "loglevel=4"
newArguments: "loglevel=6 console=ttyS0"
Bootargumente entfernen
Die folgende Konfiguration sucht nach dem Parameter quiet und entfernt ihn aus den Bootargumenten, um während der Startprüfungsphasen eine ausführliche Protokollierung zu aktivieren:
- name: "Enable verbose startup diagnostics"
action: UpdateKernelCommandLine
inputs:
oldArguments: "quiet"
Betriebssystemspezifische Ausführungsdetails
Auf den folgenden Tabs wird beschrieben, wie der Anpassungsbereitsteller Image-Änderungen je nach Quellgastbetriebssystem verarbeitet:
Container-Optimized OS (COS)
Da COS ein schreibgeschütztes Partitionsschema verwendet, werden keine Standardkonfigurationstools verwendet. Der Anpassungsbereitsteller führt folgende Schritte aus:
- Er bestimmt den aktiven Bootgerätpfad.
- Er stellt Partition 12, die EFI-Partition, des Bootgeräts bereit.
- Er aktualisiert die Bootloader-Parameter direkt in
/efi/boot/grub.cfg. - Er hebt die Bereitstellung von Partition 12 sicher auf.
Ubuntu
Bei Ubuntu-Images führt der Anpassungsbereitsteller folgende Schritte aus:
- Er öffnet
/etc/default/grubund Dateien unter/etc/default/grub.d/*.cfg. - Er fügt die Zielargumente unter dem Block
GRUB_CMDLINE_LINUXein, ändert sie oder löscht sie. - Er führt den Paketbefehl
update-grubaus, um die Bootloader-Konfigurationen neu zu generieren.
Aktion „FileCopy“
Mit der Aktion FileCopy können Sie Konfigurationsdateien, Binärdateien oder Zertifikate aus einem Remote-Bucket oder Ihrem lokalen Repository in Ihr benutzerdefiniertes Image kopieren. Der Anpassungsbereitsteller lädt die Quelldatei herunter oder liest sie, schreibt sie in den angegebenen Gastpfad auf der Worker-VM und konfiguriert die Berechtigungen.
Geben Sie unter steps.inputs die folgenden Eingaben an:
destination(String, erforderlich): Der absolute Pfad im Gastbetriebssystem, in dem die Datei erstellt wird.permissions(String, erforderlich): Die Oktaldarstellung der Ziel konfigurationsberechtigungen, z. B."0755"oder"0644".- Geben Sie eine der folgenden Quelleigenschaften an:
gcsSourcePath(String): Der Cloud Storage-URI der Quelldatei, die das Formatgs://BUCKET_NAME/OBJECT_NAMEhaben muss.localSourcePath(String): Der relative Pfad zur Datei im Ordner des lokalen Arbeitsbereichs-Repositorys. Path Traversal mit../ist aus Sicherheitsgründen blockiert.
Beispielkonfigurationen
Auf den folgenden Tabs finden Sie Beispielkonfigurationen für Schritte zum Kopieren einer Datei aus Cloud Storage im Vergleich zum Kopieren aus Ihrem lokalen Arbeitsbereich:
Cloud Storage
Die folgende Konfiguration kopiert eine Konfigurationsvorlage aus einem Cloud Storage-Bucket in das Gast-VM-Image:
- name: "Import licensing configuration"
action: FileCopy
inputs:
gcsSourcePath: "gs://enterprise-configs-bucket/licensing/license.key"
destination: "/etc/app/license.key"
permissions: "0600"
Lokaler Arbeitsbereich
Die folgende Konfiguration kopiert ein Anwendungsskript, das in vorherigen Cloud Build-Schritten kompiliert wurde:
- name: "Deploy setup automation daemon"
action: FileCopy
inputs:
localSourcePath: "bin/setup-daemon"
destination: "/usr/local/bin/setup-daemon"
permissions: "0755"
Betriebssystemspezifische Richtlinien
Auf den folgenden Tabs finden Sie Richtlinien für den Speicherort von Dateien je nach Zielgastbetriebssystem:
Container-Optimized OS (COS)
COS-Images enthalten aus Sicherheitsgründen ein schreibgeschütztes Partitionsschema. Einige Standardsystemziele wie /usr/ oder /bin/ sind schreibgeschützt.
Beim Konfigurieren von Dateizielen unter COS gilt Folgendes:
- Geben Sie Dateien nur an beschreibbaren zustandsorientierten Speicherorten an, z. B.
/varoder/home. - Geeignete Pfade finden Sie in der offiziellen Referenz zu Laufwerken und Dateisystemen von Container-Optimized OS.
Ubuntu
Ubuntu-Images verwenden ein standardmäßiges Linux-Partitionsschema für das Root-Verzeichnis mit Lese- und Schreibrechten (/).
Sie können Dateiziele in jedem Standardsystempfad angeben, z. B.
/etc, /usr/local/bin, /var, oder /home, sofern das Nutzerprofil oder der
Zielordner auf der Worker-VM die entsprechenden Konfigurationsberechtigungen hat.
Aktion „InstallGPU“
Mit der Aktion InstallGPU können Sie VM-Images erstellen, die für maschinelles Lernen, Data Science oder wissenschaftliche Arbeitslasten optimiert sind. Image Builder lädt NVIDIA-GPU-Treiber herunter, kompiliert sie und registriert sie in Ihren benutzerdefinierten Images. Je nach Basistyp des Images und Zielhardware können Sie vorkompilierte Treiber installieren oder benutzerdefinierte .run-Treiberdateien kompilieren.
Geben Sie unter steps.inputs eine der folgenden Eingaben an:
version(String): Die Zielversionsnummer des NVIDIA-Treibers, z. B."595.129.03". Wenn Sie nurversionangeben, lädt der Orchestrator den Treiber aus dem offiziellen NVIDIA-Repository (https://us.download.nvidia.com/tesla/<version>) herunter.gcsRunfile(String): Der Cloud Storage-Pfad einer benutzerdefinierten NVIDIA-Treiber installationsdatei, die das Formatgs://BUCKET_NAME/OBJECT_NAME.runhaben muss.sourceRunfile(String): Der relative Pfad zu einer Installationsdatei.runim Ordner des lokalen Arbeitsbereichs-Repositorys.
Beispielkonfigurationen
Auf den folgenden Tabs finden Sie Beispielkonfigurationen für Schritte zum Installieren einer bestimmten vorkonfigurierten Treiberversion im Vergleich zum Installieren einer benutzerdefinierten ausführbaren Datei:
Download der Standardversion
Die folgende Konfiguration lädt eine bestimmte NVIDIA-Treiber Version aus dem offiziellen Repository herunter und installiert sie:
- name: "Configure default NVIDIA drivers"
action: InstallGPU
inputs:
version: "<var>DRIVER_VERSION</var>"
Ausführbare Datei in Cloud Storage
Die folgende Konfiguration stellt ein benutzerdefiniertes NVIDIA-Treiberinstallationsprogramm .run direkt aus einem Cloud Storage-Bucket bereit:
- 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"
Ausführbare Datei im lokalen Arbeitsbereich
Die folgende Konfiguration stellt ein benutzerdefiniertes NVIDIA-Treiberinstallationsprogramm .run aus Ihrem lokalen Repository-Arbeitsbereich bereit:
- name: "Deploy custom GPU driver from workspace"
action: InstallGPU
inputs:
sourceRunfile: "drivers/NVIDIA-Linux-x86_64-<var>DRIVER_VERSION</var>.run"
Konfigurationsmethoden
Auf den folgenden Tabs werden die unterstützten Methoden zum Konfigurieren von NVIDIA-GPU-Treibern in Ihren benutzerdefinierten Images beschrieben:
Vorkompilierte Treiber
Wir empfehlen die Verwendung vorkonfigurierter Treiberversionen, um den Rechenaufwand und die Build-Zeit für die Kompilierung von Treibern von Grund auf zu vermeiden.
Container-Optimized OS (COS): Wenn Sie eine von Google vorkonfigurierte Treiberversion angeben, führt der Anpassungsbereitsteller das Gasttool
cos-extensions install gpuaus, um sie zu aktivieren.Die Liste der unterstützten vorkompilierten Treiberversionen für Ihren COS-Release finden Sie unter GPU-Treiberversion ermitteln oder indem Sie
sudo cos-extensions listauf einer aktiven COS-Instanz ausführen.Ubuntu: Um die Build-Zeit unter Ubuntu zu verkürzen, empfehlen wir, vorkonfigurierte Basis-Images aus dem öffentlichen
ubuntu-os-accelerator-imagesProjekt auszuwählen, in dem NVIDIA-Treiber vorinstalliert sind.Führen Sie den folgenden Befehl in der
gcloudCLI aus, um die verfügbaren Beschleuniger-Images aufzulisten:gcloud compute images list \ --project=ubuntu-os-accelerator-images \ --no-standard-images
Benutzerdefinierte ausführbare Dateien
Wenn Sie eine benutzerdefinierte Treiberversion installieren müssen, die nicht von Google oder Canonical vorkompiliert wurde, können Sie direkte ausführbare Installationsdateien für die Kompilierung angeben:
- Ubuntu: Führt die Kompilierung im Gastbetriebssystem aus. Der Anpassungsbereitsteller installiert automatisch die passenden Kernel-Header (
linux-headers-$(uname -r)), kompiliert die.run-Datei des NVIDIA-Treibers auf der Worker-VM und registriert sie mit Dynamic Kernel Module Support (DKMS). Durch die Registrierung bei DKMS bleiben die Treiber auch bei kleineren Kernel-Updates aktiv. - Container-Optimized OS (COS): Das Kompilierungsverhalten variiert
je nach CPU-Architektur Ihres Quellbasis-VM-Images:
- ARM64-Images: Da ARM64-COS-VMs die Header-Kompilierung im Gastbetriebssystem nicht unterstützen, führt Image Builder automatisch eine Cross-Kompilierung Ihres benutzerdefinierten Treibers
.runDienstprogramms im Build-Container durch und installiert das resultierende Bundle in/var/lib/nvidiaauf der Worker-VM. - x86-64 Images: Führt die Kompilierung im Gastbetriebssystem direkt auf der Worker-VM aus.
- ARM64-Images: Da ARM64-COS-VMs die Header-Kompilierung im Gastbetriebssystem nicht unterstützen, führt Image Builder automatisch eine Cross-Kompilierung Ihres benutzerdefinierten Treibers
Nächste Schritte
- Überprüfen Sie die Schemablöcke der obersten Ebene im Schema der Image-Anpassungsdatei.
- Konfigurieren Sie die Parameter für die Pipeline-Orchestrierung im Schema der Cloud Build-Konfigurationsdatei.
- Folgen Sie der Anleitung zum Erstellen einer Image Builder-Pipeline.