Suurele ja väiksele

Ammu on teada, et Linux on suuteline töötama erineva riistvara peal ja kuigi teadlikult kasutatakse seda eelkõige Intel–ühilduva protsessoriga PC–tüüpi arvutites, on Linux leidnud koha mobiiltelefonides, pihuarvutites ja muudes integreeritud seadmetes. Selliste „vidinate” hulk igapäevaelus kasvab järjest ja Linuxile ennustatakse suure paindlikkuse tõttu helget tulevikku. 2.6 teeb selle valdkonna arendajate elu oluliselt lihtsamaks, integreerides suure osa µClinuxi (uclinux.org) koodist. Lühidalt võimaldab see Linuxil töötada pihuseadmetele sobivatel protsessoritel, millelt on hinna ja voolutarbimise piiramiseks eemaldatud mitmeid tavapäraseid komponente, eelkõige mäluhaldusega tegelev MMU (Memory Management Unit).

Lisaks erinevate mikrokontrollerite toele, on nüüd võimalik kernelist täielikult eemaldada ka näiteks sisendseadmete toetus, mis säästab hinnalist ruumi ja mälu.

Suurtel serversüsteemidel on aga oma nõudmised ja kuigi Linux on kõige aktsepteeritum vahest just serverimaailmas, puudus tal nende kõige–kõige suuremate ja keerulisemate jaoks vajalik tarkus — NUMA toetus. NUMA (Non–Uniform Memory Access) lahendab mitme protsessoriga süsteemides pudelikaela, mis tekib, kui kõik (jutt käib antud juhul kümnetest) protsessorid kasutavad sama mälusiini. NUMA süsteemis püütakse jaotada mälu laiali erinevate protsessorite vahel. See tähendab, et osa mälu on antud protsessori jaoks riistvaraliselt lähemal, osa kaugemal ja pöördumised selle poole vastavalt kiiremad või aeglasemad. Operatsioonisüsteemi kernel peab jagama programmid erinevate protsessorite vahel ja jälgima sealjuures, et iga programm kasutaks antud protsessorile võimalikult lähedal asuvat mälu.

Sinule ja minule

Mikrokontrollerite ja NUMA süsteemide vahele mahuvad ka eelpool mainitud Intel–ühilduva protsessoriga kodu– ja kontoriarvutid. Mõned muudatused uues kernelis teevad Linuxi sobivamaks ka neile kasutajatele.

Esiteks on saanud uuenduskuuri nn scheduler ehk plaanur. See on kerneli osa, mis loob mulje, nagu töötaks korraga mitu programmi. Tegelikult saab ühe protsessoriga arvutis töötada korraga ainult üks programm ja mulje saavutatakse protsesside kiire vahetamisega: iga murdosa sekundi järel antakse protsessor järgmise programmi kasutusse, samas kui ülejäänud programmid ootavad oma aega. Sellega plaanur tegelebki ja uuendatud on algoritme, mille alusel ta ootenimekirjast programme valib. Lühidalt öeldes oli senine algoritm paljude programmide kasutamisel ebaefektiivne — plaanuri enda koodi käivitamiseks kulus liialt palju aega. Siinkohas on vahest vajalik märkida, et programmide kiire vahetamine muudab süsteemi tegelikult aeglasemaks, kuna vahetuste endi — kontekstivahetuse (context switch) — peale kulub samuti aega.

Parim plaanur pole see, mis vahetab programme võimalikult kiiresti, vaid vastupidi — vahetuste arv hoitakse võimalikult madalal. Kasutaja jaoks paistavad asjad aga teisiti — vähe kontekstivahetusi tähendab, et kui üks programm aktiivselt töötab, näiteks pakib lahti suurt faili, muutuvad kõik teised kohe aeglasemaks. Samas, kui tihe kontekstivahetus tähendab, et kõik programmid reageerivad normaalselt, aga iga ülesande lahendamiseks kulub tegelikult rohkem aega. Seega peab hea plaanur suutma jätta kasutajale mulje, et kõik toimub kiiresti, samas aga mitte tekitama liialt kontekstivahetusi. Pole just kerge ülesanne, kuid tunde järgi, mis töölauakasutaja jaoks on tegelikult kõige olulisem, saab uus plaanur sellega hakkama.

Siinkohas aitab teda kindlasti uue kerneli võimalus iseennast mõne teise programmi vastu välja vahetada — preemptible kernel. Kuni 2.4 seeria kerneliteni kehtis kogu ülalolev jutt vaid kasutajaprogrammide kohta, kernel ise ei allunud plaanurile. Kuivõrd programmid kasutavad aga paljude operatsioonide (näiteks failide lugemine) jaoks kerneli funktsioone — system calle ehk süsteemikutseid — siis võis kasutajaprogramm blokeerida kogu süsteemi seni, kuni tema kutse oli täidetud (blokeerimine on siinkohas vahest natuke ülepingutatud sõna, sest ajavahemikud on üldjuhul maksimaalselt kümnetes millisekundites. Kernel 2.6 toob nad aga alla kahe millisekundi). Alates 2.6 kernelist on võimalik kasutajaprogrammi süsteemikutset katkestada ja anda protsessor üle mõnele kohest reageerimist vajavale rakendusele.

Praktikas tähendab see, et 2.6 seeria kerneli puhul peaks kogu kasutajaliides reageerima kiiremini ka koormuse all. Levinud näide selle kohta on muusikafaili mängimine — koormatud süsteemis võis tekkida helisse auke. 2.6 kerneliga ei tohiks seda loodetavasti juhtuda, sest muusikaprogramm saab lugeda sisse ja töödelda järgmise failitüki ka siis, kui kernel täidab mõne teise programmi ajamahukat süsteemikutset.

Kui jutt juba helifailide peale läks, siis alates versioonist 2.6 on vahetunud helikaardi draiverite arhitektuur. Senine, OSS (Open Sound System) nimeline lahendus on vahetunud ALSA (Advanced Linux Sound Architecture) vastu (tõsi, vähemasti esialgu on võimalik kasutada veel ka OSS süsteemi). Tavakasutajale ei tohiks see muudatus tunda anda — loodetavasti on kõik ALSA draiverid võrdväärsed endiste OSS–i omadega. Küll aga on ALSA abil võimalik tulla vastu keerulisematele nõudmistele, nt kasutada mitut helikaarti, kombineerides nende väljundeid.

Kõikidele seadmetele

Üks suur muudatus, mida esimesel hetkel silmaga näha ei ole, aga väärib kindlasti esile toomist, on seadmefailide üle arvepidamise dünaamiliseks ja täielikult kasutajale kontrollitavaks muutmine.

Linuxis suhtlevad programmid erinevate seadmetega — näiteks USB mälupulgaga — kasutades seadmefaile. Seadmefailid võimaldavad käituda seadmega, nagu see oleks tavaline fail: sinna kirjutada ja sealt lugeda, kusjuures ainult kernel teab tegelikult, et sa ei kirjuta mitte /dev/sda1 faili, vaid hoopis välisele seadmele.

Üks senise lähenemise suur probleem vaatab vastu sealtsamast /dev kataloogist, kus on sadu (kui mitte tuhandeid) erinevaid faile. Neist suur enamus on tehtud igaks juhuks. Nii võib olla täiskomplekt SCSI seadmetega opereerimiseks vajalikke seadmefaile, samas kui süsteemis pole ühtegi SCSI seadet. See on nii, sest kernelil (õigemini riistvaradraiveritel) ei olnud siiani õiget võimalust ise öelda, millised seadmed antud hetkel süsteemis on ja millised seadmefailid tuleks luua.

Alates kernel 2.6–st hoolitseb selle eest programm nimega udev. Programm ise on nn kasutajaprogramm, ta ei ole osa kernelist. Kernel oskab teda aga õigel hetkel käivitada, andes talle edasi info selle kohta, millise seadme ta süsteemist avastas.

udev omakorda võib teha erinevaid asju: nt luua uuele seadmele (äsjasisestatud USB mälupulgale) vastavad seadmefailid. Kusjuures failinime, mis antud seadmele vastab, võib ta ise määrata või lasta seda teha kasutajal. See on oluline kasvõi nende samade mälupulkade puhul kohe, kui soovime kasutada rohkem kui ühte seadet korraga. Nimelt esitab Linux erinevaid USB salvestusseadmeid SCSI seadmetena ja nii on esimene sisestatud seade kättesaadav /dev/sda nime all, teine /dev/sdb nime all jne. Kui aga sisestada seadmed teises järjekorras? Siis on endine /dev/sda hoopis /dev/sdb ja vastupidi. Sellises olukorras ei saa olla kindel, kuhu failid täpselt kirjutatakse.

udev–i abil on võimalik määrata unikaalne seadmefaili nimi näiteks seadme seerianumbri vm parameetri järgi. Nii võib kasutaja määrata, et üks mälupulk on kasutatav faili /dev/usbram1 ja teine /dev/lgflash kaudu.

udev–i abil jõuab info sisestatud seadmete kohta ka teistele programmidele, selleks kasutatakse D–BUS arhitektuuri (www.freedesktop.org/ Software/dbus) ja selle kaudu on võimalik nt salvestusseade koheselt mountida, avada failihalduri aken või USB kaamera ühendamisel käivitada programm, mille abil kasutaja saab pildid arvutisse laadida.

Häkkerile

Kellel tekkis huvi uut kernelit katsetada, leiab muudatusi ka selles protseduuris. Üllataval kombel on siinsed muudatused lihtsuse poole. Koodi (mida minu arvutis on 215 MB) seadistamiseks on olemas vana make menuconfig, kuid uue ilme on saanud make xconfig, mis kasutab nüüdsest QT teeki. Kes on rohkem GNOME sõber, võib proovida ka GTK põhist seadistust käsuga make gconfig. Muutunud on ka seadistusprogrammide menüüstruktuur.

Nii kerneli enda kui moodulite kompileerimine käib käsuga make, millele ei lisandu enam mingeid argumente. Ka kompileerimisel väljastatavad teated on oluliselt lakoonilisemad, selle tõttu aga ülevaatlikumad, piirdudes hetkel töös oleva faili või draiveri nimega.

Kompileerimise lõpetab make modules_install, mis otsib lõpututest alamkataloogidest kokku moodulitena kompileeritud kerneli osad ja paigutab nad /lib/modules/2.6.x kataloogi. Siinkohal üks märkus: 2.6 kernel vajab moodulite sisselaadimiseks uut versiooni käsust modprobe, mille saab üldjuhul paketist module–init–tools ja mis on tagasiühilduv kernel 2.4 jaoks vajaliku versiooniga.

Uue kerneli paigaldamisel on küllaga võimalusi muuta oma süsteem kasutamatuks ja seega oleks vahest targem oodata kuni lemmikdistributsioon annab välja uue kerneliga versiooni. Tegelikult on ootamiseks veel teinegi põhjus: mitmed uued võimalused, sealhulgas udev–i toetus, vajavad rohkelt tööd süsteemi seadistamisega — eelkirjeldatud võimalus kasutajalt seadmetega opereerimisel nõu küsida, on hetkel rohkem teoreetiline. Nimelt puuduvad programmid, mis tegeleksid selle küsimise osaga. Selliste programmide loomine ja süsteemiga ühildamine on aga esmajoones distributsioonilooja ülesanne.

Lõpetuseks peab tõdema, et olen jõudnud tutvustada ainult murdosa uue kerneli võimalustest. Lisandunud on korralik ACPI ja PnP toetus, CD–kirjutajad ei vaja enam SCSI emulatsiooni, toetatud on USB2 ja HyperThreading, AMD64 ja PPC64 protsessorid jne. Kõikide uute võimaluste üleslugemine oleks võtnud aga kümme sellist artiklit ja seetõttu olin sunnitud tegema teatud valiku ja kirjeldama neid asju, mis vahest kõige suuremat kõmu on tekitanud või seda veel teevad.