Kompilace vlastního linuxového jádra

Překlad jádra linuxu je činnost, které se začátečníci zpravidla obávají pro její složitost. Ne jinak tomu bylo u mne a protože tuto činnost nedělám denně ani rutinně, vytvořil jsem si k tomuto účelu pár poznámek, které zde uvádím. Jsou poměrně stručné, ale pro ujasnění základního postupu stačí.

Nejdříve však o důvodech pro překlad vlastního jádra. Naprosté většině uživatelů by mělo plně vyhovovat jádro dodávané s jejich distribucí, které je zpravidla připraveno na většinu možných konfigurací a požadavků a pokud vše správně funguje, nemusí se obyčejný uživatel problematikou překladu vlastního jádra vůbec zabývat. Přesto však existuje několik důvodů, pro které má smysl překlad jádra zvládnout. Například:

  • Nefunguje některý exotický hardware a chcete to rozchodit.
  • Nechcete mít v jádře zbytečnosti – ovladače hardwaru, který nepoužíváte.
  • Optimalizace jádra přesně pro Váš procesor.
  • Odstranění chyby jádra, která je řešena v novější verzi.
  • Prostý zájem o problematiku.

V diskuzním fóru portálu ABC Linuxu kdosi uvedl ještě jeden důvod, který se mi moc líbil:

„Už nechci mít ty staré chyby a chci mít nějaké nové chyby.“ 🙂

Jste-li tedy rozhodnuti, pustit se do překladu vlastního jádra, budete potřebovat zdrojové kódy jádra. Nejnovější (ty s těmi nejnovějšími chybami) jsou k mání na www.kernel.org. Jádru přeloženému z těchto zdrojových kódů se také říká vanilla jádro. Stáhněte si je a rozbalte do adresáře /usr/src/linux-x.y.z , kde x.y.z je číslo verze. Symbolický link linux vedoucí do adresáře se zdrojovým kódem upravte tak, aby mířil do adresáře se zdrojovými kódy.

Je-li to potřebné, aplikujte na jádro patch. Zpravidla je to nutné v případech, kdy se snažíte rozchodit nějaký hardware, který ve vašem jádře, resp. ve vanilla jádře není podporován. To byl můj případ – ovladače k bezdrátové kartě Intel PRO/Wireless 2100 nebyly v jádře obsaženy a tak jsem byl vlastně přinucen začít se zabývat problematikou překladu vlastního jádra. Mimochodem, nelituji :-). 
Patchovat budete také tehdy, když máte zdrojové kódy některé starší verze jádra a nechcete stahovat celý balík nové verze. Stáhnete si jen patch k nové verzi, patchnete a je to. 

Jak? Máte-li patch zkomprimovaný programem gzip – koncovka souboru je gz – uděláte to příkazy:
# cd /usr/src/linux-x.y.z
# gunzip -c patch-x.y.z.gz | patch -p1 

Pokud je koncovka souboru s patch bz2, použijete jako druhý příkaz tento:
# bunzip2 -c patch-x.y.z.bz2 | patch -p1
Nyní by jste měli mít připraveny zdrojové kódy k dalšímu kroku – konfiguraci, ve které nastavíte co v jádře chcete mít a co ne.

Nastává okamžik, který z 99% rozhoduje o úspěšnosti Vašeho počínání. Správné (poměrně podrobné) informace o hardware Vašeho stroje jsou nezbytné. Máte-li nový stroj, dokumentace výrobce je výborné vodítko. Jinak Vám zbývá ještě možnost počítač rozebrat a přečíst si co je na jednotlivých komponentech napsáno. Není ostuda, jsou-li na počítači nainstalovány i Windows, podívat se co o hardware říkají Ovládací panely, popřípadě můžete zkusit schopnosti detekce hardwaru u nějaké live distribuce linuxu. V každém případě, pokud některou životně důležitou položku jako je například typ procesoru nebo použitý souborový systém hlavního disku zvolíte nesprávně, systém s takovým jádrem ani nenastartuje. Je tedy nezbytné postupovat tak, aby jste si zachovali možnost startu se starým, funkčním jádrem.

Prostředí, ve kterém budeme konfiguraci provádět si můžete vybrat z několika možností. Po zadání příkazu 
# make config
se dostanete do interaktivního režimu, kdy se Vás počítač na každou položku jádra zeptá a vy odpovídáte třemi způsoby – Ano, Ne a Modul, kde Ano znamená, že položka bude v novém jádře zahrnuta, Ne = nebude v jádře vůbec, modul = položka bude zkompilována jako modul. Při tomto způsobu není možnost opravit již jednou zadaný údaj a nedoporučuji jej používat krom případů opravdové nouze.

Druhá možnost je již podstatně komfortnější. Předpokládá nainstalované knihovny ncurses. Konfiguraci spustíme příkazem v konzoli:
# make menuconfig

V okně pak postupně (můžeme ale i napřeskáčku) nastavujeme konfiguraci jádra podobně jako v prvním případě, to znamená (*) = do jádra, ( ) = vůbec, (M) = jako modul. Největší rozdíly ve srovnání s prvním způsobem jsou v možnosti opravit již jednou provedenou volbu, vrátit se zpět k některé položce a v komfortnějším ovládání vůbec.

Třetí možností jak nastavit konfiguraci jádra je spustit příkaz:
# make xconfig
Úspěšné spuštění je podmíněno běžícím grafickým serverem a v případě jádra řady 2.4 také nainstalovanými knihovnami Tk. Pro jádro řady 2.6 jsou potřebné knihovny Qt. Screenshot ukazuje pohled na otevřené okno konfigurace jádra řady 2.6…

Ve všech třech případech máme možnost rozhodnout, zda bude položka začleněna přímo do jádra, nebo bude zkompilována jako modul, nebo nebude zahrnuta vůbec. Volba, jestli používat moduly nebo se jim spíše snažit vyhnout, je častým předmětem diskuzí i mnoha sporů v diskusních fórech. Důvody jsou různé. Pro začlenění ovladačů do jádra hovoří např. kompaktnost výsledného produktu, méně starostí se zaváděním modulů, snad o malinko rychlejší běh systému. Pro použití modulů naopak hovoří fakt, že pokud zhavaruje ovladač nějakého zařízení, nemusí to nutně znamenat zhroucení celého systému jak by tomu pravděpodobně bylo u jádra s ovladači uvnitř. Menší celková velikost jádra je také jistě přínosem, protože cennou operační paměť pak zabírají jen skutečně používané moduly. Bývá též zvykem ovladače některých komponentů kompilovat jako moduly, především se jedná o ovladače síťových karet. Jak se rozhodnout? Rozhodnutí je plně na Vás. 
Pro informaci: moje jádro pro notebook ACER TM 290 LMi je řešeno jako nemodulární. Jediné co zůstalo venku jsou ovladače pro Wifi kartu a PCMCIA zařízení. Karty PCMCIA používám jen zřídka a tak potřebné moduly natahuji ručně skriptem jen když jsou potřebné. Velikost tohoto jádra je 1748 kB. Se stabilitou nemám problémy.

Po nastavení konfigurace nového jádra je nutné konfiguraci uložit a můžeme přistoupit k vlastnímu překladu jádra. Co k němu budete potřebovat je závislé na konfiguraci překládaného jádra a je možné si to přečíst v souboru /usr/src/linux-x.y.z/Documentation/Changes. V každém slušně vychovaném systému by jste neměli mít problémy s tím, že by vám po plné instalaci distribuce něco chybělo. Slackware Linux to tak má.

Postup kompilace je trochu odlišný v závislosti na kompilovaném jádře, pro jádra řady 2.4 postupujte takto:

  • Jste v adresáři /usr/src/linux-x.y.z/. Pokud ne, přejděte do něj příkazem:
    # cd /usr/src/linux-x.y.z
  • # make dep – kontrola závislostí
  • # make clean – vymazání dočasných souborů
  • # make bzImage – kompilace jádra
  • # make modules – kompilace modulů
  • # make modules_install – instalace modulů

Všechny uvedené příkazy je možné sloučit do jediného:
# make dep clean bzImage modules modules_install

V adresáři /usr/src/linux-x.y.z/ potom najdete soubory System.map a bzImage, které je nutné překopírovat do adresáře /boot. Dále musíte upravit soubor /etc/lilo.conf tak, aby systém mohl nastartovat s novým jádrem a aby bylo možné v případě neúspěchu nastartovat s jádrem starým. Nakonec je nutné zapsat lilo příkazem:
# lilo

Kompilace jádra řady 2.6 je poněkud jednodušší a provedeme ji (opět z adresáře se zdroji jádra) příkazem:

  • # make bzImage – kompilace jádra
  • # make modules – kompilace modulů
  • # make modules_install – instalace modulů

Další postup ohledně kopírování vytvořených souborů je stejný jako u jádra řady 2.4.

Protože jsem jednu dobu trávil kompilací jádra poměrně dost času, trochu jsem si celou činnost zautomatizoval. Napsal jsem si malý primitivní skript, který agreguje výše uvedené příkazy včetně instalace zavaděče a navíc zapíše případné chybové hlášky do souboru. Funguje pro jádro řady 2.6:

#! /bin/bash
cd /usr/src/linux
make bzImage 2>aaa &&
make modules 2>bbb &&
make modules_install &&
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz_05
cp /usr/src/linux/System.map /boot/System.map_05
sleep 1
/sbin/lilo

Ve skriptu si můžete všimnout, že nové jádro – bzImage – kopíruji vždy na vmlinuz_05. Konfigurační soubor lila mám nastaven tak, aby zapsal lilo vždy s původním jádrem a toto nové je při startu nabídnuto jako testovací.

V Praze 19.12.2005

Příspěvek byl publikován v rubrice Linux a jeho autorem je michal. Můžete si jeho odkaz uložit mezi své oblíbené záložky nebo ho sdílet s přáteli.