Linux Kernel

From ICO wiki
Jump to navigationJump to search

Autor: Jan Eerik DK31

Sissejuhatus

Linux kernel on Unix-tüüpi monoliitne operatsioonisüsteemi tuum, mis on välja arendatud Linus Torvalds'i poolt 1991. aastal. Nimi "Linux" tuleneb tema autori eesnimest ja tolleaegsest populaarsest operatsioonisüsteemist UNIX, millel Linux'i tuum põhineb. Linux'i tuum on vabavara ning põhineb GPL (GNU Public Licence) litsensil.

Tuum on operatsioonisüsteemi põhiline osa, mis organiseerib tööd kasutaja ning arvutisüsteemi riistvara vahel.

Linux'i tuum sisaldab kõiki põhilisi omadusi, mis on iseloomulikud kaasaegsele operatsioonisüsteemile, muuhulgas multitegumtöötlust, virtuaalmälu, jagatud teeke, mäluhaldust, mitmekihilist võrgusüsteemi (IPv4, IPv6).

Kuigi Linux'i tuum oli algselt välja arendatud 32-bitilise x86 tüüpi arhitektuuri jaoks, töötab Linux tänapäeval kõigi moodsate 32 ja 64-bitiliste masinate peal. Eriti levinud on Linux'i kasutamine serverites ning samuti domineerib mobiilsete seadmete turgu Android'i operatsioonisüsteem, mis põhineb omakorda Linux'il.

Arhitektuur

Linux'i tuum on monoliitne, mis tähendab, et terve operatsioonisüsteem töötab eraldatult "tuuma keskkonnas" ehk kogu tegevus tuumas on rangelt reserveeritud tema operatsioonide jaoks ning kasutaja keskkond sellele ligi pääse. Selle tulemusena on süsteem turvalisem, kuna pakub kaitset nii mäluruumile kui riistvarale potentsiaalse sissetungi eest. Samuti töötavad tuuma keskkonnas riistvara draiverid. Lisaks tuumale endale asub tuuma keskkonnas ka GNU C teek, mis võimaldab süsteemi kutseid ja üleminekut kasutaja keskkonnast tuuma keskkonda. Kasutaja keskkonnas töötavad seevastu erinevad kasutaja rakendused, näiteks graafiline kasutajaliides ja muud kasutaja rakendused.

Skeem 1: GNU/Linux operatsioonisüsteemi arhitektuur

Peamised Linux'i alamsüsteemid

Linuxi tuum on väga kompleksne ja mitmekihiline süsteem, mis omakorda koosneb mitmetest alamsüsteemidest.

Skeem 2: Arhitektuuriline vaade Linux'i alamsüsteemidele

Süsteemi kutsungiliides (System Call Interface):

Süsteemi kutsungiliides on õhuke kiht tuumas, mis vahendab funktsiooni väljakutseid kasutaja keskkonnast tuuma keskkonda. Kuna Linux'i tuum on eraldatud erinevateks õiguskihtideks (Privilege Levels), liiguvad kõik kasutaja antud käsud tuuma üle API, mis edastab vastavad käsud edasi tuumale.

Protsessihaldus (Process Management):

Protsessihalduse ülesandeks on protsesside täideviimine. Protsesse tuumas nimetatakse lõimedeks (threads) ning esindavad iseseisvat protsessori virtuaalset osa (lõimekood, andmed, registrid jne). Kuigi kasutaja keskkonnas kasutatakse pigem terminit protsess (või toiming), siis Linuxi puhul neid kontseptsioone spetsiaalselt ei eristata. Protsessihaldus peab lisaks tegelema ka protsessori ressursside eraldamisega aktiivsete lõimede vahel. Tuum kasutab selleks spetsiaalset planeerimisalgoritmi, mis töötab konstantses ajas ja ei ole sõltuv aktiivsete lõimede arvust, mis protsessori ressursse parajasti nõuavad. Tänapäeval toetavad need algoritmid ka mitut protsessorit (Symmetric Multiprocessing).

Mäluhaldus (Memory Management):

Lisaks protsessihaldusele peab tuum tegelema ka mäluhaldusega. Enamikes arhitektuuritüüpides hallatakse mälu 4KB suuruste puhvritena (*pages*). Linux'i tuum võimaldab lisaks tekitada abstraktsioone jagades mälu ka puhvrisiseselt, jälgides millised puhvrid on täis, pooltäis või tühjad. See võimaldab mäluhaldusskeemil dünaamiliselt vastavalt vajadusele mälu ümber jagada. Kuna mälu on jagatud mitmete erinevate protsesside vahel, võib juhtuda, et vaba mälu saab otsa, mistõttu tuleb puhvrid kirjutada kõvakettale. Seda protsessi nimetatakse saalimiseks (*swapping*).

Virtuaalne failisüsteem (Virtual File System):

Virtuaalne failisüsteem pakub vahekihti süsteemi kutsungiliidese ja tuuma poolt toetatud failisüsteemide vahel.

Skeem 3: Virtuaalne failisüsteem vahendab infot kasutajate ning failisüsteemide vahel

Virtuaalse failisüsteemi ülemises otsas on realiseeritud tavapärane API abstraktsioon, mis sisaldab põhilisemaid funktsioone (*nt open, close, read, write*). Allpool asub failisüsteemi abstraktsioon, mis defineerib kuidas kõrgema kihi funktsioone rakendatakse. Failisüsteemi kihi all asub omakorda puhver, mis sisaldab universaalseid funktsioone, mis ei sõltu konkreetsest failisüsteemi tüübist. See kiht optimeerib ligipääsu füüsilistele seadmetele ja muudele riistvarakomponentidele hoides lühiajaliselt mälus järgmisena vajaminevat infot. Puhvri all asuvad omakorda draiverid, mis juhivad juba konkreetsete füüsilise seadme tööd.

Võrgukihid (Networking Stack):

Võrgu ülesehitus Linux'is järgib kihilist arhitektuurimudelit ning koosneb seega mitmetest eriotstarbelistest kihtidest.

Seadme draiverid (Device Drivers):

Suur enamus Linux'i tuuma lähtekoodist eksisteerib seadme draiveritena, mis käituvad kui juhtprogrammid või ohjurid mingi konkreetse seadme kasutamiseks. Linux'is on draiverid järjestatud puuna vastavalt toetatavatele seadmetüüpidele (nt Bluetooth, I2C, Serial jne).

Lisaks eelnevale põgusale ülevaatele Linux'i tuuma ülesehitusest pakub ta lisaks palju huvitavaid võimalusi. Kuna tegemist on vabavaralise süsteemiga, mille lähtekood on kõigile avatud ning kättesaadav, on Linuxi tuumaga võimalik katsetada uusi protokolle ning nende edasiarendusi.

Veel üks kasulik omadus on dünaamiliselt laetavad moodulid, mis võimaldavad käigu pealt lisada ja eemaldada tarkvarakomponente.

Tuuma paigaldamine

Süsteemil saab olla korraga paigaldatud ka mitu tuuma, mille vahel saab valida alglaadimise käigus (GRUB menu). Selleks, et näha milline tuuma versioon on hetkel paigaldatud, saab kasutada järgmist käsku:

$ uname -r

4.40-57-generic

Käsk "uname" prindib välja süsteemi info, lipp -r aga väljastab tuuma täpse versiooni.

Linux'i tuuma saab paigaldada erinevalt. Üks võimalus on laadida alla lähtekood ja see kompileerida. Lihtsam on aga kasutada pakihalduse vahendeid (Ubuntu puhul näiteks apt-get). Nagu ikka, on soovitav enne uute pakkide paigaldamist uuendada varamud:

$ sudo apt-get update
$ sudo apt-get install linux-generic-lts-xenial

kus "xenial" on Ubuntu version, mida soovitakse paigaldada. Lisaks sellele on tarvis paigaldada ka teised vajalikud pakid, nagu linux-headers, linux-image-generic jne, samuti tuleb peale paigaldust teha arvutile taaskäivitus.

Kui on soov paigaldada juba olemasoleva tuuma uuem versioon, on veelgi lihtsam teha süsteemile kõikide pakkide uuendus käsuga

$ sudo apt-get dist-upgrade

Kui on soov tuuma vanem(ad) versioon(id) uuenduse järel eemaldada, tuleb anda käsk:

$ sudo apt-get autoremove

Tuuma failid

Uue tuuma paigaldamisel tekitatakse süsteemi mõned uued failid, mis tavaliselt lisatakse /boot kausta. Iga tuuma versiooni jaoks tehakse eraldi fail.

  • vmlinuz - tuum ise
  • initrd - ajutine failisüsteem, mida kasutatakse enne tuuma laadimist
  • System.map - Lookup tabel
  • config - konfiguratsiooni sätted, kuhu pannakse kirja, millised moodulid laaditakse

NB! Kui /boot kaustas saab ruum otsa, võib vanade versioonide failid ära kustutada. Seda on siiski parem teha läbi pakihalduse, näiteks eelpool mainitud käsuga

$ sudo apt-get autoremove

Käsitsi kustutades võib kogemata kaduma minna kasutuses oleva tuuma failid.

Tuuma moodulid

Nagu teame, on tuum ise monoliitne, ühes tükis tarkvara. Uue funktsionaalsuse loomiseks ei pea seega käsitsi tuuma koodi juurde kirjutama, vaid funktsionaalsust lisatakse moodulite abil. Moodulid ise on tarkvara tükid, mis laetakse tuuma ning suuremal osal juhtudest saab need kasutusele võtta isegi ilma süsteemi taaskäivitamata.

Hetkel tuuma laetud mooduleid saab näha käsuga

$ lsmod

Uue mooduli laadimiseks

$ sudo modprobe bluetooth

modprobe on siinjuures utiliit, mis üritab laadida mooduli /lib/modules/(kernel version)/kernel/drivers kaustast. Tuuma moodulitel on tihti ka sõltuvused ehk teised pakid, mis peavad olema paigaldatud, et moodul töötaks. Ka siin tuleb appi pakihalduse tarkvara. Kui paigaldatud moodulil on millegipärast puudu pakid, mida ta soovib kasutada (need on näiteks kustutatud, või millegi pärast pole neid üldse paigaldatud), saab üritada need üles otsida ja paigaldada käsuga:

$ sudo apt-get --fix-broken install

või lihtsalt

$ sudo apt-get -f install

NB! pakihaldur apt-get ise puuduvaid või katkisi sõltuvusi tekkida ei luba, eelpool olev olukord võib juhtuda pigem käsitsi seadistamise tulemusel.

Mooduli eemaldamiseks saab kasutada käsku:

$ sudo modprobe -r bluetooth

Viited

1. Anatomy of the Linux kernel: https://www.ibm.com/developerworks/library/l-linux-kernel/l-linux-kernel-pdf.pdf

2. Linux Journey: https://linuxjourney.com/lesson/kernel-overview