Startskript
os.startup_scripts skapar avgränsat systemd one-shot-arbete för resulterande avbild. Varje post deklarerar ett shell-kommando, nödvändiga paket, körningsanvändare och ordningsenhet.
Startskript är root-kapabel kod om inte run_as säger annat. De måste få samma granskning som vilket installationsskript som helst.
Kanonisk form
{
"os": {
"startup_scripts": [
{
"name": "write-build-marker",
"description": "Create a local readiness marker after networking is available.",
"command": "set -Eeuo pipefail\ninstall -d -m 0755 /var/lib/example\nprintf '%s\\n' ready > /var/lib/example/build-ready",
"packages": [],
"run_as": "root",
"after": "network-online.target"
}
]
}
}Fälten är description och command, inte det äldre fältet script. run_as och after använder också snake_case. after är en systemd-enhetssträng, inte en array.
Schemat accepterar högst 32 poster och en avgränsad kommandostorlek. Validering avvisar tomma kommandon och NUL-bytes, men gör inte skalinnehåll säkert eller idempotent.
Design för omförsök och partiella fel
En boot kan avbrytas efter att vissa sidoeffekter redan inträffat. Skriv skript så att ett nytt anrop antingen slutförs säkert eller avslutas med ett tydligt, inspecterbart tillstånd.
Bra mönster:
- skriv till temporär fil, verifiera, byt namn atomiskt;
- kontrollera om användare, kataloger eller konfigurationsposter redan finns;
- använd
installför explicit ägare och mode; - tillämpa
set -Eeuo pipefailoch hantera förväntade icke-noll-resultat medvetet; - avgränsade nätverks-timeouts och ett ändligt antal omförsök; och
- skriv readiness marker först när alla obligatoriska steg lyckats.
Lita inte på sleep som readiness-check. Prova den faktiska beroendet.
Externa nedladdningar
Undvik curl ... | sh. Om first boot måste hämta en artefakt:
- använd HTTPS med certifikatverifiering;
- pinna förväntad artefakt eller källversion;
- verifiera kryptografisk digest eller godkänd signatur före körning;
- sätt connect- och total-timeouts;
- fail closed om verifiering misslyckas; och
- logga inte credentials eller signerade URL:er.
För verkligen offline eller reproducerbart beteende, lägg granskat innehåll i avbilden eller ett godkänt package repository i stället för att ladda ned vid first boot.
Hemligheter
Bädda aldrig in credentials i klartext i recept, kommando, URL eller genererad marker. Recept-JSON och buildloggar sparas som evidence och kan vara synliga för operatörer. Använd godkänd enrollment eller secret-delivery vid deployment och begränsa resulterande credential till målet.
Körningsidentitet
Föredra ett obehörigt service account. Krävs root, begränsa kommandot till det minsta privilegierade steget och sätt explicit filägarskap. Bekräfta att run_as anger ett konto som skapats före enheten startar.
Verifiering
Testa utfall, inte bara enhetens exit-status:
{
"type": "file_contains",
"description": "The startup unit wrote its readiness marker.",
"params": {
"path": "/var/lib/example/build-ready",
"content": "ready"
}
}Testa också andra boot, otillgängligt beroende och återhämtning efter avbruten första körning. Inspektera systemctl status och enhetens journal vid fel.