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