Per personalizzare le immagini delle macchine virtuali, ad esempio eseguendo script del terminale,
aggiornando i parametri di avvio, trasferendo i file binari o installando i driver GPU, puoi
definire azioni helper specifiche all'interno del blocco spec.steps della tua
ricetta di personalizzazione (imagebuilder.yaml).
Panoramica
Durante la fase di esecuzione di una build di Image Builder, l'orchestratore esegue in sequenza i passaggi dichiarati nella ricetta di personalizzazione (spec.steps) sulla VM worker temporanea.
Ogni passaggio deve specificare un blocco name, un blocco action e un blocco inputs personalizzati in base
a quel tipo di azione. Image Builder supporta le seguenti
azioni di personalizzazione:
Shell: esegue script o comandi del terminale incorporati nel sistema operativo guest worker.UpdateKernelCommandLine: modifica i parametri di avvio e i flag della riga di comando del kernel.FileCopy: trasferisce file di configurazione, script o asset da Cloud Storage o spazi di lavoro locali alla VM.InstallGPU: scarica, compila e registra i driver della GPU NVIDIA.
Azione della shell
L'azione Shell ti consente di eseguire script del terminale incorporati o singoli comandi shell
sul sistema operativo guest della VM worker temporanea per eseguire personalizzazioni
come l'aggiornamento dei pacchetti, la configurazione degli account utente o la compilazione del software.
Specifica uno dei seguenti input in steps.inputs:
inlineScript(stringa): comandi shell multiriga non elaborati da eseguire.command(stringa): una singola stringa di comando di sistema o un percorso relativo a un file binario eseguibile.
Configurazioni di esempio
Le seguenti schede mostrano configurazioni di passaggi di esempio per l'esecuzione di uno script in linea rispetto all'esecuzione di un singolo comando:
Eseguire uno script incorporato
La seguente configurazione esegue uno script multiriga che aggiorna i pacchetti
utilizzando 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
Eseguire un singolo comando
La seguente configurazione esegue un singolo comando shell per verificare la versione kernel del sistema operativo attivo:
- name: "Log kernel identifier"
action: Shell
inputs:
command: "uname -a"
Comportamenti speciali
Quando esegui le azioni Shell, il provisioner di personalizzazione gestisce il controllo della sicurezza e i riavvii automatici del sistema come descritto nelle sezioni seguenti:
Audit di sicurezza
Per evitare che token sensibili, segreti o codice proprietario vengano divulgati nei log di esecuzione, il provisioner di personalizzazione non stampa le righe non elaborate degli script, a meno che non sia attivato il debug interattivo (debug: true). Al contrario, registra l'hash di integrità SHA-256 del payload dello script nei log di build. Questo hash fornisce una traccia di controllo immutabile di quale codice è stato eseguito sull'immagine.
Riavvii del sistema (codice di uscita 3010)
Alcune azioni della shell, come gli aggiornamenti delle patch del kernel o le modifiche alla partizione di archiviazione, richiedono un riavvio del sistema prima che possano essere eseguiti i passaggi successivi.
Per richiedere un riavvio del sistema durante la personalizzazione, lo script della shell deve terminare con
il comando exit 3010. Quando il provisioner di personalizzazione riceve il codice di uscita 3010,
gestisce il ciclo di vita del riavvio nel seguente modo:
- Il provisioner rileva il codice di uscita
3010, mette in pausa l'esecuzione e contrassegna l'indice di avanzamento del passaggio. - Il provisioner riavvia la VM worker.
- Dopo il riavvio della VM, il provisioner monta lo spazio di lavoro e riprende automaticamente la pipeline al passaggio successivo della coda.
Esempio di riavvio:
L'esempio seguente mostra una configurazione del passaggio che aggiorna i pacchetti e richiede un riavvio:
- 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"
Azione UpdateKernelCommandLine
L'azione UpdateKernelCommandLine individua, sostituisce, inserisce o rimuove
i flag della riga di comando passati al kernel all'avvio del sistema, ad esempio quando
configuri i log della console o modifichi i parametri del kernel.
Specifica le seguenti proprietà nella mappa steps.inputs:
oldArguments(stringa, obbligatorio): gli argomenti della riga di comando esatti per individuare, rimuovere o sostituire all'interno della configurazione del bootloader.newArguments(stringa, facoltativo): gli argomenti di sostituzione da scrivere al posto dei flag di destinazione. Se ometti la proprietànewArguments, Image Builder rimuove completamente i parametri configurati nella proprietàoldArgumentsdalla riga di avvio.
Configurazioni di esempio
Le seguenti schede mostrano configurazioni di passaggi di esempio per la sostituzione o la rimozione degli argomenti di avvio del kernel:
Sostituisci gli argomenti di avvio
La seguente configurazione individua la chiave del livello di log del kernel loglevel=4
e la sostituisce con parametri più dettagliati loglevel=6 console=ttyS0:
- name: "Configure detailed boot logging"
action: UpdateKernelCommandLine
inputs:
oldArguments: "loglevel=4"
newArguments: "loglevel=6 console=ttyS0"
Rimuovere gli argomenti di avvio
La seguente configurazione cerca il parametro quiet e lo rimuove
dagli argomenti di avvio per attivare la registrazione dettagliata durante le fasi di controllo
dell'avvio:
- name: "Enable verbose startup diagnostics"
action: UpdateKernelCommandLine
inputs:
oldArguments: "quiet"
Dettagli di esecuzione specifici del sistema operativo
Le seguenti schede descrivono come il provisioner di personalizzazione gestisce le modifiche alle immagini a seconda del sistema operativo guest di origine:
Container-Optimized OS (COS)
Poiché COS presenta un layout di partizione di sola lettura, omette gli strumenti di configurazione standard. Il provisioner di personalizzazione esegue le seguenti operazioni:
- Determina il percorso del dispositivo di avvio attivo.
- Monta la partizione 12, la partizione EFI, del dispositivo di avvio.
- Aggiorna direttamente i parametri del bootloader all'interno di
/efi/boot/grub.cfg. - Smonta in modo sicuro la partizione 12.
Ubuntu
Nelle immagini Ubuntu, il provisioner di personalizzazione esegue le seguenti operazioni:
- Apre
/etc/default/grube i file in/etc/default/grub.d/*.cfg. - Inserisce, modifica o elimina gli argomenti di destinazione nel blocco
GRUB_CMDLINE_LINUX. - Esegue il comando del pacchetto
update-grubper rigenerare le configurazioni del bootloader.
Azione FileCopy
L'azione FileCopy copia file di configurazione, file binari o certificati da
un bucket remoto o dal repository locale all'immagine personalizzata. Il provisioner di personalizzazione scarica o legge il file di origine, lo scrive nel percorso guest specificato nella VM worker e configura le autorizzazioni.
Specifica i seguenti input in steps.inputs:
destination(stringa, obbligatorio): il percorso assoluto nel sistema operativo guest in cui viene creato il file.permissions(stringa, obbligatorio): la rappresentazione ottale delle autorizzazioni di configurazione della destinazione, ad esempio"0755"o"0644".- Specifica una delle seguenti proprietà di origine:
gcsSourcePath(stringa): l'URI Cloud Storage del file di origine, che deve seguire il formatogs://BUCKET_NAME/OBJECT_NAME.localSourcePath(stringa): il percorso relativo del file all'interno della cartella del repository dello spazio di lavoro locale. Il path traversal che utilizza../è bloccato per motivi di sicurezza.
Configurazioni di esempio
Le seguenti schede mostrano configurazioni di passaggi di esempio per copiare un file da Cloud Storage rispetto alla copia dal tuo workspace locale:
Cloud Storage
La seguente configurazione copia un modello di configurazione da un bucket Cloud Storage nell'immagine VM guest:
- name: "Import licensing configuration"
action: FileCopy
inputs:
gcsSourcePath: "gs://enterprise-configs-bucket/licensing/license.key"
destination: "/etc/app/license.key"
permissions: "0600"
Area di lavoro locale
La seguente configurazione copia uno script dell'applicazione compilato durante i passaggi precedenti di Cloud Build:
- name: "Deploy setup automation daemon"
action: FileCopy
inputs:
localSourcePath: "bin/setup-daemon"
destination: "/usr/local/bin/setup-daemon"
permissions: "0755"
Linee guida specifiche per il sistema operativo
Le seguenti schede descrivono le linee guida per la posizione dei file a seconda del sistema operativo guest di destinazione:
Container-Optimized OS (COS)
Per motivi di sicurezza, le immagini COS contengono un layout di partizione di sola lettura. Alcuni
target di sistema standard, come /usr/ o /bin/, sono protetti dalla scrittura.
Quando configuri le destinazioni dei file su COS:
- Specifica i file solo all'interno di posizioni stateful scrivibili, ad esempio
/varo/home. - Consulta il riferimento ufficiale a dischi e file system di Container-Optimized OS per identificare i percorsi appropriati.
Ubuntu
Le immagini Ubuntu presentano un layout standard della partizione principale di lettura/scrittura di Linux (/).
Puoi specificare le destinazioni dei file all'interno di qualsiasi percorso di sistema standard, ad esempio
/etc, /usr/local/bin, /var o /home, a condizione che il profilo utente o
la cartella di destinazione disponga delle autorizzazioni di configurazione appropriate sulla VM worker.
Azione InstallGPU
Utilizza l'azione InstallGPU per creare immagini VM ottimizzate per il machine learning, la data science o i carichi di lavoro scientifici. Image Builder scarica, compila e registra i driver GPU NVIDIA sulle tue immagini personalizzate. A seconda del tipo di immagine di base e dell'hardware di destinazione, puoi scegliere tra l'installazione di driver precompilati o la compilazione di file .run di driver personalizzati.
Specifica uno dei seguenti input in steps.inputs:
version(stringa): il numero di versione del driver NVIDIA di destinazione, ad esempio"595.129.03". Se specifichi soloversion, l'orchestratore scarica il driver dal repository NVIDIA ufficiale (https://us.download.nvidia.com/tesla/<version>).gcsRunfile(stringa): il percorso Cloud Storage di un file di installazione del driver NVIDIA personalizzato, che deve utilizzare il formatogs://BUCKET_NAME/OBJECT_NAME.run.sourceRunfile(stringa): il percorso relativo di un file.rundi installazione all'interno della cartella del repository del workspace locale.
Configurazioni di esempio
Le seguenti schede mostrano configurazioni di passaggi di esempio per l'installazione di una versione specifica del driver precompilato rispetto all'installazione di un file eseguibile personalizzato:
Download della versione standard
La seguente configurazione scarica e installa una versione specificata del driver NVIDIA dal repository ufficiale:
- name: "Configure default NVIDIA drivers"
action: InstallGPU
inputs:
version: "<var>DRIVER_VERSION</var>"
File di esecuzione Cloud Storage
La seguente configurazione esegue il deployment di un programma di installazione del driver NVIDIA personalizzato .run direttamente da 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"
File di esecuzione dello spazio di lavoro locale
La seguente configurazione esegue il deployment di un programma di installazione personalizzato del driver NVIDIA .run dall'area di lavoro del repository locale:
- name: "Deploy custom GPU driver from workspace"
action: InstallGPU
inputs:
sourceRunfile: "drivers/NVIDIA-Linux-x86_64-<var>DRIVER_VERSION</var>.run"
Metodi di configurazione
Le seguenti schede descrivono i metodi supportati per configurare i driver della GPU NVIDIA nelle immagini personalizzate:
Driver precompilati
Ti consigliamo di utilizzare le versioni precompilate dei driver per evitare l'overhead di calcolo e il tempo di compilazione dei driver da zero.
Container-Optimized OS (COS): se specifichi una versione del driver pre-pacchettizzata da Google, il provisioner di personalizzazione esegue lo strumento guest
cos-extensions install gpuper attivarlo.Per visualizzare l'elenco delle versioni dei driver precompilati supportate per la tua release di COS, esegui
sudo cos-extensions listsu un'istanza COS in esecuzione o consulta Identificare la versione del driver GPU.Ubuntu: per ridurre il tempo di compilazione su Ubuntu, ti consigliamo di selezionare immagini di base preconfigurate dal progetto pubblico
ubuntu-os-accelerator-imagesin cui sono preinstallati i driver NVIDIA.Per elencare le immagini dell'acceleratore disponibili, esegui il seguente comando nell'interfaccia a riga di comando
gcloud:gcloud compute images list \ --project=ubuntu-os-accelerator-images \ --no-standard-images
File di esecuzione personalizzati
Se devi installare una versione del driver personalizzata non precompilata da Google o Canonical, puoi specificare i file di esecuzione dell'installer diretto per la compilazione nel seguente modo:
- Ubuntu: esegue la compilazione all'interno dell'immagine. Il provisioner di personalizzazione
installa automaticamente le intestazioni del kernel corrispondenti
(
linux-headers-$(uname -r)), compila il file del driver NVIDIA.runsulla VM worker e lo registra con Dynamic Kernel Module Support (DKMS). La registrazione con DKMS garantisce che i driver rimangano attivi anche dopo gli aggiornamenti minori del kernel. - Container-Optimized OS (COS): il comportamento di compilazione varia
a seconda dell'architettura della CPU dell'immagine VM di base di origine:
- Immagini ARM64: poiché le VM COS ARM64 non supportano la compilazione dell'intestazione in-guest, Image Builder esegue automaticamente la compilazione incrociata dell'utilità
.rundel driver personalizzato all'interno del container di build e installa il bundle risultante in/var/lib/nvidiasulla VM worker. - Immagini x86-64: esegue la compilazione in-guest direttamente sulla VM worker.
- Immagini ARM64: poiché le VM COS ARM64 non supportano la compilazione dell'intestazione in-guest, Image Builder esegue automaticamente la compilazione incrociata dell'utilità
Passaggi successivi
- Esamina i blocchi dello schema di primo livello nello schema del file di personalizzazione delle immagini.
- Configura i parametri di orchestrazione della pipeline nello schema del file di configurazione di Cloud Build.
- Segui il tutorial per creare una pipeline Image Builder.