Konfigurácia jadra

Juraj Michálek, xmichal5@fi.muni.cz


Obsah

1 Kernel všeobecne
2 Kompilácia kernelu
2.0 Moduly
2.1 Získanie zdrojového kódu
2.2 Zaplátanie kódu
2.3 Štruktúra adresárov
2.4. Konfigurácia jadra
2.4.1 Spustenie konfiguračného nástroja
2.4.2 Nastavenie jadra
2.4.3 Kompilácia a zavedenie jadra
2.4.4 Parametre pri zavádzaní jadra


1 Kernel všeobecne

Kernel je jadro unixových operačných systémov. Každý unixový systém vykazuje určité odlišnosti a špecifickú implementáciu. Všetky kernely sa snažia priblížit sa štandardu POSIX, ktorý predpisuje, čo všetko by mal moderný unixový systém zvládat. Myšlienkou štandardu POSIX je, aby aplikácie, ktoré sú napísané podla štandardu bežali na všetkých systémoch dodržujúcich tento štandard. Na to, aby bola táto požiadavka splnená, je nutné, aby sa aj vývoj jadra operačného systému riadil zásadami popísanými v POSIXe.

Linuxový kernel, ktorého základná schéma bola inšpirovaná Unixom, začal svoju históriu v roku 1992. Pri jeho základoch stál Linus Torvalds. Kernel je distribuovaný pod licenciou GNU/GPL. Kernel bol zozačiatku vyvíjaný pre procesory typu 386 - cielom vývoja bolo maximálne využitie schopností týchto procesorov. Po rade procesorov 386 nastúpila rada 486, takže jadro bolo vylepšované a upravované aj na tento procesor. S rozšírením komunity venujúcej sa vývoju kernelu prišli na radu dalšie procesory a tak kernel je v súčastnosti schopný bežat na rôznych typoch procesorov. Sú to procesory ARMs - nasadené firmou Compaq do iPaqov, Aplha - procesory firmy DEC, trieda procesorov Sparc od spoločnosti SUN, M68000 od Motoroly, MIPS procesory nasadené aj do malých prenosných zariadení a procesory PowerPC pre Macintosh. Tým však zoznam podporovaných procesorov nekončí, linuxový kernel je možné prevádzkovat takmer na všetkom, pre čo je možné napísat cross kompilátor.

Samotný kernel je možné skompilovat, ako akýkolvek iný program v systéme. Jeho zdrojové kódy sa nachadzajú na stránkach http://www.kernel.org. Tu sa nachádza ,,čistý'' kernel, ktorý je spoločným základom pre všetky Linuxové distribúcie. Slovíčko ,,čistý'' má naznačit, že do kernelu nie sú pridané žiadne špeciálne rozšírenia, ktoré sú špecifické pre jednodlivé linuxové dostribúcie. Každá firma, či skupina tvoriaca vlastnú distribúciu tento si kernel náležite upraví. Pridá logo do framebufferu, prípadne skupiny pracujúce na minimalistických distribúciach vyhodia nepotrebné kusy kódu.

Pri získavaní balíka so zdrojovým kódom je nutné overit si verziu kernelu. V súčastnosti (rok 2003) má hodnotu 2.4.20 (stabilná verzia). Číslovanie verzií kernelu sa skladá z niekolkých častí. Prvé číslo značí major version number, toto číslo sa mení len v prípade výrazných odlišností (napr. zmena konceptu systému). Linus Torvalds nie je príliš ochotný toto číslo menit. Tu stojí za zmienku spor medzi vývojarmi, ktorí presadzovali uvedenie verzie jadra 3 namiesto verzie 2.6. Hlavnými argumentami pre zmenu major version number bolo to, že nové jadro obsahujé úplne odlišný systém správy pamäte a rôzne dalšie významné odlišnosti. Ďalšia hodnota špecifikuje stabilitu jadra párna (sudá) hodnota značí stabilnú verziu a nepárna (lichá) značí vyvojovú verziu. Tretie číslo vo verzii kernelu určuje verziu úprav. S každou úpravou, resp. opravou sa táto hodnota zvyšuje (samozrejme, že sa nejedná o úpravu jedného riadku kódu, ale o rozsiahlejšiu skupinu úprav). Stabilné verzie jadra sa príliš nelíšia od predchádzajúcich - v podstate obsahujú len opravy predchádzajúcich verzií. Vyvojová verzia je velmi premenlivá a verziu od verzie sa môže jadro znažne odlišovať.

Pri každej zmene verzie jadra je zverejňovaný balík s kompletne novou verziu a záplata (patch) z predchádzajúcej verzie na novú. Pre udržiavanie najnovšej verzie jadra je výhodnejšie zaplátat staré jadro patchom, pretože záplata má pomerne malý objem. Tu je však nutné dat si pozor na to, z akej distribúcie je zdrojový kód pôvodného kernelu. Ako už bolo spomínané každá firma (skupina) modifikuje kernel a patch nemusí preto úplne stopercentne fungovat a môže sa aplikovat len čiastočne, čo vedie k tomu, že nový kernel nie je možné skompilovat.

Kernel umiestnený na kernel.org neobsahuje všetko, čo by bežný užívatel očakával. Existujú totiž projekty, ktorých vývojári pracujú relatívne nezávisle na verzii kernelu a pritom tieto projekty sú dôležitou súčastou systému. Dobrým príkladom je projekt Alsa - Advanced Linux Sound Architecture, ktorý je zameraný na tvorbu ovládačov zvukových kariet pre Linux. Samotný kernel obsahuje podporu len pre velmi malý rozsah zvukových kariet. Množstvo kariet podporovaných Alsou je pomerne velký a bolo by zbytočné ich pridávat priamo do jadra. Preto ak váš hardver nie je priamo podporovaný v jadre Linuxu, je nutné pozriet sa po projektoch, ktoré sa venujú vývoju príslušných ovládačov.


2 Kompilácia kernelu

2.0 Moduly

Od jadra 1.2 (rok 1995) je kernel modulárny, tzn. že je možné za behu pridávať (resp. odoberať) jeho časti - moduly. Moduly slúžia napríklad na ovládanie hardvéru. Na manipuláciu s modulmy existuje balíček utilít - modutils. Modul (binárny kód pre procesor) sa do jadra zavedie príkazom insmod, zoznam modulov získame príkazom lsmod a príkazom rmmod modul z jadra možeme odstrániť.

2.1 Získanie zdrojového kódu

Zdrojový kód jadra je možné získat na adrese http://www.kernel.org, prípadne na serveri, ktorý je určený pre danú distribúciu. Ak je kernel inštalovaný z rpm, deb či iného balíka, tak jeho kód nájdete v adresári /usr/src/kernel-source-verzia, prípadne v adresári /usr/src/linux (čo často býva len symbolický odkaz na predchádzajúci adresár). Pokial je k dispozícii tarball so zdrojovými kódmi, je vhodné rozbalit ho práve do adresára /usr/src.

Inštalácia balíka s kódom jadra (najčastejšie postupy):

2.2 Zaplátanie kódu

V prípade, že už máte k dispozícii zdrojový kód jadra a chcete ho zmenit na vyššiu verziu, je vhodné použit patch. V adresári, kde je umiestnený kernel spustite nasledujúci príkaz: patch -p0 < balík_s_patchom. Prípadne pre komprimované patche použite príslušný dekompresný program:

2.3 Štruktúra adresárov

V adresári so zdrojovým kódom jadra je možné nájst niekolko podadresárov s rozličným významom.

2.4 Konfigurácia jadra

2.4.1 Spustenie konfiguračného nástroja

Kernel obsahuje množstvo kódu a modulov, ktoré nie sú vždy nutné na jeho prevádzkovanie a pri ich zakompilovaní do jadra, môžu systém spomalovat, alebo zbytočne zaberat pamäť. Na upresnenie konfigurancie a optimalizácie kernelu je nutné nastavit volby, podla ktorých sa kernel skompiluje.

V adresári, kde sa nachádza kernel, je možné spustit utilitu make a špecifikovat, aký spôsob konfigurácie požadujeme:

2.4.2 Nastavenie jadra

Pri nastavovaní položiek z konfiguračného menu si môže užívatel vybrať, či má byt položka v jadre zabudovaná (built-in) alebo nie. Pri niektorých položkách je naviac volba module, kedy je príslušný kód uložený do modulu a je do jadra zavedený iba v prípade, že ho jadro potrebuje. Používanie modulov umožňuje zmenšit jadro a nechat v ňom len to najnutnejšie na prežitie a taktiež pridávanie nových funkcii jadru bez nutnosti jeho kompletnej rekompilácie a reštartu. Tejto vlastnosti jadra sa hovorí modularita - jadro je modulárne.

Pri konfigurácií sú k dispozícii nasledujúce voľby (popísal som hlavné menu a z ďalších menu som vybral len tie zaujímavejšie voľby, ktoré su prístupné pre danú oblasť):

Po výbere a skonfigurovaní všetkých vlastností je nutné nastavenie uložiť.

2.4.3. Kompilácia a zavedenie jadra

Po zdĺhavom konfigurovaní nasleduje ešte zdĺhavejšia fáza kompilácie.
Príkazom make dep, sa vybuduje zoznam závislostí medzi jednotlivými časťami kódu.
Obraz jadra sa vytvorí príklazom make bzImage.
Bootovacia disketa príkazom make bzdisk.
To isté je možné dosiahnuť príkazom make install, kde naviac bude zmeneá konfigurácia LILO závádzača.
Obrazy jadra sú najčastejšie umiestnené: /vmlinuz, /boot/vmlinuz, /bzImage,  /boot/bzImage (je nutné nastaviť zavádzač systému, tak aby zaviedol správny obraz jadra do pamäte)
Ak boli niektoré časti kernelu vybrané ako moduly, je nutné ich skompilovať príkazom make modules.
Inštalácia modulov sa prevedie príkazom make modules_install.
Nuž a zostáva len reštartovať systém.

2.4.4. Parametre pri zavádzaní jadra

Pred zavedením jadra je možné nadefinovat parametre, ktoré sa dajú jadru, prípadne procesu init na vstup. Parametre sú zapisované v tvare klúč=hodnoty oddelené čiarkou. Premenné sú oddelené medzerami. (Medzery sa nesmú vyskytovať v zápise jednej premennej).
Príklad: ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1