Konfigurace jádra

Jaroslav Kučera, xkucera4@fi.muni.cz


Obsah


Kde jádra získáme?

Takzvané "Vanilla" kernely je možné stáhnout buď přímo na oficiálním ftp serveru:

ftp://ftp.kernel.org/pub/linux/kernel

nebo také na českém mirroru:

http://ftp.linux.cz/pub/linux/kernel/

který se fyzicky nachází v prostorách Fakulty informatiky MU v Brně.

Další možností je použít jádra dodávaná s jednotlivými distribucemi. Většinou se jedná o jádra upravená aplikací dodatečných záplat a rozšíření (tzv. patche). Tato jádra bývají šitá na míru růzým architekturám procesorů (Athlon, Pentium 4 či obecně architektura i386) a také jsou rozdělena na normální (pro jednoprocesorové stroje) a SMP (jádra přizpůsobená speciálně pro běh na strojích s více procesory).

Není nutné je kompilovat, protože se dodávají ve formě instalačních balíčků (RPM apod.). Chcete-li i přesto použít pro kompilaci distribuční jádro, například proto, že je již nakonfigurováno a vy chcete provést jen minimální změnu, můžete, neboť podle regulí GPL (General Public Licence), pod kterou jsou jádra vydávána, musí být kernel k dispozici i ve formě zdrojových kódů. Takže je společnosti vydávající vlastní distribuce dávají k dispozici.

Na Internetu naleznete i speciálně upravená Vanilla jádra s aplikovaným patchem (například bezpečnostní rozšíření apod.). Příkladem může být projekt LIDS (Linux Intrusion Detection System), na jehož stránkách jsou k dispozici nejen vlastní patche, ale také jádra již ošetřená.

Existují též větve zaměřené na testování ovladačů různých periferií. Nejznámější je asi větev Alana Coxe, která se specializuje především na vývoj a ladění ovladačů diskových řadičů. Takže pokud jste udělali tu "chybu" a koupili si příliš nový hardware, bude pro vás asi jedinou nadějí některá z těchto vývojových větví. Jsou k nalezení na stejném ftp jako čistá Vanilla jádra, v sekci people.

Číslování verzí

V současnosti jsou aktuální jádra verze dva, tedy 2.x.x. Jádra jsou číslována podle toho, zda se jedná o stabilní řadu (sudá čísla za tečkou, v originále patchlevel) nebo vývojovou (lichá čísla za tečkou).

Stabilní řada - 2.0.x, 2.2.x, 2.4.x, 2.6.x
Vývojová řada - 2.1.x, 2.3.x, 2.5.x

Jádra stabilních řad by měla jít přeložit vždy, být maximálně otestovaná a stabilní. Tyto vlastnosti u vývojové řady zaručeny nejsou a stává se, že není možné některá jádra přeložit vůbec nebo jsou značně nestabilní.

Podverze (v originále sublevel) řad jádra se odlišují poslední číslicí (2.4.18, 2.5.26). Jsou v nich změny, které je neodlišují natolik od prvních jader řady (např. 2.4.0) aby se stala prvními jádry řady nové.

Vydání nové verze jádra předchází určitá doba testování nových funkcí. V této době vychází test verze (2.6.0-test5), po nich pre verze (2.4.23-pre5) a nakonec tzv. "release candidate" (2.0.40-rc6).

Způsoby konfigurace

Takže jádro jsme již stáhli a rozbalili. Nyní můžeme přistoupit k jeho konfiguraci.
Na výběr máme čtyři možnosti:


make config
Jedná se o tu nejzákladnější možnost konfigurace jádra. make config vám vlastně pouze nabízí jednotlivé volby a povolené možnosti odpovědi. K dispozici jsou Y=yes, N=no a M=module, v případě, že se daná položka dá nainstalovat i jako jaderný modul. Tento způsob konfigurace je velmi zdlouhavý a dnes se snad již nepoužívá.

make menuconfig
Tento způsob vám nabízí konfiguraci pomocí programu založeného na knihovně ncurses (pseudografika v textovém režimu). Zobrazí se vám nabídka hlavních menu (Processor type and features, Networking options...). Vstoupíte-li do některého z nich, uvidíte v horní části obrazovky vlastní volby nastavení (registrovat je můžete pomocí mezerníku a nebo klávesy "M" pro moduly) a v dolní další podmenu označená symbolem "-->", pokud existují. Výhodou tohoto způsobu konfigurace je možnost vysvětlující nápovědy k jednotlivým volbám a přehlednost závislosti nastavení.

make xconfig
Třetí možností je make xconfig, který používá klikatelné grafické menu. Možnosti tohoto způsobu jsou prakticky totožné s předchozím make menuconfig. Výhodou je právě možnost použít myš. Daní grafickému prostředí je lehké snížení přehlednosti, protože pro každé podmenu se otevírá nové okno.

make oldconfig
Poslední možnost se využívá, chcete-li upgradovat na novější verzi jádra a již máte konfigurační soubor z některé předchozí verze. Tento soubor prostě zkopírujete do kořenového adresáře nového kernelu pod názvem ".config". Konfigurační program použije nastavení voleb získaná z tohoto konfiguračního souboru a na novější volby v něm neobsažené se zeptá způsobem stejným s make config.

Význam důležitých konfiguračních voleb

Při konfiguraci bychom měli věnovat zvláštní pozornost především některým položkám nastavení jádra.

Můžeme se rozhodnout, jestli chceme tzv. monolitický kernel (výhodou je rychlost, nevýhodou více zabraného paměťového prostoru) nebo kernel modularní. Pokud modulární, neměli bychom zapomenout zaškrtnout položku Loadable module support --> Enable loadable module support.

Výběr správné architektury procesoru a případné podpory SMP v sekci Processor type and features je samozřejmostí. V této kapitole se nachází ještě jedna důležitá položka, High memory support, jedná se o zahrnutí podpory pro stroje s množstvím fyzické operační paměti větším než 960 MB.

V závislosti na souborovém systému (Ext3, ReiserFS...) na kterém se nachází kořenový adresář je nutné začlenit přímo do jádra i jeho podporu, podpora modulem v tomto případě nestačí. Výběr se provádí v menu File systems.

Pokud jsme do jádra aplikovali nějaké patche, nejspíše se nám zobrazí i jejich sekce s jejich nastaveními. Pokud je neaktivujeme, bude se kernel chovat jako bez nich.

Jednotlivých položek které můžeme konfigurovat je nepřeberné množství a s novými kernely jich bude jen přibývat. Které z nich využijeme záleží jen na nás a na schopnostech, které od našeho kernelu očekáváme (podpora HW, podpora síťových služeb...). Nejsme-li si naprosto jistí, že danou položku nebudeme potřebovat, měli bychom se řídit doporučeními nápovědy.

Principy fungování modulů

Pokud jsme si vybrali kernel s podporou modulů, jistě víme proč. Moduly mohou především ušetřit paměť. Hodí se například pro podporu filesystémů, ovladačů síťových karet, tiskáren a dalších zařízení. Jedná se o kusy jaderného kódu, které nejsou přímo linkovány a vloženy do jádra. Kompilují se samostatně a jsou načítány až když je dané zařízení nebo podpora systému souborů potřeba. Je to ovšem i potenciální bezpečnostní chyba a dá se řešit například některým z bezpečnostních patchů (výše zmíněný LIDS a další), které jsou schopny jádro "zmrazit". Takto ošetřené jádro není od jisté chvíle schopné načíst další moduly a pracuje jen s těmi, které byly načteny před zmražením jádra.

Další výhodou je možnost zkompilovat si některý modul samostatně, bez potřeby kompilovat celé jádro nebo všechny ostatní moduly a následně jej načíst.

Pro nakládání s moduly slouží utility insmod (načte modul do jádra), rmmod (odejme modul z jádra) a lsmod (vypíše používané moduly).

V současné době je Linux jediným operačním systémem, který zavádění modulů za běhu podporuje.


Instalace nového jádra

Po úspěšném výběru komponent nového jádra přistoupíme k vlastní instalaci. První krok, který musíme udělat po ukončení konfigurační utility a zapsání souboru .config je příkaz "make dep". Po jeho ukončení můžeme ruční editací položky EXTRAVERSION v souboru Makefile upravit název jádra, tak jak bude uloženo na disku. Tímto způsobem můžeme odlišit nové jádro od starého, například máme-li již na disku jádro /boot/vmlinuz-2.4.21 a chceme přidat upravené jádro stejné verze upravíme položku EXTRAVERSION třeba do podoby "EXTRAVERSION=.lids". Po kompilaci dostaneme jádro s názvem vmlinuz-2.4.21.lids21.

Dalším krokem je "make bzImage", který vyrobí komprimovaný obraz jádra v adresáři arch/i386/boot/bzImage. Pokud máme nainstalován zavaděč systému Lilo, můžeme použít příkaz "make install" provedený pod uživatelem root, který přidá náš kernel do startovací nabídky Lila. Pro jistotu je lepší zkontrolovat soubor /etc/lilo.conf abychom předešli případným potížím při startu systému. Chceme-li vytvořit startovací disketu využijeme příkazu "make bzdisk".

Pokud byla zapnuta podpora modulů, je nutné vykonat "make modules". Proběhla-li kompilace bez chyb, nainstalujeme moduly příkazem "make modules_install", který zkopíruje moduly do adresáře /lib/modules.

Jestliže jsme nevyužili příkazu "make install", musíme ještě zkopírovat náš nový kernel do adresáře /boot nejlépe pod jménem, které jsme zvolili v EXTRAVERSION. Provedeme také "cp .config /boot/config-your_kernelversion". Provedeme úpravu konfigurace boot manažeru (Lilo, Grub) a instalace je hotova.

Soubor System.map

Soubor /boot/System.map je pouze symbolickým linkem na /boot/System.map-kernel_version soubor některého z nainstalovaných jader. Jedná se o jakýsi telefonní adresář funkcí obsažených v jádře. Jádro zná své funkce v lidsky nepraktické podobě (hodnoty typu c01ba910, c01bcb00 atp.), takže tento soubor existuje jako převodní tabulka do podoby lidsky čitelné. Jednotlivé řádky jsou typu:

c01ba910 t char2uni

Pro tento převod se používají ve skutečnosti soubory dva. Jeden virtuální, "/proc/ksyms", generovaný vždy při startu jádra a závislý na právě načtených modulech. Používá ho většina normálních programů. A právě System.map, ten je používán především programy z rodiny systémových utilit procps (ps, top, sysctl, w, uptime...), lsof, ale třeba také dosemu. Asi nejdůležitější program využívající System.map je ovšem klogd (logovací démon jádra). V případě výskytu chyby v jádře (hlášky typu "oops")jádro podá informaci typu:


EIP: 0010:[<00000000>]
Call Trace: [<c010b860>]


Následovanou výpisem registrů CPU a dalších informací. Démon klogd tuto informaci zpracuje do lidsky čitelné podoby a pro vlastní převod použije právě soubor System.map, který je pevně daný pro každé jádro zvášť. Takže pokud symbolický link System.map neodkazuje na správný System.map-kernel_version, informace získané klogd démonem jsou chybné! Proto bychom měli vždy zkopírovat nový soubor System.map, vzniklý při kompilaci jádra, do některé z následujících cest (psáno v pořadí, v jakém je klogd hledá):

1. /boot/System.map
2. /System.map
3. /usr/src/linux/System.map

Případně vytvořit symbolický odkaz /boot/System.map ukazující na aktuální System.map.


Parametry jádra při startu

Linuxový kernel akceptuje parametry zadávané na příkazové řádce při startu systému. K tomu aby bylo možné tyto parametry nastavit, je nutné použít například Lilo. Příkazová řádka je rozdělena následovně:

název_jádra jméno_parametru=hodnota1,hodnota2,hodnota3,...,hodnota10

Maximální počet hodnot zadaných parametru je 10. Je-li potřeba zadat hodnot více, musíme zadat jméno_parametru vícekrát. Některé z parametrů žádné hodnoty neočekávají (například noisapnp...), potom jsou případné zadané hodnoty interpretovány jako proměnná prostředí. Stejně tak u parametrů, které sice některé hodnoty akceptují, ale dostanou neznámé nebo neočekávané hodnoty. Parametry, které nevyužije jádro, ani nejsou proměnnými prostředí se předávají dále procesu init. Možné hodnoty parametrů jsou v "man bootparam" a také u zdrojových kódů každého jádra v Documentation/kernel-parameters.txt.

Neměli bychom zapomínat, že všechny parametry jsou "case sensitive"!