Skip to Content
Building OsZagoni skripti

Zagoni skripti

os.startup_scripts ustvari omejeno enkratno delo systemd za nastali image. Vsaka postavka deklarira shell ukaz, potrebne pakete, uporabnika za izvedbo in enoto za vrstni red.

Zagoni skripti so koda z root pravicami, razen če run_as določa drugače. Prejmejo enak pregled kot kateri koli namestitveni skript.

Kanonična oblika

{ "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" } ] } }

Polji sta description in command, ne zastarelo polje script. Tudi run_as in after uporabljata snake_case. after je en niz enote systemd, ne tabela.

Shema sprejme največ 32 postavk in omejeno velikost ukaza. Validacija zavrne prazne ukaze in bajte NUL, vendar ne naredi vsebine shella varne ali idempotentne.

Načrtovanje za ponovitve in delne napake

Zagon lahko prekine, ko so se že zgodili nekateri stranski učinki. Pišite skripte tako, da naslednja izvedba ali varno dokonča delo, ali konča z jasnim stanjem, ki ga lahko preverite.

Dobri vzorci vključujejo:

  • pisanje v začasno datoteko, preverjanje in atomično preimenovanje;
  • preverjanje, ali uporabniki, imeniki ali vnosi konfiguracije že obstajajo;
  • uporabo install za eksplicitnega lastnika in način;
  • uporabo set -Eeuo pipefail in namerno obravnavo pričakovanih neničelnih rezultatov;
  • omejene omrežne timeoute in končno število ponovitev; in
  • pisanje oznake pripravljenosti šele po uspehu vseh zahtevanih korakov.

Ne zanašajte se na sleep kot preverjanje pripravljenosti. Preverite dejansko odvisnost.

Zunanja prenos

Izogibajte se curl ... | sh. Če mora prvi zagon pridobiti artefakt:

  1. uporabite HTTPS z preverjanjem certifikata;
  2. pripnite pričakovani artefakt ali različico vira;
  3. pred izvedbo preverite kriptografski digest ali odobren podpis;
  4. nastavite timeoute za povezavo in skupni čas;
  5. ob neuspehu preverjanja končajte z napako; in
  6. ne zapisujte v dnevnik poverilnic ali podpisanih URL-jev.

Za res offline ali ponovljivo obnašanje vključite pregledano vsebino v image ali odobren repozitorij paketov namesto prenosa ob prvem zagonu.

Skrivnosti

Nikoli ne vgrajujte poverilnic v plaintextu v recept, ukaz, URL ali generirano oznako. JSON recepta in build dnevniki se hranijo kot dokaz in so lahko vidni operaterjem. Uporabite odobren mehanizem vpisa ali dostave skrivnosti ob namestitvi in omejite nastali credential na cilj.

Identiteta izvedbe

Raje uporabite neprivilegiran servisni račun. Če je root potreben, zožite ukaz na najmanjši privilegiran korak in nastavite eksplicitno lastništvo datotek. Preverite, da run_as poimenuje račun, ustvarjen pred zagonom enote.

Preverjanje

Preizkušajte izide, ne le izhodne kode enote:

{ "type": "file_contains", "description": "The startup unit wrote its readiness marker.", "params": { "path": "/var/lib/example/build-ready", "content": "ready" } }

Preizkusite tudi drugi zagon, nedosegljivo odvisnost in obnovo po prekinjenem prvem zagonu. Ob napaki preglejte systemctl status in dnevnik enote.