Skip to Content
Building OsStartskript

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 install för explicit ägare och mode;
  • tillämpa set -Eeuo pipefail och 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:

  1. använd HTTPS med certifikatverifiering;
  2. pinna förväntad artefakt eller källversion;
  3. verifiera kryptografisk digest eller godkänd signatur före körning;
  4. sätt connect- och total-timeouts;
  5. fail closed om verifiering misslyckas; och
  6. 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.