Překlad jádra Linuxu
Překlad jádra Linuxu není běžnou činností, kterou by uživatel vykonával, protože jádro je dodáváno spolu s distribucí v předem připraveném modulárním tvaru. V některých případech však může uživatel potřebovat přeložit doplňující ovladač nebo upravit nastavení jádra, případně do něj začlenit opravu.
Obsah
Překladač pro jádro
Pro překlad jádra nebo ovladače je nutné mít v systému překladač (gcc). Pro překlad ovladače není potřeba stahovat celé zdrojové kódy jádra. Nejprve se ujistěte, že váš systém je aktuální a pak nainstalujte překladač a příkaz make:
yum update yum install gcc make
Překlad modulu mimo jádro
K některým zařízením (zejména Wi-Fi karty) jsou k dispozici ovladače, které však nejsou součástí zdrojových kódů jádra (tzv. off-tree). Důvodem jsou buď licenční problémy (ovladač obsahuje uzavřenou část bez dostupného zdrojového kódu) nebo jen nejsou kódy zatím do oficiálního jádra začleněny. V takovém případě je ke stažení na Internetu soubor, který je potřeba stáhnout a rozbalit. Kromě toho je potřeba mít v systému překladač a hlavičkové soubory jádra, pro které
V distribucích jsou k dispozici speciální balíčky, které obsahují hlavičkové soubory a další údaje o konfiguraci právě používaného jádra a které budeme potřebovat. V distribuci Fedora, CentOS nebo RHEL (Red Hat Enterprise Linux) proveďte:
yum install kernel-devel
Po instalaci balíčku se přesvědčte, že aktuální používané jádro je shodné s nainstalovanou verzí balíčku kernel-devel, jinak většina skriptů pro překlad modulů nebude pracovat. Pokud je systém aktuální, stačí ho restartovat (a samozřejmě použít při startu nejnovější jádro). Shodu lze zjistit pomocí příkazů:
$ uname -r 2.6.35.9-64.fc14.x86_64 $ rpm -q kernel-devel kernel-devel-2.6.35.6-48.fc14.x86_64 kernel-devel-2.6.35.9-64.fc14.x86_64 kernel-devel-2.6.37-0.rc6.git0.1.fc15.x86_64
Ve výše uvedeném příkladu příkaz uname -r vypíše aktuálně používanou verzi jádra (zde 2.6.35.9-64.fc14.x86_64). Následující příkaz (rpm -q kernel-devel) vypíše všechny balíčky, které se jmenují kernel-devel zároveň s jejich verzemi. Pro úspěch překladu je důležité, aby v systému byl nainstalován balíček kernel-devel se stejnou verzí, jako je aktuálně spuštěné jádro (zde 2.6.35.9-64.fc14.x86_64), což je zde splněno.
Příklad překlad modulu
V této chvíli je možné přeložit doplňující ovladač(e). Jako příklad si uveďme překlad ovladače pro bezdrátovou kartu Broadcom BCM4313 ze zdrojových kódů na adrese http://www.broadcom.com/support/802.11/linux_sta.php (64bitová varianta):
mkdir broadcom cd broadcom wget http://www.broadcom.com/docs/linux_sta/hybrid-portsrc_x86-64_v5.60.246.6.tar.gz tar xvzf hybrid-portsrc_x86-64_v5.60.246.6.tar.gz make su cp -a wl.ko /lib/modules/$(uname -r)/updates/drivers depmod -a modprobe -r wl b43 ssb modprobe wl dmesg lspci -k
Ve výše uvedeném příkladu se předpokládá, že výše uvedené kapitoly o aktualizaci distribuce a instalaci balíčku kernel-devel byly splněny. Zde pak byl nejprve vytvořen adresář, ve kterém bude probíhat překlad a příkazem cd jsme se do něj přepnuli. Pak byl stažen balíček se zdrojovými kódu modulu a rozbaleny (příkaz tar). Vlastní překlad zajišťuje příkaz make (je řízen souborem Makefile, který je součástí zdrojových kódů modulu). Poté je aktuální uživatel změněn na správce (root) příkazem su a výsledný modul je nakopírován do adresáře s moduly aktuálního jádra (zajišťuje příkaz uname -r, v době psaní to byl adresář /lib/modules/2.6.35.9-64.fc14.x86_64). Modul je umístěn do adresáře, kde jsou očekávány aktualizacemi modulů, protože tento adresář má při zavádění modulu do paměti přednost před moduly na obvyklém místě (tj. podadresář aktuálního jádra kernel/drivers/net/wireless). Poté je příkazem depmod -a provedena aktualizace databáze závislostí mezi moduly. Poté jsou z jádra odstraněny případné aktuální ovladače (příkaz modprobe -r wl b43 ssb) a zaveden právě přeložený modul (příkaz modprobe wl). Zavedení modulu je zkontrolováno výpisem ladících hlášení jádra (příkaz dmesg) a též výpisem zařízení na PCI sběrnici a jejich ovladačů (příkaz lspci -k).
Překlad celého jádra
Při celého jádra je nutné stáhnout celé zdrojové kódy jádra, které jsou k dispozici ve zdrojovém balíčku. Nejprve se přesvědčte, že máte aktuální systém:
yum update
Pak nainstalujte zdrojové kódy jádra:
yum...
TODO
Překlad části jádra
Postupujeme podobně, jako v předchozím případě.
TODO
make drivers/usb/serial make drivers/usb/serial/visor.ko
Záplatování jádra
TODO
Kernel OOPS
Kernel OOPS je hlášení o chybě, která byla v jádře detekována. V některých případech tato chyba vede k zamrznutí celého jádra, ale v mnoha případech to může být pouze varování (jádro se dokáže zotavit a dál dobře fungovat), případně zpráva o chybě v ovladači (který může tímto přestat řádně fungovat).
Externí odkazy
- http://www.kernel.org/pub/linux/kernel/people/gregkh/lkn/lkn_pdf/ch04.pdf – Greg Kroah-Hartman: Linux kernel in a nutshell – Chapter 4: Configuring and Building
- http://fedoraproject.org/wiki/Docs/CustomKernel – FedoraProject.org: Building a custom kernel