Kompilace jádra ze zdrojového kódu

Z OpenSUSE Wiki

Přejít na: navigace, hledání

Kompilace vlastního jádra bývá nezřídka neprávem považována za operaci složitou a nebezpečnou. Ve skutečnosti se na současných verzích kernelu jedná o záležitost poměrně triviální a obykle méně rizikovou, než jakou je dnes a denně prováděný update balíků např. grafického prostředí. Současnými verzemi rozumějme v openSUSE dnes již výhradně používaná jádra řady 2.6.

Protože tento článek hodlám směřovat k široké veřejnosti spíše začínajících či mírně pokročilých uživatelů linuxu, jejichž obvykle jedinou motivací ke kompilaci vlastního jádra je zprovoznění relativně nového hardware, jehož podpora v poněkud starším standardním distribučním jádře chybí, nebudu na tomto místě zabíhat do přílišných podrobností a tajů konfigurace ani samotné kompilace.

Představme si tedy následující situaci: Můj starý notebook už dosloužil a protože mi babička podstrčila o vánocích v obálce pár korun a já pak ještě přes prázdniny vzorně v třísměnném provozu hákoval několik týdnů v Kolbence, rozhodl jsem se zakoupit překrásný lehounký a vymoženostmi nabitý notebook nový. Ale ouha. Moje oblíbené openSUSE sice celkem bez problémů nainstaluji, ale wi-fi ne a ne se rozjet a i integrovaná webkamera toho vidí asi tolik jako já deset minut poté, co jsem si jako kluk zkusil nalakovat vlasy pepřovým sprejem. Následuje trocha googlení a osvobozující zjištění, že od jádra toho-a-toho je moje wi-fi a, dá-li pánbůh, i webkamera již podporována. A tak se po troše váhání rozhodnu nové jádro si pořídit.

Obsah

Příprava

Získání zdrojového kódu jádra

Místem, kde jsou vždy k nalezení aktuální zdorojové kódy jádra je bezesporu webová stránka http://www.kernel.org. Většina z nás česky hovořících se ale přecejen obvykle fyzicky nalézá v Evropě, a tak se nám třeba nebude chtít čekat, než kýžený balík kódu překoná půl zeměkoule. Proto navštívíme raději evropský mirror na adrese http://www.eu.kernel.org

Hledáme-li nějakou konkrétní verzi jádra, můžeme se z této jednoduché stránky proklikat až k archivu zdrojových kódů. Pokud nás zajímá pouze aktuální verze jádra, pak se k němu dostaneme přímo odkazem na titulní straně. Stačí kliknout na link "F" (tedy odkaz na balík kompletního zdrojového kódu) na řádku s číslem aktuální verze jádra nadepsaném "The latest stable version of the Linux kernel is:" a odkazovaný balík, jehož jméno bude vypadat např. jako linux-2.6.30.tar.bz2, uložit kam je nám libo. Pro potřeby tohoto návodu budu uvádět jako příklad využití adresáře /install jako zdroje pro instalaci všelijakého software a tedy stažení archivu právě sem. Stažení bych pak provedl pro zmíněné jádro 2.6.30 například příkazy

cd /install
wget http://www.eu.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.bz2

Konkrétní způsob stažení i umístění nicméně ponechávám na zvyklostech čtenáře.

Příprava prostředí pro kompilaci

Před samotnou kompilací je třeba svůj systém na tento proces krapet připravit. Kromě již výše popsaného stažení arhivu zdrojového kódu to obnáší instalaci několika balíků s potřebným software schopným samotného překladu.

cpp
gcc
gcc-c++
glibc-devel
make

POZN.: Uvedený seznam pokládám za dostačující, ačkoli nejsem momentálně s to jej ověřit. Na vlastním systému mám vývojových balíků více. Pokud tedy někdo narazí na potřebu dalších, neváhá je sem doplnit. Kdo chce mít jistotu, že mu nebude nic chybět, může v Yastu vybrat a instalovat pattern "Base Development", což mu nicméně nainstaluje i řadu dalších pro tento návod nepotřebných balíků.



Dále uvedené kroky je třeba provádět pod superuživatelem alias rootem v kozoli/terminálu. Uživatelé KDE si tedy buď otevřou Konsole v "super user modu" nebo svou obyčejnou uživatelskou a rootem se učiní příkazem

su -

a na výzvu zadáním rootova hesla.



Kromě instalace uvedených balíků je ještě potřeba rozbalit dříve stažený archiv zdrojového kódu. Ačkoli moderní jádra jsou schopná kompilace kdekoliv v adresářové struktuře, stále se drží zvyklost rozbalovat zdrojáky do adresáře /usr/src. Pokud se tedy budu držet dříve nastolených cest, tak

cd /usr/src
tar xf /install/linux-2.6.30.tar.bz2

Uvedený postup vytvoří adresář /usr/src/linux-2.6.30, jehož obsahem jsou zdrojové kódy jádra.

Konfigurace budoucího jádra

Jak už jsem uvedl na začátku, nehodlám se v tomto návodu věnovat customizaci jádra. Následující kroky tedy směřují ke konfiguraci kompilace jádra téměř totožné s defaultním distribučním jádrem. Součástí balíku kernel-base, který máme na svém openSUSE 11.1 všichni nainstalovaný, je i soubor /boot/config-<verze_jádra> (v dřívějších verzích openSUSE je tento soubor součástí balíku kernel-default). V něm je uložena konfirace aktuálně nainstalovaného distribučního jádra a poslouží nám tedy jako výtečný základ pro konfiguraci jádra nového. Konfigurace našeho nového jádra bude uložena v souboru /usr/src/linux-<verze_kompilovaného_jádra>/.config (pro tento návod tedy /usr/src/linux-2.6.30/.config). Proto vypadá první krok přenosu defaultní openSUSE konfigurace následovně

cp -p /boot/config-2.6.27.23-0.1-default /usr/src/linux-2.6.30/.config

Verze jádra uvedená ve jménu souboru /boot/config-... odpovídá aktuální verzi distribučního jádra v době psaní tohoto návodu. Na konkrétních instalacích je třeba použít soubor podle příslušné instalované verze jádra.

Samotnou konfiguraci pak provedeme příkazy (i nadále v konzoli po rootem)

cd /usr/src/linux-2.6.30
make oldconfig

Tak se použijí veškerá stávající platná nastavení ze zkopírovaného souboru .config a na volby, které jsou pro dané jádro nové budeme dotázáni interaktivně. Běžný uživatel v 99.9% případů pouze potvrdí defaultní volbu. Není nicméně na škodu si k jednotlivým dotazů pročíst nápovědu, která se zobrazí při zadání "?" namísto odpovědi. U řady voleb se setkáme s tím, že kromě odpovědí "y" a "n", jejichž význam je myslím nasnadě, máme možnost odpovědět rovněž "m". Jde o možnost danou část kódu kompilovat jako tzv. modul. Ten se vyznačuje tím, že není přímou součástí binárního obrazu jádra a nezavádí se tedy nutně ihned při startu systému, kdy nemusí být potřeba. Místo toho se zavede v okamžiku, kdy například připojíme příslušné zařízení. Tím je docíleno toho, že jádro zbytečně nezabírá paměť počítače. V podstatě lze pro běžného uživatele stolního počítače či notebooku jen doporučit v případě, že pro daný dotaz je odpověď "m" dostupná, tuto možnost zvolit. Při dnešních kapacitách disků a výkonech procesorů hádám většina z nás snadno oželí, že uvedený způsob bude znamenat o kousek více místa na disku zabraného moduly a o trochu více času při kompilaci pro daný systém zbytečných modulů. Pokud to však někoho přecejen rozčilovat bude, pak jej na tomto místě odkážu na studium pokročilejších postupů kompilace "poštelovaného" jádra.

Kompilace a instalace

Máme tedy nyní vše připraveno. Prsty se nám již pomalu třesou nedočkavostí, oči se pomalu stěhují směrem vzhůru navrch hlavy nebo naopak se již začínají zavírat, pokud, jako to obvykle dělávám já, jsme se k tomu odvážnému počinu odhodlali až v pokročilejších večerních hodinách. No tak ať se tedy dlouho netěšíme, pojďme rovnou na věc!

Kompilace

Kdo vydržel sledovat celý postup až sem, stojí v tuto chvíli přihlášen jako root v konzoli v adresáři /usr/src/linux-2.6.30 (nebo podobném podle kompilovaného jádra) a pro kompilaci mu už nezbývá nic víc, než napsat příkaz

make

No a pak už jen vařit další a další kafe, spouštět a sledovat různé plasmoidy apod. s informacemi o vytížení a teplotě procesoru a vůbec všelijak podporovat svůj počítač v horečné kompilační práci. Po několika minutách, desítkách minut či snad hodinách, pokud někdo kompiluje na stařičkém Pentiu, bychom však už měli všichni mít to své jadérko na světě.

Instalace

Novotou vonící jádro bychom tedy měli. Zbývá nám ještě přimět ho něco dělat, protože, jak známo, bez práce nejsou koláče a tím méně pak megabajty našeho disku. Stále ze stejného místa (/usr/src/linux-2.6.30) a i nadále jako uživatel root tedy prsty lehce roztřesenými (ale nic se nabojte, při příští kompilaci už to bude lepší a při desáté už si na tuhle prvotní trému ani nevzpomenete) vyťukáme postupně příkazy

make modules_install
make install

A tak se stane, že námi před chvílí zkompilované moduly se ocitnou v adresáři /lib/modules/2.6.30-0.1-default nebo podobném podadresáři v /lib/modules a samotné jádro (vmlinuz-...) spolu s tzv. initial ramdiskem (initrd-...) a "podpůrým" souborem System.map-... pak v adresáři /boot. Za povšimnutí jistě stojí rovněž fakt, že k nemalé změně došlo také v obsahu souboru /boot/grub/menu.lst. (uživatelé LILO zavaděče prominou, ale zde se věnuji tak nějak defaultní instalaci openSUSE, která bude téměř jistě využívat GRUB) Zde by nám mělo příbýt několik řádků, které budou vypadat podobně jako

###Don't change this comment - YaST2 identifier: Original name: linux###
title openSUSE 11.1 - 2.6.30-0.1
    root (hd0,0)
    kernel /vmlinuz-2.6.30-0.1-default root=/dev/suse/root resume=/dev/sda2 splash=verbose showopts vga=0x37d
    initrd /initrd-2.6.30-0.1-default

###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- openSUSE 11.1 - 2.6.30-0.1
    root (hd0,0)
    kernel /vmlinuz-2.6.30-0.1-default root=/dev/suse/root showopts ide=nodma apm=off noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 x11failsafe vga=0x314
    initrd /initrd-2.6.30-0.1-default

Odvážnější z nás rovněž zaujme hned mezi prvními řádky souboru, ten, který praví něco jako

default 2

Ten říká, která položka z menu GRUBu bude předvybrána a tedy které jádro bode defaultně zavedeno, pokud nevybereme jinak. Kdo si troufá, může čísílko na tomto řádku upravit tak, aby ukazovalo na položku pro nové jádro. To bude pravděpodobně "0", protože položky (tedy jednotlivé sekce začínající vždy slovem "title") v menu.lst jsou číslovány od nuly shora směrem ke konci souboru a nové položky se přidávají na začátek. Kdo se cítí spíše konzervativcem, ponechá prozatím default na praxí prověřeném jádře a své nové bude prozatím zavádět po nocích, kdy se nikdo nedívá ručním výběrem z GRUB boot menu. Až jednou nabude dojmu, že vše správně funguje, menu.lst upraví dodatečně.

Třešničky na dortu

Byla to celkem hračka, ne? Napsat pár příkazů a sledovat jak se procesor zapotí a z ventilátorů fouká teplý vánek jako kdybyste zrovna pařili Unreal Tournament nebo Quake III.

Chtělo by se říct, že stačí už jen reboot PCčka a je hotovo. Pro mnohé z nás to tak snad i bude. Jiné čeká ještě pár drobných komplikací (nebo spíš kompilací).

Pokud totiž používáte pro svůj hardware ovladače, které ani v novém jádře nejsou, je třeba je po bootu s novým jádrem doinstalovat. Typicky se bude jednat o ovladače grafik ATI i NVIDIA nebo třeba moduly VMware, pokud ho používáte, či jiné proprietární záležitosti disponující vlastními kernel moduly mimo standardní linuxové jádro. RPM balíky v repozitářích jsou zpravidla vytářeny proti verzím jádra, které jsou rovněž dostupné formou balíků. Proto je nejspolehlivější metodou stažení příslušných instalátorů např. z NVIDIA stránek. Součástí procesu instalace je pak zpravidla i kompilace příslušného jaderného modulu proti dané verzi jádra.

Kdo tedy takové ovladače potřebuje, nespěchá s restartem do nového jádra a nejdříve si opatří odpovídající sadu jejich instalátorů případně projde návody na jejich instalaci.