Obsah

Hlavní stránka

Jádro

První linuxové jádro spatřilo světlo světa v roce 1991. Mezitím uplynulo patnáct let - jádro dospělo do verze 2.6 a skládá se z více než 4.5 miliónů řádků (je napsáno převážně v jazyce C a část pak v assembleru). Ačkoliv se dnes pod pojmem Linux rozumí některá z distribucí, správně bychom tímto pojmem měli označovat právě jádro, které je základním kamenem každé distribuce.

Jádro zajišťuje komunikaci mezi aplikacemi a hardwarem. Aplikace komunikují s hardwarem nepřímo přes tzv. souborů zařízení, do/ze kterých zapisují/načítají data. Komunikaci mezi soubory zařízení a hardwarem pak obstarávají tzv. ovladače zařízení.

Ačkoliv defaulní nastavení jádra je pro většinu uživatelů naprosto dostačující, je možné jádro upravit podle Vašich představ. To je možné provést jednak překompilováním jádra, jednak editací souborů v adresáři /proc. Druhá možnost tak představuje jakási zadní vrátka do systému1). Úpravy jádra vyžadují poměrně hluboké znalosti týkající se nejen samotného Linuxu ale také hardwaru.

Značení jádra

Aktuální verze stabilního jádra v době psaní tohoto článku (říjen 2006) byla 2.6.18. Každé z částí čísleného označení jádra má svůj význam.
Číslo 2 je tzv. hlavní verze jádra a mění opravdu vyjímečně - jádro 2.0 bylo vydáno v roce 1996.
Číslo 6 označuje tzv. vedlejší verzi jádra a mění se jednou za několik roků. Souběžně existují vždy tzv. stabilní jádro, které má sudé číslo verze (aktuálně 2.6), a tzv. vývojové jádro, které má číslo liché (aktuálně 2.7). Stabilní jádro je určeno běžným uživatelům a těm, pro které je spolehlivost jádra rozhodující2). V rámci vývojového jádra je pak testována implementace nových vlastností jádra. Jsou-li na vývojovém jádře odstraněny všechny nedostatky, je prohlášeno za stabilní a čísla obou verzí se zvýší o jedna.
Číslo 18 označuje tzv. patch level. Pomocí patche, které jsou vydávány v řádu měsíců, lze provádět opravy/úpravy stávajícího jádra včetně přidání nových ovladačů. Aplikací patche tak lze provést aktualizaci jádra.
Jestliže na Vašem systému zadáte příkaz uname -r získáte výstup ve tvaru 2.6.17-1.2187_FC5. „Číslíček“ je tedy poněkud více. Vedle patch levelu, vedlejší a hlavní verze jádra figuruje ve výpisu také číslo 1.2187. To značí verzi patch levelu pro potřeby projektu Fedora Core. Označení FC5 pak znamená, že se jedná o jádro určené pro Fedora Core 5.

Přidání ovladače

Jak již bylo zmíněno výše, ovladač zařízení zajišťuje komunikaci systému s konkrétním hardwarem. Jádro samotné obsahuje některé ovladače (např. ovladače pro systémy souborů), nicméně převažuje snaha vytvořit nad jádrem vrstvu s ovladači. Ovladač tak není integrální součástí jádra, ale má podobu modulu, který je v případě potřeby jádrem načten. To s sebou přináší několik výhod. První je, že ovladač musí být naprogramován „čistěji“ než kdyby byl „zabastlen“ přímo do jádra. Další výhodou je, že nové ovladače lze jednoduše do jádra připojit a není třeba znovu kompilovat jádro. Třetí výhodou je úspora operační paměti. Kdyby všechny ovladače musely být přímou součástí jádra, bylo by toto jádro při současném množství hardwaru neúměrně velké a zabíralo by zbytečně příliš mnoho operační paměti.

Soubor zařízení

Každý hardware má svůj tzv. soubor zařízení. Přes tento soubor pak probíhá komunikace mezi aplikacemi a příslušným hardwarem. Soubory zařízení jsou umístěny v adresáři /dev (s vyjímkou síťových zařízení). Každý soubor zařízení má tzv. hlavní a vedlejší číslo. Hlavní číslo definuje, jaký konkrétní ovladač má být pro daný hardware použit3). Vedlejší číslo, nazývané také číslo jednotky, je jakýmsi pořadovým číslem zařízení.
Existují dva typy souborů zařízení - blokové a znakové. Blokové umožňují čtení/zápis po tzv. blocích (skupina bajtů; obvykle násobek 512); znakové pak po bajtu. Typickým příkladem blokového zařízení je pevný disk; příkladem znakového zařízení pak klávesnice. To, zda-li je jedná o blokové nebo znakové zařízení, lze poznat podle prvního znaku rozšířeného výstupu příkazu ls.

ls -l /dev/hda

brw-r----- 1 root disk 3, 0 říj  9 18:28 /dev/hda

Písmeno b značí, že IDE disk hda je blokovým zařízením((Znakové soubory zařízení jsou označeny písmenem c.)).

Ovladač zařízení

Samotný ovladač je možné do jádra přidat následujícími způsoby:

V této kapitole se budeme zabývat zavedením modulu ovladače do jádra. O přidání nových ovladačů do jádra pomocí tzv. patchů se můžete dočíst v této kapitole.

Nejvýhodnějším způsobem přidání ovladače do jádra je jeho zavedení ve formě tzv. modulu. Moduly distribuované společně s jádrem jsou uloženy adresáři /lib/modules/cislo_verze_jadra4). Příslušný ovladač lze velice snadno zavést pomocí

/sbin/insmod /lib/modules/verze_jadra/kernel/drivers/typ_zarizeni/ovladac.ko

Jestliže jste při použití příkazu insmod získali chybové hlášení symbols missing, došlo k porušení závislostí zaváděných ovladačů. O potřebné závislosti se při zavádění modulů postará příkaz modprobe.

/sbin/modprobe ovladac

Nejprve je však třeba vytvořit soubor, který obsahuje informace o vzájemných závislostech mezi jednotlivými moduly. Toho lze dosáhnout pomocí příkazu

/sbin/modprobe -c

který vytvoří soubor /etc/modprobe.conf. Ten obsahuje závislosti všech aktuálně používáných modulů. Druhou možností je použít příkaz depmod.

/sbin/depmod -a

Ten vygeneruje soubor /etc/modules.dep obsahující všechny závislosti mezi moduly v adresáři /lib/modules/verze_jadra.

Odstranění ovladače z jádra lze provést pomocí

/sbin/rmmod ovladac

nebo restartem počítače. Pro permanentní zavedení modulů je třeba zapsat příslušný příkaz pro natažení ovladače do souborů typu rc - např. na konec souboru /etc/bashrc.

Výpis všech aktuálně natažených modulů získáte pomocí

/sbin/lsmod

Poznámka: Některé moduly mohou vyžadovat zadání parametrů (např. obsluhu přerušení IRQ). Více informací by mělo být součástí návodu k použití příslušného ovladače.

Patchování jádra

Poznámka: Výše popsaný postup je aplikovatelný na tzv. vanila jádro. Fedora Core však používá jádro modifikované - proto by aplikace patchů výše popsaným způsobem pravděpodobně měla za následek nefunkčnost systému. Jednodušší (a v drtivé většině případů naprosto dostačující) je provést aktualizaci jádra pomocí příkazu yum -y update kernel5). Nicméně Vám nic nebrání si stáhnout stáhnout vanila jádro z http://www.kernel.org, na něj následně aplikovat patche a následně jádro přeložit (viz. dále).

Patch je aktualizací jádra, která může mimojiné obsahovat také nové ovladače. Instalaci patche lze provést pomocí příkazu

gunzip -c cesta_k_patch_souboru/patch_cislo.gz | patch -p1

spuštěného z adresáře obsahujícího zdrojové kódy jádra (standardně se jedná o adresář /usr/src/kernels/cislo_verze_kernelu).
Samotné jádro ovladače i jednotlivé patche naleznete na stránkách http://www.kernel.org (např. jádro 2.6 včetně patchů naleznete zde). Jestliže máte např. jádro 2.6.146) a chtěli byste provést jeho aktualizaci na verzi 2.6.17, musíte stáhnout patche 2.6.15, 2.6.16 a 2.6.17 a tyto pak postupně nainstalovat. Jestliže nebude pořadí instalace patchů dodrženo nebo bude některý patch aplikován vícekrát, skončí tato operace nezdarem.

gunzip -c cesta_k_patch_souboru/patch-2.6.15.gz | patch -p1
gunzip -c cesta_k_patch_souboru/patch-2.6.16.gz | patch -p1
gunzip -c cesta_k_patch_souboru/patch-2.6.17.gz | patch -p1

Překlad jádra

Samotný překlad jádra vyžaduje poměrně hluboké znalosti nejen z oblasti Linuxu ale také hardwaru. Jestliže Vám pojmy jako TCP/IP, PCI nebo x86 nic neříkají nebo nevíte, jaký má Váš počítač CPU a zvukový čip, překlad jádra se Vám nejspíše napoprvé nepodaří. Nicméně následující postup je relativně bezpečný a není jím co zkazit. Úspěšné zkompilování jádra je tedy otázkou Vaší trpělivosti a času, který máte k dispozici.
Pokud chcete provádět překlad jádra, musíte mít k dispozici zdrojové kódy jádra a nástroje potřebné pro samotný překlad7).

Nástroje pro překlad jádra

Nástroje potřebné pro překlad jádra jsou obsaženy v balíčku vývojových nástrojů. Tento balíček nainstalujete pomocí

yum -y groupinstall "Development Tools"

Jádro ze src.rpm

Poznámka: Níže uvedený postup byl převzat z www.mjmwired.net.
Pro překlad jádra můžete použít zdrojové kódy připravené v rámci projektu Fedora Core. Toto jádro je modifikované pro potřeby Fedora Core a obsahuje některé úpravy oproti tzv. vanila jádru. Překlad těchto zdrojových kódů je nesrovnatelně jednodušší než překlad vanila jádra.
Nejprve nainstalujte balíček rpm-build. Tento balíček obsahuje skripty a programy, které se používají pro tvorbu balíčků.

yum -y install rpm-build

Proveďte aktualizaci jádra Vašeho systému.

yum -y update kernel

Restartujte počítač, abyste „natáhli“ nové jádro. Po té vytvořte adresář /opt/kernel a nastavte ho jako pracovní.

mkdir /opt/kernel
cd /opt/kernel

Do adresáře /opt/kernel stáhněte soubor kernel-verze_jadra.src.rpm, který obsahuje zdrojové kódy.

yum install yum-utils
yumdownloader --source kernel --enablerepo updates-source

Tento soubor nainstalujete pomocí

rpm -ivh kernel-verze_jadra.src.rpm

Nyní je možné přistoupit k samotnému překladu jádra. Před samotným překladem je možné provést ruční editaci konfiguračního souboru kernel-verze_jadra-architektura.config. Konfigurační soubor bohužel neobsahuje nápovědu pro jednotlivé položky, což činí případnou modifikaci souboru kernel-verze_jadra-architektura.config poněkud problematickou.

 gedit /usr/src/redhat/SOURCES/kernel-verze_jadra-architektura.config

Samotnou kompilaci zdrojových kódů jádra pak spustíte pomocí příkazů

 cd /usr/src/redhat/SPECS
 rpmbuild -bb --target architektura kernel-2.6.spec

Výsledný rpm balíček pak naleznete v adresáři /usr/src/redhat/RPMS/architektura/.

Poznámka: Architekturu Vašeho počítače zjistíte pomocí příkazu uname -m.

Jádro z www.kernel.org (tzv. vanila jádro)

Druhou možností je stáhnout zdrojové kódy vanila jádra ve formě '.gz' popř. '.bz2' souborů přímo na stránkách http://www.kernel.org. Tyto komprimované soubory mají velikost 40 - 50 MB v závislosti na použitém komprimačním formátu a verzi jádra.
Stáhněte příslušný soubor se zdrojovými kódy ze stránek http://www.kernel.org.

Přesuňte se do adresáře /usr/src/kernels.

cd /usr/src/kernels

Nakopírujte do tohoto adresáře soubor se zdrojovými kódy vanila jádra pomocí příkazu

mv cesta_k_souboru_se_zdrojovými_kody/verze_jadra.tar.gz /usr/src/kernels/verze_jadra.tar.gz

popř.

mv cesta_k_souboru_se_zdrojovými_kody/verze_jadra.tar.bz2 /usr/src/kernels/verze_jadra.tar.bz2

v závislosti na typu komprimovaného souboru. Soubor pak rozbalte pomocí příkazů

gunzip verze_jadra.tar.gz

popř.

bunzip2 verze_jadra.tar.bz2

Původní soubor se zdrojovými kódy vanila jádra pak můžete smazat pomocí příkazu

rm -f verze_jadra.tar.*

Poznámka: Pokud budete chtít použít patche, aplikujte je pouze na vanila jádro. Jestliže používáte jádro upravené pro potřeby Fedora Core8), mohla by aplikace patchů vést k problémům. Obecně platí, že je jednodušší stáhnout nejakutálnější verzi jádra, která již obsahuje případné patche.
Nyní následuje samotný překlad jádra. Přesuňte se do adresáře /usr/src/kernels/verze_jadra, který obsahuje zdrojové kódy jádra.

cd /usr/src/kernels/verze_jadra

Překlad spustíte pomocí příkazu

make config

*
* Linux Kernel Configuration
*
* 
* Code maturity level options
*
Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?]

Na jednotlivé otázky odpovídáte Y (ano), n (ne). Jestliže si odpovědí nejste jisti, zadejte ? a u většiny položek se Vám zobrazí podrobnější popis. V řadě případů Vám bude nabídnuta ještě další možnost - m. Pomocí této volby nebude odpovídající část kódu zapracována přímo do jádra, ale bude přeložena ve formě modulu.
Nastavení jádra pomocí config je téměř nadlidský úkol - k jednotlivým otázkám se není možné vracet a každá chyba tak znamená, že je třeba celé martýrium opakovat od začátku. Navíc není možné odpovědět pouze na část otázek, odpovědi uložit a pokračovat později. Z tohoto důvodu je vhodnější použít grafické nádstavby menuconfig nebo gconfig.

Výše zmiňovanou volbu menuconfig je možné použít i textovém režimu. Je třeba pouze nainstalovat knihovnu ncurses-devel pomocí příkazu yum -y ncurses-devel. Rozhraní pro konfiguraci jádra se pak spouští z adresáře /usr/src/kernels/vezre_jadra pomocí

make menuconfig

Chcete-li namísto menuconfig používat gconfig je třeba nainstalovat balík Gnome Software Development pomocí yum -y groupinstall „Gnome Software Development“. Rozhraní pro konfiguraci jádra se pak opět spouští z adresáře /usr/src/kernels/vezre_jadra pomocí

make gconfig

Pro konfiguraci jádra je třeba postupně procházet jednotlivé položky a u každé vybrat tu možnost, která nejlépe odpovídá Vašim požadavkům. Po té je třeba konfiguraci uložit a je možné přistoupit k samotnému překladu. Do příkazové řádky zadejte postupně následující příkazy

make dep
make clean
make bzImage
make modules
make modules_install

Zpracování těchto příkazů může trvat několik desítek minut až hodin v závislosti na konfiguraci Vašeho počítače.
Zkopírujte soubor /usr/src/kernels/verze_jadra/arch/i386/boot/bzImage do souboru /boot/vm linuz a soubor /usr/src/kernels/verze_jadra/arch/i386/boot/System.map do souboru /boot/System.map.

cp /usr/src/kernels/verze_jadra/arch/i386/boot/bzImage boot/vmlinuz
cp /usr/src/kernels/verze_jadra/arch/i386/boot/System.map /boot/System.map

Posledním krokem je úprava zavaděče GRUB, kam je zapotřebí přidat záznam pro Vaše nové jádro. Předpokládejme, že se adresář /boot nachází na disku hda1. Otevřete konfigurační soubor menu.lst zavaděče GRUB v textovém editoru

gedit /boot/grub/menu.lst

a přidejte na jeho konec řádky

title Kernel verze_jadra
root (hd0,X)
kernel /boot/vmlinuz ro root=LABEL=/ rhgb quiet

Po restartování počítače by se v nabídce zavaděče GRUB měl objevit řádek, který reprezentuje Vámi přeložené jádro.

Hlavní stránka

1)
Po restartu počítače však bude obnoveno původní nastavení. Trvalé změny je nutné zapsat do souboru /etc/sysctl.cong popř. nastavit pomocí příkazu sysctl.
2)
Např. těm, kteří používají Linux jako server.
3)
Může dokonce platit, že jedno zařízení může mít několik souborů zařízení a tak používat několik různých ovladačů. Jako příklad lze uvést kazetopáskovou jednotku, kdy různé ovladače mohou definovat různou hustotu zápisu. Výběrem souboru zařízení tak vyberete také ovladač, který má zajišťovat komunikaci s daným hardwarem.
4)
Aktuální verzi jádra lze zjistit pomocí uname -r.
5)
Příkaz musí být spouštěn z účtu superuživatele.
6)
Verzi aktuálního jádra zjistíte pomocí uname -r.
7)
Vedle pojmu „překlad“ se také v této souvislosti můžete setkat s pojmem „kompilace“ - jedná se ekvivalenty.
8)
Jedná se o jádra obsažená v distribuci nebo o jádra stažená z repozitářů.