[[obsah|Hlavní stránka]] ===== Jádro ===== {{:navody:48x48:categories:applications-system.png?48 }}První linuxové jádro spatřilo světlo světa v roce 1991. Mezitím uplynulo více než dvacet let - jádro dospělo do verze 4.0 a skládá se z více než 15 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ému((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 ''/sbin/sysctl''.)). Úpravy jádra vyžadují poměrně hluboké znalosti týkající se nejen samotného //Linux//u ale také hardwaru. ====Značení jádra==== Aktuální verze stabilního jádra v době poslední aktualizace tohoto článku (duben 2015) byla 4.0.0.1. Každá z částí číselného označení jádra má svůj význam.\\ Číslo 4 je tzv. hlavní verze jádra a mění se jednou za pár let - jádro 3.0 bylo vydáno v roce 2012.\\ První nula označuje tzv. vedlejší verzi jádra a mění se zhruba každé tři měsíce, kdy vychází nová verze jádra. Každé čtvrté vydání je prohlášeno za vydání s prodlouženou podporou.\\ Další nula označuje tzv. patch level - opravnou verzi. Pomocí patche, které jsou vydávány v řádu týdnů, lze provádět opravy. Aplikací patche tak lze provést aktualizací jádra.\\ Jestliže na Vašem systému zadáte příkaz ''uname -r'' získáte výstup ve tvaru ''4.0.0-1.fc22''. "Číslíček" je tedy poněkud více. Vedle patch levelu, vedlejší a hlavní verze jádra figuruje ve výpisu také číslo 1. To značí verzi patch levelu pro potřeby projektu //Fedora//. Označení ''fc22'' pak znamená, že se jedná o jádro určené pro //Fedoru 22//.\\ ==== Přidání ovladače ==== * Přečtěte si kapitolu [[obecne_poznamky|Obecné poznámky]]. 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žit((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.)). 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: * tzv. "patchováním" jádra * zavedením modulu ovladače 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é [[jadro#Patchování jádra| 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_jadra''((Aktuální verzi jádra lze zjistit pomocí ''uname -r''.)). 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==== * Přečtěte si kapitolu [[obecne_poznamky|Obecné poznámky]]. **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 ''dnf -y update kernel''((Příkaz musí být spouštěn z účtu superuživatele.)). Nic Vám však 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.14((Verzi aktuálního jádra zjistíte pomocí ''uname -r''.)) 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 ==== * Přečtěte si kapitolu [[obecne_poznamky|Obecné poznámky]]. Samotný překlad jádra vyžaduje poměrně hluboké znalosti nejen z oblasti //Linux//u 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řeklad((Vedle pojmu "překlad" se také v této souvislosti můžete setkat s pojmem "kompilace" - jedná se ekvivalenty.)). \\ === Nástroje a knihovny 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ů. Pro překlad jádra a dalších programů ze zdrojových kódů budete potřebova i knihovny různých součástí systému. Tuto skupinu nainstalujete pomocí dnf -y groupinstall c-development === Zdrojové kódy jádra === == Jádro ze src.rpm == **Poznámka:** Níže uvedený postup byl převzat z [[http://www.mjmwired.net/resources/mjm-fedora-f8.html#kernelsrc |www.mjmwired.net]]. Podrobný postup naleznete na stránkách [[http://fedoraproject.org/wiki/Docs/CustomKernel|http://fedoraproject.org]].\\ 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ů. dnf -y install rpm-build Proveďte aktualizaci jádra Vašeho systému. dnf -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. dnf install yum-utils yumdownloader --source kernel --enablerepo updates-source Tento soubor nainstalujete pomocí rpm -ivh kernel-verze_jadra.src.rpm Dále je třeba připravit zdrojové kódy jádra. rpmbuild -bp --target=$(uname -m) /usr/src/redhat/SPECS/kernel.spec Výsledek bude uložen v adresáři ''/usr/src/redhat/BUILD/kernel-2.6.23/''((Jméno adresáře se může mírně lišit v závislosti na aktuální verzi jádra.)). Tento adresář obsahuje podadresáře ''linux-2.6.23-ARCH''((//ARCH// představuje architerturu Vašeho počítače (tj. nejčastěji ''i686''). Typ architektury lze zjistit pomocí příkazu ''uname -m''.)) a ''vanilla''. První z adresářů obsahuje vanilla jádro s aplikovanými patchi z projektu //Fedora//. Druhý adresář obsahuje pouze vanilla jádro. == 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 //Fedory//((Jedná se o jádra obsažená v distribuci nebo o jádra stažená z repozitářů.)), 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.\\ == Překlad jádra == 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 ''dnf -y install ncurses-devel''. Rozhraní pro konfiguraci jádra se pak spouští z adresáře ''/usr/src/kernels/verze_jadra'' pomocí make menuconfig {{ navody:f8menu_config.png | menuconfig }} Chcete-li namísto ''menuconfig'' používat ''gconfig'', je třeba nainstalovat balík //Gnome Software Development// pomocí ''dnf -y groupinstall "Gnome Software Development"''. Rozhraní pro konfiguraci jádra se pak opět spouští z adresáře ''/usr/src/kernels/verze_jadra'' tentokrát však pomocí make gconfig {{ navody: f8gconfig.png | 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/vmlinuz''. cp /usr/src/kernels/verze_jadra/arch/i386/boot/bzImage boot/vmlinuz 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 ''grub.conf'' zavaděče //GRUB// v textovém editoru gedit /boot/grub/grub.conf a přidejte na jeho konec řádky title Kernel nazev_vaseho_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. ---- [[obsah|Hlavní stránka]]