# Operativsystem

## Vad det är

Ett operativsystem är den programvara som startar först på en dator och sedan fortsätter att köra
under allt annat. Det fördelar processorn, minnet, lagringen och nätverket mellan programmen och ger
dem alla samma sätt att läsa filer, använda enheter och nå nätverket. Ofta förkortas det OS.
Windows, macOS, Android, iOS och Linuxdistributioner som Debian och Ubuntu är operativsystem.

Ordlistan från NIST har två beskrivningar som passar ihop. Den ena kallar det det överordnade
styrprogram som driver datorn: det första programmet som laddas när datorn slås på, vars
huvudkomponent, kärnan, ligger kvar i minnet hela tiden, och som sätter standarden för alla
tillämpningsprogram, till exempel webbservern. Den andra, hämtad ur vägledningen från NIST om
säkerhet i operativ teknik, beskriver det som en sammanhållen samling servicerutiner som övervakar i
vilken ordning program körs, som kan sköta in- och utmatning, schemalägga resurser och hantera data,
och som ger tillämpningsprogrammen de grundläggande kommandona för att styra datorn.

Kärnan är navet, men ett operativsystem är mer än sin systemkärna. Runt den finns systembiblioteken
som programmen anropar, skalet och de vardagliga kommandoradsverktygen, en övervakare som startar
tjänster vid uppstart och startar om dem, en pakethanterare som installerar och uppdaterar
programvara, och en stor mängd förvald konfiguration som bestämmer vad som är påslaget, vart
loggarna tar vägen och vem som får logga in. En Linuxdistribution sätter ihop allt detta runt
Linuxkärnan, och därför kan två system med samma kärna bete sig helt olika.

Det mesta som ett operativsystem erbjuder ett program är en kort lista med abstraktioner som står i
hårdvarans ställe. POSIX, standarden bakom Unixliknande system, definierar dem noggrant. En process
är ett adressutrymme med en eller flera trådar som körs i det, plus de systemresurser som trådarna
behöver. En fil är ett objekt som går att skriva till, läsa från eller båda, med åtkomsträttigheter
och en typ: vanlig fil, katalog, symbolisk länk, FIFO, socket, eller en tecken- eller
blockspecialfil som står för en enhet. En blockspecialfil ger åtkomst till en enhet på ett sätt som
håller dess hårdvaruegenskaper utom synhåll. Själva enheten definieras som kringutrustning till
datorn, eller ett objekt som för programmet ser ut som sådan. Det uttalade syftet med POSIX är att
göra program portabla på källkodsnivå, så att ett program som skrivits mot dessa gränssnitt kan
kompileras och köras på ett annat system som följer standarden.

Minnet behandlas på samma sätt. Dokumentationen för Linuxkärnan utgår från att fysiskt minne är en
begränsad resurs och beskriver virtuellt minne som det lager som döljer detaljerna för
tillämpningsprogrammen. Varje program ser ett eget adressutrymme, och operativsystemet avgör
ögonblick för ögonblick vilka delar av vilka program som hålls i verkligt minne och vilka som
komprimeras, skrivs ut till disk eller släpps för att läsas in igen senare.

## Varför det spelar roll

Valet av operativsystem avgör mycket på en gång: vilken programvara som går att köra, vilka verktyg
de som driver det redan kan, vem som levererar säkerhetsrättningar och hur länge, och vad ett
supportavtal kostar, om det finns något. Att byta senare innebär att flytta varje program och varje
vana som byggts på det, så valet lever oftast längre än den hårdvara det först gjordes på.

Det är också den viktigaste förtroendegränsen inom en och samma maskin. Användare, grupper,
filrättigheter och åtskillnaden mellan processer är alla funktioner i operativsystemet, och de avgör
hur långt ett fel i ett program kan nå. En maskin där varje tjänst körs med fulla rättigheter har
bara en mur kvar, nätverkets ytterkant.

Standardvärdena är beslut som någon annan har fattat. En ny installation kommer med tjänster
påslagna, filer på överenskomna platser och inställningar som redan är valda. De flesta är rimliga,
några passar inte arbetet, och ingen talar om vilka. Att driva en maskin väl innefattar att veta
vilka standardvärden man har godtagit.

Operativsystemet avgör dessutom hur långt koden kan resa. Ett program som håller sig till de
portabla gränssnitten flyttar till ett annat system med ett nytt bygge. Ett program eller skript som
lutar sig mot ett systems tillägg flyttar bara så långt som de tilläggen räcker.

## Så ser det ut i praktiken

På en bärbar dator
[fyllde en applikation minnet tills operativsystemet dödade den](/sv/portfolio/stopped-an-application-filling-memory-at-41mb-a-second-155/).
Maskinen hade 36 GB, och ändå hann de komprimerade minnessidorna i den registrerade incidenten nå
111 GB medan applikationen växte med ungefär 41 MB i sekunden, vilket visar hur långt ett
operativsystem tänjer på minnet innan det griper in. Sidan tillägger att processen dödas först när
swappningen redan har fått allt annat på skrivbordet att sluta svara. Orsaken åtgärdades i
applikationen: händelseströmmarna fick gränser, varje lyssnare väcks bara för sina egna
händelsetyper och loggningen fick en taktbudget, och en sessions 610 996 loggrader blev 1 411.

På företagets värddator hade en automatiseringsroll skrivit SSH-inställningarna vid varje körning i
månader när en åtkomstrapport läste av de inställningar som daemonen själv faktiskt tillämpade och
fann två som avvek. Beskrivningen av hur
[SSH härdades med validering i tre steg](/sv/portfolio/hardened-ssh-with-three-stage-validation-111/)
anger orsaken: operativsystemet levereras med egna standardvärden som inte är bortkommenterade,
ovanför det ställe där en drop-in-fil hamnar, och för de två inställningarna vinner den första
förekomsten. Lösningen var ett filnamnsprefix som sorteras före leverantörens, och 24 direktiv
kontrolleras nu mot det som daemonen rapporterar tillbaka.

Samma maskin mötte ännu ett av systemets val när tjänsten som spärrar intrångsförsök sattes upp.
[Loggbackenden är inställd på automatisk identifiering](/sv/portfolio/proved-the-intrusion-banning-path-on-every-converge-112/),
eftersom operativsystemet saknar en traditionell autentiseringslogg och fel val misslyckas tyst
genom att bevaka en fil som aldrig dyker upp.

## Var det går fel

**Ett skript bär med sig vanorna från systemet där det skrevs.** Ett skalskript som skrivits på en
Mac och körs på en Linuxserver, eller tvärtom, möter samma kommandonamn med olika flaggor.
POSIX-versionen av `sed` tar `-E` och `-n`; att redigera en fil på plats med `-i` är ett tillägg,
och de två vanliga versionerna tar emot det på olika sätt:

```sh
sed -i 's/old/new/' notes.txt     # GNU sed, on most Linux systems
sed -i '' 's/old/new/' notes.txt  # BSD sed, on macOS
```

Varje form går sönder på det andra systemet. Håll dig till det som POSIX definierar där det räcker,
kör skriptet på det system som ska köra det i produktion, och installera samma verktyg på båda när
ett tillägg är värt att ha.

**Två maskiner med samma operativsystem skiljer sig åt.** ”Debian” är namnet på en hel familj av
utgåvor, och två maskiner som båda sägs köra det kan ligga flera år isär i utgåva, kärna och
paketversioner, med olika paket installerade och olika lokala ändringar. Läs av vad varje maskin
faktiskt är innan de jämförs:

```sh
cat /etc/os-release
uname -srm
```

Det första kommandot skriver ut distributionens namn och utgåva, det andra kärnans namn och utgåva
samt hårdvaruarkitekturen. Bygg varje maskin utifrån samma skrivna beskrivning och för in utgåvan i
inventariet.

**Tjänster körs som administratör.** En tjänst som körs som root på ett Unixliknande system kan läsa
varje fil och ändra varje inställning, så ett fel i den blir ett fel i hela maskinen. Ge varje
tjänst en egen användare utan särskilda rättigheter, med skrivrätt bara där den skriver, och lägg
till rättigheter en i taget när tjänsten visar att den behöver dem.

**En utgåva lever längre än sitt säkerhetsstöd.** Varje utgåva slutar få rättningar enligt ett
publicerat schema. Säkerhetsteamet hos Debian stöder till exempel en stabil utgåva i tre år efter
att den släppts. En maskin som lämnas kvar på en gammal utgåva fortsätter att fungera, och just
därför glöms den bort. Anteckna varje maskins slutdatum för stöd bredvid dess andra förnyelsedatum
och planera uppgraderingen i god tid.

## Läs mer

- [operating system — NIST CSRC Glossary](https://csrc.nist.gov/glossary/term/operating_system) —
  båda definitionerna, från det överordnade styrprogrammet till samlingen av servicerutiner.
- [POSIX.1-2024, Base Definitions: Definitions](https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap03.html)
  — den exakta lydelsen för process, fil, enhet och de andra ord som ett operativsystem byggs av.
- [POSIX.1-2024: sed](https://pubs.opengroup.org/onlinepubs/9799919799/utilities/sed.html) — de
  flaggor som varje `sed` som följer standarden tar emot, som ett mått på vad ett portabelt skript
  får använda.
- [Linux kernel documentation: Concepts overview](https://docs.kernel.org/admin-guide/mm/concepts.html)
  — virtuellt minne, sidcachen och återvinning av minne, så som kärnan själv beskriver dem.
- [Debian security FAQ](https://www.debian.org/security/faq) — hur Debian hanterar
  säkerhetsrättningar och hur länge en stabil utgåva får dem.

<https://engineer.company/sv/glossary/operating-system/>
