Jádro systému

Jaroslav Kortus, xkortus@fi.muni.cz


Obsah


Kde roste

Jádro je ke stažení na http://www.kernel.org. Dostupné je přes HTTP i FTP a to nejen tam, ale i na velkém množství mirrorů (http://www.kernel.org/mirrors/). Pro nás je nebližší na ftp://ftp.linux.cz/pub/linux/kernel.

Poslední verze (stabilní) jádra je 2.6. Sudé verze ozačují stabilní řadu, liché (např. 2.5) označují řadu vývojovou. Kromě těchto hlavních verzí (tzv. vanilla kernel) je k dispozici řada dalších vývojových stromů. V nich se nejčastěji vyvíjí např. ovladače pro nový hardware nebo uživateli požadovné změny, které se nehodí do hlavního stromu (např. kvůli úzkému zaměření). Lidé produkující takovéto úpravy kernelu (patche) mají své podadresáře v adresáři s kernelem v adresáři "people".

Pokud se rozhodneme patch vyzkoušet, stačí jej stahnout a rozbalit (nebo to protlačit skrz rouru). Poté aplikovat (většinou) příkazem patch -p1 < soubor.patch. Kompilace pak probíhá standardním způsobem a patch většinou přidá některé konfigurační volby do konfigurace jádra.


Konfigurace kernelu

Jádro většinou stahneme jako zabalený archiv zdrojových textů. K jeho rozbalení použijeme tar xjf linux-2.6.10.tar.bz2. Poté se přepneme do adresáře s rozbaleným jádrem a přečteme README ;). Následně můžeme začít s konfigurací budoucího nového jádra.

Pro začátek je dobré napsat make help, což nám poskytne stručný přehled možností. Ve stručnosti:
make clean - vyčistí většinu vytvořených souborů, ale ponechá například .config
make mrproper - vyčistí všechno
make menuconfig - textová konfigurace jádra pomocí menu
make gconfig - grafická konfigurace nad GTK
make xconfig - (od 2.6) konfigurace pomocí QT
make config - úplně obyčejná textová konfigurace pomocí dotazů Yes/No/Module.

Pokud již máme z dřívějška uložený .config, můžeme použít volby, které jsou v něm nastavené i pro budoucí jádro a budem dotázáni pouze na přepínače, které jsou v novém jádru a nejsou ve starém. Pro tento případ použijeme příkaz (po nahráni .config do adresáře s jádrem):

make oldconfig

Některé distribuce (SUSE) mají jádro upravené tak, že poskytuje přímo v sobě konfiguraci, se kterou bylo sestaveno (v /proc/config.gz). Jejich zdrojové balíky k jádru mají kromě výše popsaných možností ještě možnost "make cloneconfig", která rozbalí konfigurační soubor z /proc adresáře a zkonfiguruje s ním nové jádro.


Důležité konfigurační volby

Při konfiguraci jádra je nutné věnovat pozornost zejména architektuře procesoru, pro kterou jádro sestavujeme (menu "Processor type and features"). Při špatné volbě bude buďto kernel pomalý nebo vůbec nenabootuje. Pro víceprocesorové sytémy se zde rovněž zapíná podpora více procesorů (SMP).

Z dalších možností je důležité vybrat hardware, který by mělo naše nové jádro podporovat. Stejnou pozornost je třeba věnovat i výběru filesystémů. Nejjednodušší je nastavit vše na kompilaci přímo do jádra. Může se nám ale snadno stát, že jádro poměrně "nakyne" a bude obsahovat mnoho zbytečných částí.

Tento problém za nás vyřeší systém modulů. Pokud při konfiguraci zapneme podporu modulů ("Loadable Module Support"), můžeme do jádra vkládat ovladače a další části za běhu a rovněž je za běhu z jádra odebírat (pokud to závislosti dovolí). Můžeme tedy udělat i relativně malé jádro a vše nechat jako modul. Pak ale při startování nového jádra narazíme například na problém, že jádro potřebuje připojit oddíl s filesystémem, který nativně neumí a má ho jako modul. Pro tyto případy je třeba vytvořit tzv. ramdisk. Ten se natahuje hned po nabootování čistého kernelu a je z něj možné načíst potřebné moduly ještě před připojováním root oddílu (mkinitrd -h).

Podpora modulů je nutná i v případě, že budem používat nějaký proprietární ovladač (třeba originální ovladač pro nvidie). Bez podpory modulů nemáme způsob, jak dodaný binární modul do jádra začlenit.

Výsledek našeho konfiguračního snažení se uloží do souboru ".config".


Kompilace

Pro zkompilování nového jádra většinou stačí posloupnost příkazů:
make bzImage
make modules

Kompilace může v závislosti na vybraných částech a výkonu stroje trvat několik minut až hodiny. Po úspěšném doběhnutí kompilace najdeme nově narozené jádro (pro x86) v /arch/i386/boot/bzImage. To můžeme vzít a překopírovat většinou do /boot a vhodně upravit zavaděč systému.

Pro nainstalování modulů použijeme příkaz make modules_install. Ten nakopíruje moduly do /lib/modules/verze-jádra/.

Volitelně můžeme ještě do /boot zkopírovat soubor System.map (z adresáře, kde je rozbalený kernel). Ten obsahuje adresy jednotlivých funkcí jádra a mapuje je na jejich názvy. To je vhodné zvlášt v případech, kdy začne jádro padat. Místo adres se nám zobrazí názvy funkcí, které byly naposledy volány, a usnadní nám to dohledání příčiny (např. špatného ovladače).


Parametry při startu

Kompletní seznam parametrů je přímo u jádra v adresáři Documentation v souboru kernel-parameters.txt. Z nejčastěji používaných bych zmínil třeba:
init=/nekde/neco - předá po naběhnutí kernelu řízení zadanému programu.
root=/dev/hdc3 - určuje oddíl (resp. zařízení), kde se nachází kořenový svazek systému.

Pomocí těchto parametrů je například možné snadno změnit heslo pro roota, pokud vám lístek z heslem spadne z monitoru :). Třeba nabootováním z CD, zadáním root=/původní/root init=/bin/sh.

Další parametry vhodné při hledání a odstraňování příčin problémů s jádrem:
nosmp - vypne podporu více procesorů
acpi=off - vypne podporu ACPI (Advanced Configuration and Power Interface)
ide=nodma - vypne podporu DMA
initrd= - vypne zavádění ramdisku