Obsah

Hlavní stránka

Jádro

První linuxové jádro spatřilo světlo světa v roce 1991. Mezitím uplynulo šestná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. soubory 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 defaultní 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 (září 2007) byla 2.6.22.5. Každá z částí číselné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í. 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 22.5 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.22.5-76.fc7. „Číslíček“ je tedy poněkud více. Vedle patch levelu, vedlejší a hlavní verze jádra figuruje ve výpisu také číslo 76. To značí verzi patch levelu pro potřeby projektu Fedora. Označení fc7 pak znamená, že se jedná o jádro určené pro Fedora 7.

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žit2). 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/sda

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

Písmeno b značí, že disk sda je blokovým zařízením. Znakové soubory zařízení jsou pak 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 samostatné 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 v adresáři /lib/modules/cislo_verze_jadra3). 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: Níže popsaný postup je aplikovatelný na tzv. vanila jádro. Fedora však používá jádro modifikované - proto by aplikace patchů níž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 kernel4). Nicméně Vám nic nebrání si stáhnout stáhnout vanila jádro z http://www.kernel.org, na něj 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. Jestliže máte např. jádro 2.6.145) 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řeklad6).

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. Toto jádro je modifikované pro potřeby Fedory a obsahuje některé úpravy oproti tzv. vanila jádru.
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 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 Fedory7), 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 install ncurses-devel. Rozhraní pro konfiguraci jádra se pak spouští z adresáře /usr/src/kernels/verze_jadra pomocí

make menuconfig

 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/verze_jadra pomocí

make gconfig

 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 sda1. 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,0)
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)
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.
3)
Aktuální verzi jádra lze zjistit pomocí uname -r.
4)
Příkaz musí být spouštěn z účtu superuživatele.
5)
Verzi aktuálního jádra zjistíte pomocí uname -r.
6)
Vedle pojmu „překlad“ se také v této souvislosti můžete setkat s pojmem „kompilace“ - jedná se ekvivalenty.
7)
Jedná se o jádra obsažená v distribuci nebo o jádra stažená z repozitářů.