Překlad jádra Linuxu: Porovnání verzí
m (→Externí odkazy: +link) |
(→Překlad modulu mimo jádro: doplnění) |
||
Řádka 14: | Řádka 14: | ||
yum install kernel-devel | 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 <code>kernel-devel</code>, 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ů: | |
− | mkdir | + | $ '''uname -r''' |
− | cd | + | 2.6.35.9-64.fc14.x86_64 |
− | wget ... | + | $ '''rpm -q kernel-devel''' |
− | tar xvzf ... | + | 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 <code>uname -r</code> vypíše aktuálně používanou verzi jádra (zde 2.6.35.9-64.fc14.x86_64). Následující příkaz (<code>rpm -q kernel-devel</code>) vypíše všechny balíčky, které se jmenují <code>kernel-devel</code> zároveň s jejich verzemi. Pro úspěch překladu je důležité, aby v systému byl nainstalován balíček <code>kernel-devel</code> 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 <nowiki>http://www.broadcom.com/docs/linux_sta/hybrid-portsrc_x86-64_v5.60.246.6.tar.gz</nowiki> | ||
+ | tar xvzf hybrid-portsrc_x86-64_v5.60.246.6.tar.gz | ||
make | 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 <code>kernel-devel</code> byly splněny. Zde pak byl nejprve vytvořen adresář, ve kterém bude probíhat překlad a příkazem <code>cd</code> jsme se do něj přepnuli. Pak byl stažen balíček se zdrojovými kódu modulu a rozbaleny (příkaz <code>tar</code>). Vlastní překlad zajišťuje příkaz <code>make</code> (je řízen souborem <code>Makefile</code>, který je součástí zdrojových kódů modulu). Poté je aktuální uživatel změněn na správce (root) příkazem <code>su</code> a výsledný modul je nakopírován do adresáře s moduly aktuálního jádra (zajišťuje příkaz <code>uname -r</code>, v době psaní to byl adresář <code>/lib/modules/2.6.35.9-64.fc14.x86_64</code>). 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 <code>kernel/drivers/net/wireless</code>). Poté je příkazem <code>depmod -a</code> provedena aktualizace databáze závislostí mezi moduly. Poté jsou z jádra odstraněny případné aktuální ovladače (příkaz <code>modprobe -r wl b43 ssb</code>) a zaveden právě přeložený modul (příkaz <code>modprobe wl</code>). Zavedení modulu je zkontrolováno výpisem ladících hlášení jádra (příkaz <code>dmesg</code>) a též výpisem zařízení na PCI sběrnici a jejich ovladačů (příkaz <code>lspci -k</code>). | |
== Překlad celého jádra == | == Překlad celého jádra == |
Verze z 21. 12. 2010, 13:26
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