Oppstartsskript
os.startup_scripts oppretter avgrenset systemd one-shot-arbeid for det resulterende imaget. Hver oppføring deklarerer shell-kommando, nødvendige pakker, kjøringsbruker og rekkefølge-enhet.
Oppstartsskript er root-kapabel kode med mindre run_as sier noe annet. De må få samme gjennomgang som ethvert installasjonsskript.
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"
}
]
}
}Feltene er description og command, ikke det eldre feltet script. run_as og after bruker også snake_case. after er én systemd-enhetsstreng, ikke en array.
Skjemaet aksepterer høyst 32 oppføringer og begrenset kommandostørrelse. Validering avviser tomme kommandoer og NUL-bytes, men gjør ikke shell-innhold trygt eller idempotent.
Design for retries og delvis feil
En boot kan avbrytes etter at noen sideeffekter allerede har skjedd. Skriv skript slik at et nytt kall enten fullfører trygt eller avslutter med en klar, inspiserbar tilstand.
Gode mønstre inkluderer:
- skriv til en midlertidig fil, verifiser, gi deretter atomisk nytt navn;
- sjekk om brukere, kataloger eller konfigurasjonsposter allerede finnes;
- bruk
installfor eksplisitt eier og mode; - bruk
set -Eeuo pipefailog håndter forventede nonzero-resultater bevisst; - avgrensede nettverkstimeouts og et endelig antall retries; og
- skriv readiness marker først etter at alle påkrevde trinn lykkes.
Stol ikke på sleep som readiness-check. Sjekk den faktiske avhengigheten.
Eksterne nedlastinger
Unngå curl ... | sh. Må first boot hente et artifact:
- bruk HTTPS med sertifikatverifisering;
- pin forventet artifact eller kildeversjon;
- verifiser kryptografisk digest eller godkjent signatur før kjøring;
- sett connect- og total-timeouts;
- fail closed hvis verifisering feiler; og
- unngå å logge credentials eller signerte URL-er.
For virkelig offline eller reproducerbar oppførsel, legg gjennomgått innhold i imaget eller et godkjent package repository i stedet for å laste ned ved first boot.
Hemmeligheter
Bygg aldri inn plaintext credentials i oppskrift, kommando, URL eller generert marker. Oppskrift-JSON og buildlogger lagres som evidence og kan være synlige for operatører. Bruk godkjent enrollment eller secret-delivery ved deployment og avgrens det resulterende credential til målet.
Kjøringsidentitet
Foretrekk en unprivileged service account. Kreves root, reduser kommandoen til det minste privilegerte trinnet og sett eksplisitt file ownership. Bekreft at run_as navngir en konto opprettet før enheten starter.
Verifisering
Test utfall, ikke bare enhetens exit-status:
{
"type": "file_contains",
"description": "The startup unit wrote its readiness marker.",
"params": {
"path": "/var/lib/example/build-ready",
"content": "ready"
}
}Test også andre boot, utilgjengelig avhengighet og gjenoppretting etter avbrutt første kjøring. Inspiser systemctl status og enhetens journal ved feil.