Portál AbcLinuxu, 24. května 2025 13:44
Kompletace potřebného software. Kde vzít zdrojové kódy a které použít. Rozdíly kompilace jader 2.6 a 2.4.
Kde kdo byl určitě již postaven před problém typu něco nefungovalo, něco nebylo podporováno. Nebo z čisté zvědavosti prostě stál před výzvou a někdy obávaným úkolem kompilovat vlastní kernel. Pro člověka v Linuxu ne moc zběhlého to může být docela zapeklitá situace. Kompilace sama o sobě je krok, který zvládne téměř každý, kdo pracuje s Linuxem pár týdnů. Mnohdy se ale stane, že i když je vlastní jádro dobře přeložené, je ještě více pomalé než to distribuční a nebo v něm nefunguje plno věcí, jak by mělo.
Zde jsem se zhostil úkolu popsat v několikadílném seriálu nejen samotnou kompilaci, ale především poukázat na to co, kdy a proč dát a nebo nedat do našeho jádra, a co vše je k tomu potřeba. Z obrovské rozsáhlosti jednotlivých subsystémů jádra se pokusím poukázat na ty důležité a nezbytné pro správnou činnost. U některých sekcí se zdržím více. U některých méně nebo téměř vůbec, především tehdy, jedná-li se o některý exotický hardware nebo funkci v normálních podmínkách nepotřebnou. Začátečník i pokročilý uživatel by si měli přijít na své. Právě pro ty je tento seriál směřován.
Pro kompilaci kernelu je potřeba obstarat si zdrojové kódy. Je možné použít ty, které jsou přibaleny v distribucích (u některých distribucí to doporučuji, pokud nechcete ztratit některé její funkce a vlastnosti), což není pravidlem. Je možné použít i zdrojové kódy jádra zcela čisté, bez přídavných záplat a doplňků, jimiž se liší různé distribuce. Osobně se přikláním k použití zdrojových kódů, jak se říká, přímo od výrobce tzv. vanilla kernel.
Vždy se nejprve podívejte na www.kernel.org, kde je vidět aktuální situace okolo verzí Linuxu. Tam je možné stáhnout čisté zdrojové kódy - vanilla karnel.
V článku Patchsety pro kernel jsou popisovány různé patchsety, tj. sady patchů připravené pro aplikaci na vanilla jádra.
Po stažení zdrojových kódů (např. linux-2.6.13.tar.bz2) budeme potřebovat pro jejich rozbalení programy GNU tar, bzip2 (pro .tar.bz2) nebo gzip (pro .tar.gz), které jsou součástí všech distribucí.
Má-li někdo starší verzi zdrojových kódů, má možnost je aktualizovat
aplikováním záplat (tzv. patchů). Musí být však splněna podmínka:
aktualizovat se musí postupně, takže pokud chci zdrojové kódy verze 2.6.10
aktualizovat na 2.6.12, musí se aplikovat nejprve patch na verzi 2.6.11 a
následně patch na verzi 2.6.12. Pro patchování jádra je potřeba mít
program patch. Pokud již systém obsahuje
zdrojové kódy (nalézají se v /usr/src/
) a chceme je
záplatovat/aktualizovat, provedeme nakopírování patche na příslušné místo
a aplikujeme jej:
cp patch-2.6.13.bz2 /usr/src/linux-2.6.12
bzip2 -dc patch-2.6.13.bz2 | patch -p1
nebo
gzip -cd patch-2.6.13.gz | patch -p1
V případě, kdy zdrojové kódy ještě v systému nemáme, rozbalíme patřičný balíček, např:
cp linux-2.6.13.tar.bz2 /usr/src
tar -xvjf linux-2.6.13.tar.bz2
nebo
tar -xvzf linux-2.6.13.tar.gz
Dále je vhodné vytvořit symbolický link na adresář se zdrojovými kódy.
cd /usr/src
ln -s linux-2.6.13 linux
Po rozbalení je vhodné se podívat na soubor
/usr/src/linux/Documentation/Changes
, který obsahuje mimo
jiného také souhrn programů a jejich verzí potřebných pro kompilaci a
správný běh jádra. To se může čas od času měnit, proto je vhodné ověřit
si, zda náš systém obsahuje požadované programy.
I když nyní trochu předběhnu, popíši zde postup kompilace jádra. Nutný předpoklad je mít vybrané potřebné součásti kernelu před vlastní kompilací. Výběru komponent se budou týkat následující díly tohoto seriálu. Uvádím zde postup předčasně pro případné zájemce a pro ty, kdo chtějí experimentovat a zkusit si sestavit vlastní kernel ihned.
V první fázi, pokud kompilujeme jádro ze stávajících zdrojových
kódů poprvé, je nutné provést make mrproper
, přeskočení
tohoto kroku je častou příčinou neúspěšné kompilace nebo vytvoření chybně
pracujícího jádra. Pokud jsme však již jádro kompilovali a provedeme
make mrproper
, pak dojde ke smazání také souboru
.config
, který ještě můžeme potřebovat.
make mrproper
Pokud budeme kompilovat ze zdrojových kódů, ze kterých se již jádro dříve kompilovalo, musíme smazat existující hlavičkové a binární soubory:
make clean
Jestliže jsme již jádro kompilovali (např. 2.6.12), a chceme použít
existující konfiguraci i pro kompilaci jádra 2.6.13, použijeme existující
.config
:
make oldconfig
Nyní již následuje výber součástí jádra. Zde máme možnost použít několik režimů:
Výběru komponent jádra se budu věnovat v dalších dílech. Nyní následují další kroky po výběru komponent.
Sestavení jádra a modulů se mírně liší u jader řad 2.4 a 2.6:
make dep
- kontrola závislostímake bzImage
- sestavení kernelumake modules
- sestavení modulůmake
- sestavení kernelu a modulůmake modules_install
- instalace modulů do
/lib/modules/linux-X.Y.Z
Zatímco kompilaci je možné provádět jako běžný uživatel, pro instalaci jsou potřeba práva superuživatele.
Po kompilaci nakopírujeme obraz jádra + další soubory do adresáře
/boot
. Doporučuji vytvořit si pro přehlednost i příslušný
podadresář:
mkdir /boot/2.6.13
cp /usr/src/linux/System.map /boot/2.6.13
cp /usr/src/linux/vmlinux /boot/2.6.13
cp /usr/src/linux/arch/i386/boot/bzImage /boot/2.6.13
cp /usr/src/linux/.config /boot/2.6.13 - zálohujeme .config
Závěrečným krokem je nastavení zavaděče LILO nebo GRUB:
image = /boot/2.6.13/bzImage
label = linux-2.6.13
root = /dev/hda1 # oddíl, na kterém je kořenový adresář /
Nezapomeneme nainstalovat LILO do MBR příkazem lilo
.
title Linux-2.6.13
root (hd0,0)
kernel /boot/2.6.13/bzImage ro root=/dev/hda1
Úvodní díl nás seznámil s vlastní kompilací. V následujícím díle se zaměřím na zjišťování informací o našem hardware, které bude potřeba pro výběr jednotlivých komponent.
pokud se spokojíte s tím, že jsou všechny soubory přímo v /bootSpíš pokud se spokojíme s tím, jak to chce vendor distribuce. Při instalaci se volá /sbin/installkernel.
make clean
' obejdete.
make clean
při nové kompilaci jádra z už jednou použitých zdrojáků. Když například zjistím, že by se mi hodilo mít ještě nějaký modul v jádře, tak překladač může použít *.o soubory které už jednou zkompiloval. Nebo se mýlím?
No, dál to vypisovat nebudu, ale po téhle stránce jsi to nezvládl.
cd /usr/src
ln -s linux-2.6.13 linux
:-O A na to jsi přišel jak? Co je na tom? Přečti si http://linuxmafia.com/faq/Kernel/usr-src-linux-symlink.html - za tohle si pochvalu nezasloužíš.
cp /usr/src/linux/.config /boot/2.6.13 - zálohujeme .config
Není na tohle nějaká šikovná volba v kernelu? Třeba CONFIG_IKCONFIG?
/usr/include/linux -> /usr/src/linux/include/linux /usr/include/asm -> /usr/src/linux/include/asm-i386V /usr/include/linux a /usr/include/asm vsak maju byt hlavickove subory, za pouzitia ktorych bola skompilovana kniznica GNU libc a nie subory z naposledy skompilovaneho kernelu. Dnes sa pri kompilacii GNU libc pouzivaju dokonca mierne upravene include subory z balika linux-libc-headers, ktory dava dokopy Mariusz Mazur. Tento balicek sa da najst na adrese: http://ep09.pld-linux.org/~mmazur/linux-libc-headers/ Pouzitie najnovsich hlavickovych suborov pri kompilacii GNU libc neznamena ze je mozne pouzit uz len Linux verzie takej ake su hlavickove subory alebo vyssej. To sa zabezpecuje volbou --enable-kernel=X.Y.Z pri kompilacii glibc.
No, dál to vypisovat nebudu, ale po téhle stránce jsi to nezvládl.Chyby tohoto typu jdou na moji hlavu.
O konfiguračních volbách budou další díly, ne? Pokud tím myslíš, že zálohování souboru .config je díky možnosti uložení konfigurace do jádra zbytečné, tak s tím nesouhlasím. Mnohdy se totiž může hodit konfigurační soubor k jádru, které ti zrovna neběží.cp /usr/src/linux/.config /boot/2.6.13 - zálohujeme .config
Není na tohle nějaká šikovná volba v kernelu? Třeba CONFIG_IKCONFIG?
Nechci (a snad to ani nedělám) se hádat o "mnohdy" - obvykle mi doma běží jeden kernel (říkejme mu) stabilní, další - originální distribuční - se toulá někde na disku a třetí - up-to-date - právě kompiluju. Věren "podle sebe soudím tebe" jsem předpokládal, že ostatní jsou na tom stejně.
Ještě ke včerejší debatě - napadl mě argument proti make bzImage. (Omlouvám se za nenavazující příspěvek, kdyby to vadilo, tak ho někdo smažte.)
Kdysi jsem na nějaký stařičký stroj (12 MB RAM?, 200 MB hdd) instaloval linux. Hledal jsem rozumně aktuální distribuci, kterou by bylo možné nainstalovat. Zkoušel jsem RockLinux. Jeho instalační balíčky jsou baleny bzip2kou a vůbec se mi nepodařilo nainstalovat base_system, protože to prostě nešlo rozbalit. Včera mě napadlo, že může existovat platforma, na které není bzip2 z nějakého důvodu použitelný nebo neexistuje. Protože je snaha, aby byl linux přenositelný, měl by být přenositelný i proces kompilace kernelu. Tím spíš, že je algoritmicky snadno zvladatelné. (Možná je to příliš umělá myšlenková konstrukce .)
Jinak k těm adresářům v /boot - tam se mi líbí trošku jiný systém. (But hey, this is a free software, you are free to use it your own way.) Už asi dva roky si říkám, že to tak udělám, ale ještě k tomu nedošlo - sdílená /boot partition. V /boot by pak byly adresáře pro jednotlivé distribuce. V případě grubu s tím není problém, s lilo by asi pomohl symlink /etc/lilo.conf -> /boot/<distro_id>/lilo.conf.
To nezpochybňuju. Jen to není nutné, protože ten .config získáš z běžícího kernelu, pokud jsi nastavil CONFIG_IKCONFIG=y. Což má tu výhodu, že se ti to udělá samo, pokud přenášíš .config mezi jednotlivými verzemi. (Já to nedělám, .config používám jen v rámci např. 2.6.12.x vzhledem k současnému způsobu vývoje.) Představ si, že zapomeneš na to cp .config ... a smažeš zdrojáky. No, tobě to třeba nevadí, protože kompiluješ kernel skoro tak často jako já a znáš ty volby.
Samostatný oddíl na /boot je ve stroji s jedním linuxem asi skutečně k ničemu. Mrknu se na notebook, jestli tam mám /boot samostatně... aha, nemám. Tak buď je to náhoda, nebo mám zrovna v tomhle asi jasno
.
Btw. ale doma mám 3 disky a jen na jednom z nich mám 12 partition. A níž nejdu.
))
2/ speciální oddíl pro /boot pochází hlavně z historie, kde to bylo kvůli LILO zavaděči, který neuměl číst za 1024 cylindrem. Když to vezmu kolem a polem, tak nevidím rozumný důvod, prč dávat /boot na speciální oddíl.
Jeden důvod bych vědel. Když uživatel chce používat reiser4 jako kořenový filesystém a grub jako bootloader, tak mu nezbyde než buď opatchovat grub nebo udělat extra oddíl pro /boot a jako filesystém dát jeden z mnoha podporovaných.
Když to vezmu kolem a polem, tak nevidím rozumný důvod, proč dávat /boot na speciální oddíl.Jednoduchy priklad - mam cryptovany souborovy system. Bez samostatneho necryptovaneho /boot bych to ani nahodou nerozjel :)
obvykle mi doma běží jeden kernel (říkejme mu) stabilní, další - originální distribuční - se toulá někde na disku a třetí - up-to-date - právě kompiluju.U mě to vypadá tak, že po kompilaci a instalaci nového jádra ještě ponechávám nějakou dobu na disku to, které nahrazuji. Když je s nově zkompilovaným něco v nepořádku, pak se mi hodí .config z toho předchozího, o kterém vím, že fungovalo správně.
Jinak k těm adresářům v /boot - tam se mi líbí trošku jiný systém. (But hey, this is a free software, you are free to use it your own way.)Asi tak. Taky to dělám jinak, ale i popsaný způsob má své výhody. Je pravda, že samotnou kompilaci provádím ve svém $HOME, ale při přípravě článku mě nenapadlo na to autora upozornit.
http://linuxmafia.com/faq/Kernel/usr-src-linux-symlink.htmlPíše se rok 2005...
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.