Překlad jádra Linuxu

Z Milan Kerslager
Verze z 21. 12. 2010, 13:28, kterou vytvořil Milan.Kerslager (diskuse | příspěvky) (Příklad překlad modulu: doplnění)
Přejít na: navigace, hledání

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.

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
iwconfig

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). Poté je vypsán stav bezdrátových síťových rozhraní příkazem iwconfig.

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