Hoppa till innehållet

Operativsystem

programvaran som hanterar hårdvaran åt alla andra program

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. 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 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, 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:

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:

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

Ordlista