Načo jadro vlastne je

Keď sedíte za počítačom a čítate tento článok, robíte tak pomocou prehliadača a možno, vám do toho počítač hrá nejakú muziku a tlačí na tlačiarni dokument. Za tým všetkým je, ale schované niečo iné. Nenápadné. Jadro.

Jadro (angl. kernel) má tieto hlavné úlohy:

  1. Štartovanie systému
  2. Ovládačmi sprostredkováva prístup k hardwaru
  3. Poskytuje programom prostriedky (angl. resources) ako sú pamäť alebo čas kedy sa inštrukcie programu môžu vykonávať v procesore

Pri štarte počítača sa používa dohoda o tom akým spôsobom BIOS odovzdá riadenie operačnému systému. Táto dohoda prakticky znamená, že po vykonaní štartovacích testov pamäte a niektorých periférií sa riadenie odovzdá tzv. boot manager-u. V Linux-e sa najčastejšie používa lilo, grub alebo loadlin, či boot manažér iného operačného systému - napr. Windows. Úlohou boot manažéra je nájsť na disku súbor jadra, nahrať ho do pamäti a odovzdať mu riadenie.

V podstate každý kus hardwaru v počítači potrebuje svoj ovládač. Klávesnica, video-karta, sieťová karta, sériové, paralelné či USB porty, disk, disketová mechanika a tak ďalej. Okrem toho existujú aj ovládače pre algoritmické záležitosti ako sú súborové systémy, sieťové protokoly či rôzne systémy ako napr. APM (advanced power management). Jadro poskytuje množinu funkcií, ktoré umožňujú programom robiť rôzne operácie ako napríklad otvorenie súboru, čítanie a zápis do súboru a podobne.

Moderné operačné systémy sú mnohoúlohové (umožňujú beh viacerých programov naraz) a mnohoužívateľské (umožňujú prácu viacerých užívateľov naraz). Jadro sa stará o to, aby rozdelenie výkonu, pamäti, sieťovej priepustnosti bolo spravodlivo rozdelené medzi bežiace programy (potenciálne rôznych užívateľov).

Prečo?

Najčastejšie dôvody pre kompilovanie jadra:

  1. Snaha niečo sa dozvedieť.
  2. Pridanie podpory pre hardware, ktorý pôvodným jadrom podporovaný nie je.
  3. Snaha o zmenu konfigurácie ovládačov z hľadiska toho, či sú priamo v jadre, alebo existujú ako moduly.
  4. Opravy chýb v jadre.
  5. Snaha niečo si dokazovať a dvíhať si sebavedomie :-)

Keď dostanete do ruky inštaláciu Linux-ového systému tak spravidla vlastne máte nejakú distribúciu. Niekto zobral jadro a množinu programov a dal ich dohromady tak aby spolu fungovali. Medzi známe distribúcie patrí RedHat, Debian, Mandrake či Slackware alebo Gentoo. Ten, kto distribúciu zostavuje, sa spravidla postará o to aby ste dostali aj jadro (niekedy máte na výber z viacerých). Toto jadro bolo tvorcom distribúcie nejako nakonfigurované. Spravidla tak, aby podporovalo čo najrozmanitejšie konfigurácie hardwaru a požiadavky užívateľov.

V súčasnosti je veľmi zriedkavo nutné, aby ste jadro kompilovali sami. Linux-ové jadro je postavené ako skladačka. Skladá sa z mnohých častí, nazývaných moduly, ktoré nie sú priamo v súbore jadra, ale je možné jadro požiadať o to, aby ich funkcionalitu nahralo zo súboru dodatočne - už v čase kedy je systém rozbehnutý. Preto je často možné, že ak vaše jadro neobsahuje podporu pre nejaký hardware, možno do neho túto podporu doplniť neskôr - nahraním modulu. Niekedy medzi modulmi existujú závislosti. Napríklad ak máte všeobecnú podporu pre SCSI aj podporu pre SCSI disky ako moduly, tak najprv musíte nahrať všeobecnú podporu pre SCSI a až potom môžete nahrať podporu SCSI disky. Nahrávanie modulov (príp. ich odstraňovanie) sa spravidla robí pomocou programov z balíka modutils. Veľmi stručne:

Pridať alebo ubrať modul môže len užívateľ root. Druhá varianta pridávania a odoberania modulov je použitie automatického nahrávania modulov, ktoré ešte spomeniem nižšie.

Kompilovanie jadra

Kde zobrať zdrojový kód jadra?

Ak dospejete k rozhodnutiu, že je nutné skompilovať vlastné jadro, musíme najprv získať jeho zdrojový kód. Existuje viacero variant jadier, ktoré môžete chcieť a preto si najprv treba ujasniť zdrojový kód, ktorého jadra vlastne chceme:

Vanilla jadro
Vývojári jadra uverejňujú oficiálny zdrojový kód jadra na kernel.org. Postupom času vznikajú novšie a novšie verzie jadra. V súčasnosti je hlavné číslo verzie 2. Verzie stabilné - dostatočne odskúšané - majú vedľajšie číslo párne. V súčasnosti sa najskôr stretnete s verziou 2.6, 2.4 alebo 2.2. Ten kto má chuť riskovať, experimentovať alebo potrebuje niečo čo v aktuálnej verzii nie je, môže skúsiť čísla nepárne. V súčasnosti je poslednou verziou 2.6.6. Experimentálne verzie 2.3 a 2.5 sa už nevyvíjajú. Okrem oficiálneho zdrojového kódu tu nájdete aj odnože udržiavané poprednými vývojármi jadra. Napríklad Alan Cox tu má odnož s príponou -ac. Tieto odnože sa spravidla líšia použitím niektorých experimentálnych algoritmov.
Jadro distribúcie
Tvorcovia distribúcií tiež vychádzajú z vanilla jadra, ale často k nemu pridávajú vlastné úpravy alebo niektoré z vlastností nepárnej verzie. To neznamená, že také jadro je menej stabilné, ale len to, že podľa názoru distributéra je daná úprava dostatočne stabilná pre širšie použitie, resp. je to risk hodný zvýšeného výkonu a podobne. Pretože distributéri potrebujú nejaký čas na testovanie, tak svoju upravené verziu jadra publikujú s istým oneskorením oproti vanilla jadru.

Zdrojový kód jadra má vo forme archívu cez 30MB. Preto v prípade, že máte k dispozícií zdrojový kód staršej verzie, môže vám stačiť zobrať len zmeny oproti tejto staršej verzii - tzv. patch.

Ak máte úplný zdrojový kód jadra rozbaľte ho (tradične sa rozbaľuje do /usr/src):

# cd /usr/src
# tar xvfz kernel-2.6.3.tgz

alebo

# cd /usr/src
# tar xvfj kernel-2.6.3.tar.bz2

Podľa toho, či máte zdrojový kód jadra komprimovaný programom gzip, alebo bzip2. Rozbalením vznikne adresár, ktorý nesie meno verzie /usr/src/linux-2.6.3/. Je vhodné ho buď premenovať

# mv linux-2.6.3 linux

alebo vytvoriť symbolickú linku

# ln -s linux-2.6.3 linux

tak aby zdrojový kód bol dostupný pod adresárom /usr/src/linux.

Ak máte patch musíte ho aplikovať na svoje zdrojový kód jadra

# cd /usr/src/linux
# gunzip -c patch-2.6.4.gz | patch -p1 -

alebo

# cd /usr/src/linux
# bunzip2 -c patch-2.6.4.bz2 | patch -p1 -

Číslo záplaty 2.6.4 znamená, že ho možno aplikovať na zdrojový kód jadra 2.6.3 a jeho aplikovaním získame kód jadra 2.6.4.

Konfigurácia jadra

Prv než spustíme samotnú kompiláciu musíme povedať čo bude v jadre a čo nie. Táto informácie je uložená v súbore /usr/src/linux/.config. Tento súbor buď musíme vytvoriť, alebo upraviť už existujúci. Ak potrebujete len mierne upraviť vlastnosti jadra z distribúcie, skúste zistiť či distributér tento súbor niekde neponúka. Ak ste na zdrojový kód jadra aplikovali patch na vyššiu verziu, môžete spustiť príkaz (predpokladám, že sa nachádzate v adresári /usr/src/linux):

# make oldconfig

Tento príkaz zistí aké nastavenia pribudli v novšej verzii a opýta sa vás len na tieto nastavenia. Ostatné zostanú nezmenené.

Ak potrebujeme urobiť kompletnú konfiguráciu alebo meniť pôvodné nastavenia máme na výber niekoľkých možností v závislosti od toho aké prostredie máme k dispozícii:

  1. # make config
    make[1]: `scripts/fixdep' is up to date.
    scripts/kconfig/conf arch/i386/Kconfig
    #
    # using defaults found in .config
    #
    *
    * Linux Kernel Configuration
    *
    *
    * Code maturity level options
    *
    Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?]
      Select only drivers expected to compile cleanly (CLEAN_COMPILE) [Y/n/?]
      ...
    
    Tento spôsob patrí medzi historické. Stačí nám ľubovoľný textový terminál. Konfigurácia spočíva v tom, že dostávate rad otázok. Za každou otázkou sú v hranatých zátvorkách uvedené možnosti:
    • yes - toto nastavenie nebude použité
    • no - toto nastavenie nebude použité
    • module - daná voľba bude skompilovaná ako modul
    • ? - vypíše nápovedu - stručný popis významu daného nastavenia
    Voľba, ktorá bola nastavená v pôvodnom .config je veľkým písmenom a bude tiež použitá keď otázku jednoducho odklepnete klávesou Enter.
  2. # make menuconfig
    menuconfig screenshot
    Tento spôsob môžeme použiť ak náš systém má nainštalovanú knižnicu ncurses. Tak ako v predchádzajúcom prípade môžete zvoliť medzi y/n/m/?
  3. # make xconfig

    Pri jadrách 2.2 a 2.4 budete potrebovať mať nainštalovaný jazyk Tcl/Tk:
    xconfig ver 2.4

    Pri jadrách 2.6 budete potrebovať knižnicu Qt:
    xconfig ver 2.6

  4. # make gconfig

    Dostupné len pri jadrách 2.6:
    gconfig ver 2.6

  5. V prípade, že máte nainštalované prostredie KDE, môžete použiť Control Center:
    kde control center ver 2.4
    KDE vo verzii 3.2.2 vie konfigurovať len jadrá do verzie 2.4, ale dá sa predpokladať že podpora pre 2.6 čoskoro pribudne.

Nech už zvolíte ľubovoľný spôsob, je isté, že nato, aby ste správne nastavili konfiguráciu budúceho jadra, je vhodné mať dosť rozsiahle znalosti ako o hardwéri, ktorý máte v počítači, tak aj o rôznych subsystémoch. V tom či zvládnete tento krok spočíva 99% úspechu. Ak ho nezvládnete môžete skončiť s jadrom, ktoré nenabootuje alebo nebude podporovať hardware, ktorý máte, alebo nebude efektívne využívať možnosti tohoto hardwaru. Pri niektorých voľbách je tiež vhodné zvážiť na aký účel budete potom celý systém používať.

Moduly áno či nie

Ako som už spomínal, pri niektorých nastaveniach v konfigurácii možno zvoliť kompilovanie vo forme modulov. To znamená, že príslušná funkcionalita nebude začlenená do výsledného súboru jadra, ale do iného súboru. Meno tohoto súboru sa zvyčajne (no nie vždy) možno dočítať v nápovede pre danú voľbu alebo v dokumentácii.

Rozhodnutie či kompilovať ako modul, či nie je na vás. Treba ale pamätať na to, že niektoré distribúcie a niektoré podsystémy očakávajú niektoré ovládače vo forme modulov. Priveľa niektoré, takže konkrétne: je zvykom, že ovládače pre sieťové karty sa kompilujú ako moduly, pretože to uľahčuje konfigurovanie systému pre použitie viacerých sieťových kariet kariet naraz. Tiež to uľahčuje odovzdávanie parametrov do ovládača, akými môže byť IRQ, či DMA. Distribúcie ponúkajú štartovacie skripty, ktoré sa pokúšajú nahrať postupne všetky moduly až kým nenájdu ten správny pre vašu sieťovú kartu. Podobne napríklad, podsystém pre podporu zvuku - ALSA - očakáva ovládače pre zvukovú kartu vo forme modulov.

Zodpovednosť za automatické nahrávanie modulov môžete prenechať podsystému jadra nazvanému KMOD - Automatic kernel module loading. Tento podsystém, dokáže automaticky nahrať príslušný modul v čase, keď je potrebný - napríklad ovládač pre súborový systém FAT sa nahrá v čase, keď sa vykoná mount na takýto súborový systém.

Spustenie kompilácie

Po nakonfigurovaní nám ostáva len spustiť samotné kompilovanie. Nástroje potrebné na kompilovanie sú popísané v súbore /usr/src/linux/Documentation/Changes spolu so spôsobom ako zistiť verziu nástrojov, ktoré máte nainštalované:

o  Gnu C                  2.95.3                  # gcc --version
o  Gnu make               3.79.1                  # make --version
o  binutils               2.12                    # ld -v
o  module-init-tools      0.9.10                  # depmod -V
...

a tiež informáciu, kde získať aktuálne verzie týchto nástrojov:

o  <ftp://ftp.gnu.org/gnu/gcc/>
o  <ftp://ftp.gnu.org/gnu/make/>
o  <ftp://ftp.kernel.org/pub/linux/devel/binutils/>
...

Ak na vašom systéme potrebné nástroje nemáte, môže to byť kvôli tomu, že len nie sú súčasťou typickej inštalácie vašej distribúcie - takže sa najprv pozrite či sa nedajú odinštalovať.

Ak váš systém má potrebné nástroje, môžeme sa pustiť do kompilácie. Opäť je rozdiel medzi verziami 2.6 a nižšími. Ak máte konfiguráciu urobenú správne a chcete skompilované jadro hneď aj nainštalovať môžete to urobiť takto:

Verzie 2.4 a nižšie
# make dep clean bzlilo modules modules_install
Verzia 2.6
# make bzlilo modules modules_install

To čo nasleduje, za príkazom make, je takzvaný cieľ. Existuje mnoho cieľov, ktoré môžete použiť. Tu je ich stručný popis:

dep
Kontrola závislostí medzi rôznymi nastaveniami. Tento cieľ je potrebný pre jadrá do verzie 2.4
clean
Vymazanie dočasných súborov v adresároch pod /usr/src/linux. Táto voľba je nutná pri jadrách do verzie 2.4.
bzImage
Skompilovanie obrazu jadra (Image), ktoré je skomprimované zipovacím algoritmom (zip) a je pravdepodobne väčšie ako je rozmer diskety (big). Výsledné jadro vznikne v adresári /usr/src/linux/arch/i386/boot (za predpokladu, že kompilujete na IBM kompatibilnom PC-čku). Pri tomto cieli sa nekompilujú moduly.
modules
Skompilovanie modulov.
modules_install
Nainštalovanie modulov do /lib/modules/{verzia jadra/
bzlilo
To isté ako bzImage ale výsledné jadro je automaticky nainštalované pomocou lilo. Predpokladom je, že lilo je správne nainštalované a očakáva súbor s jadrom na tom istom mieste ako ho špecifikuje súbor /usr/src/linux/Makefile na riadku
export  INSTALL_PATH=/boot
Inými slovami, ak lilo očakáva súbor vmlinuz inde ako v /boot, musíte tento riadok upraviť.
mrproper
Podobne ako clean, ale zmazaný bude aj súbor .config.

Čo sa ešte oplatí vedieť?