Hopp til innhold

Operativsystem

programvaren som styrer maskinvaren for hvert annet program

Hva det er

Et operativsystem er programvaren som starter først på en datamaskin og blir kjørende under alt annet. Det fordeler prosessor, minne, lagring og nettverk mellom programmene og gir dem alle de samme måtene å lese filer, bruke enheter og nå nettverket på. Det forkortes gjerne OS, etter det engelske operating system. Windows, macOS, Android, iOS og Linux-distribusjoner som Debian og Ubuntu er operativsystemer.

Ordlisten til NIST har to beskrivelser som utfyller hverandre. Den ene kaller det hovedkontrollprogrammet som driver datamaskinen: det første programmet som lastes når maskinen slås på, der hovedkomponenten, kjernen (kernel), ligger i minnet hele tiden, og som setter standardene for alle applikasjonsprogrammer, f.eks. webserveren. Den andre, fra NISTs veiledning om sikkerhet i driftsteknologi (operational technology), kaller det en integrert samling tjenesterutiner som styrer rekkefølgen programmer kjøres i, som kan stå for styring av inn- og utdata, planlegging av ressurser og databehandling, og som gir applikasjonsprogrammene de grunnleggende kommandoene for å styre maskinen.

Kjernen er midtpunktet, men et operativsystem er mer enn sin systemkjerne. Rundt den ligger systembibliotekene programmene kaller, skallet (shell) og de vanlige kommandolinjeverktøyene, en tilsynsprosess som starter tjenester ved oppstart og starter dem på nytt, en pakkebehandler som installerer og oppdaterer programvare, og en stor mengde standardkonfigurasjon som avgjør hva som er slått på, hvor loggene havner, og hvem som får logge inn. En Linux-distribusjon setter alt dette sammen rundt Linux-kjernen, og derfor kan to systemer med samme kjerne oppføre seg svært ulikt.

Det meste et operativsystem tilbyr et program, er en kort liste med abstraksjoner som står i stedet for maskinvaren. POSIX, standarden bak Unix-lignende systemer, definerer dem presist. En prosess er et adresserom med én eller flere tråder som kjører i det, pluss de systemressursene trådene trenger. En fil er et objekt som kan skrives til, leses fra eller begge deler, med tilgangsrettigheter og en type: vanlig fil, katalog, symbolsk lenke, FIFO, socket, eller en tegn- eller blokkspesialfil som står for en enhet. En blokkspesialfil gir tilgang til en enhet på en måte som holder maskinvareegenskapene ute av syne. Selve enheten defineres som en ytre enhet til datamaskinen, eller et objekt som fremstår som en slik enhet for applikasjonen. POSIX oppgir som formål å gjøre applikasjoner flyttbare på kildekodenivå, så et program skrevet mot disse grensesnittene kan kompileres på et annet system som følger standarden, og kjøres der.

Minnet får samme behandling. Dokumentasjonen for Linux-kjernen tar utgangspunkt i at fysisk minne er en begrenset ressurs, og beskriver virtuelt minne som laget som skjuler detaljene for applikasjonsprogramvaren. Hvert program ser et eget adresserom, og operativsystemet avgjør fra øyeblikk til øyeblikk hvilke deler av hvilke programmer som holdes i ekte minne, og hvilke som komprimeres, skrives ut til disk eller kastes for å leses inn igjen senere.

Hvorfor det er viktig

Valget av operativsystem avgjør mye på én gang: hvilken programvare som vil kjøre, hvilke verktøy de som drifter det, allerede kan, hvem som leverer sikkerhetsrettinger og hvor lenge, og hva en eventuell supportavtale vil koste. Å bytte senere betyr å flytte hvert program og hver vane som er bygd på det, så valget lever som regel lenger enn maskinvaren det først ble tatt på.

Det er også den viktigste tillitsgrensen inne i én maskin. Brukere, grupper, filrettigheter og skillet mellom prosesser er alle funksjoner i operativsystemet, og de avgjør hvor langt en feil i ett program kan nå. På en maskin der hver tjeneste kjører med fulle rettigheter, gjenstår bare én mur: nettverkskanten.

Standardvalgene er beslutninger noen andre har tatt. En fersk installasjon kommer med tjenester slått på, filer på avtalte steder og innstillinger som allerede er valgt. De fleste er fornuftige; noen få passer ikke til arbeidet, og ingen sier fra om hvilke. Å drifte en maskin godt innebærer å vite hvilke standardvalg du har godtatt.

Og det avgjør hvor langt koden kan reise. Et program som holder seg til de flyttbare grensesnittene, flyttes til et annet system med en ny kompilering. Et program eller skript som lener seg på ett systems utvidelser, kommer bare så langt som utvidelsene gjør.

Slik ser det ut i praksis

På en bærbar maskin fylte en applikasjon minnet til operativsystemet drepte den. Tallene viser hvor langt et operativsystem strekker minnet før det griper inn: med en stigning på rundt 41 MB i sekundet kom hendelsen som ble registrert, opp i 111 GB komprimerte sider, og maskinen hadde 36 GB. Siden legger til at prosessen drepes først etter at swappingen allerede har fått alt annet på skrivebordet til å slutte å svare. Rettingen skjedde i applikasjonen og ikke i operativsystemet: hendelsesstrømmene fikk grenser, lytterne abonnerer per hendelsestype, loggingen fikk et budsjett for hvor ofte den skriver, og 610 996 logglinjer fra én økt ble til 1 411.

På selskapets vert hadde en automatiseringsrolle skrevet SSH-innstillingene sine ved hver kjøring i månedsvis, da en tilgangsrapport leste daemonens egne effektive innstillinger og fant at to av dem ikke stemte. Beretningen om herding av SSH med validering i tre trinn forklarer årsaken: operativsystemet leverer sine egne standardverdier ukommentert, over stedet der en drop-in-fil havner, og for de to innstillingene er det den første forekomsten som vinner. Løsningen var et filnavnprefiks som sorteres foran leverandørens, og nå kontrolleres 24 direktiver mot det daemonen selv melder tilbake.

Den samme verten møtte enda et av systemets valg da tjenesten som stenger ute inntrengere, ble satt opp. Loggkilden er satt til automatisk gjenkjenning, fordi operativsystemet ikke leverer noen tradisjonell autentiseringslogg, og et feil valg svikter i det stille ved å overvåke en fil som aldri dukker opp.

Hvor det går galt

Et skript bærer med seg vanene fra systemet det ble skrevet på. Et skallskript skrevet på en Mac og kjørt på en Linux-server, eller omvendt, møter de samme kommandonavnene med andre flagg. POSIX-versjonen av sed godtar -E og -n; å redigere en fil på stedet med -i er en utvidelse, og de to vanlige versjonene tar imot den på hver sin måte:

sed -i 's/old/new/' notes.txt     # GNU sed, på de fleste Linux-systemer
sed -i '' 's/old/new/' notes.txt  # BSD sed, på macOS

Hver form feiler på det andre systemet. Hold dere til det POSIX definerer der det er nok, kjør skriptet på det systemet som skal kjøre det i produksjon, og installer det samme verktøyet på begge når en utvidelse er verdt å ha.

To maskiner med samme operativsystem er ulike. «Debian» er navnet på en familie av utgivelser, og to verter som begge sies å kjøre det, kan ligge år fra hverandre i utgivelse, kjerne og pakkeversjoner, med ulike pakker installert og ulike lokale endringer. Les hva hver maskin faktisk er, før dere sammenligner dem:

cat /etc/os-release
uname -srm

Den første skriver ut distribusjonens navn og utgivelse, den andre kjernens navn og utgivelse og maskinvarearkitekturen. Bygg hver vert fra den samme skriftlige beskrivelsen, og før utgivelsen inn i inventaret.

Tjenestene kjører som administrator. En tjeneste som kjører som root på et Unix-lignende system, kan lese hver fil og endre hver innstilling, så enhver feil i den er en feil i hele maskinen. Gi hver tjeneste sin egen bruker uten privilegier, med skrivetilgang bare der den skriver, og gi flere rettigheter én om gangen når tjenesten viser at den trenger dem.

En utgivelse lever lenger enn sikkerhetsstøtten. Hver utgivelse slutter å få rettinger etter en publisert plan. Debians sikkerhetsteam støtter f.eks. en stabil distribusjon i tre år etter at den ble utgitt. En vert som blir stående på en gammel utgivelse, fortsetter å virke, og nettopp derfor blir den glemt. Før opp datoen da støtten tar slutt for hver vert, ved siden av de andre fornyelsesdatoene, og planlegg oppgraderingen i god tid før.

Les mer

Ordliste