navody:f7jadro

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
navody:f7jadro [2007/09/17 21:38] mackynavody:f7jadro [2022/11/14 12:25] (aktuální) – upraveno mimo DokuWiki 127.0.0.1
Řádek 1: Řádek 1:
 +[[navody:f7obsah|Hlavní stránka]]
  
 +
 +===== Jádro =====
 +
 +{{:navody:48x48:categories:applications-system.png }}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é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 ''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ě 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 ====
 +  * Přečtěte si kapitolu [[navody:f7obsah#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é [[navody:f7jadro#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 [[navody:f7obsah#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 ''yum -y update kernel''((Příkaz musí být spouštěn z účtu superuživatele.)). 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.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 [[navody:f7obsah#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 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 [[http://www.mjmwired.net/resources/mjm-fedora-f7.html#kernelsrc |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 //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.\\
 +
 +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
 +
 +{{ navody:f7menu_config.png | 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
 +
 +{{ navody: f7gconfig.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/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. 
 +
 +===== =====
 +[[navody:f7obsah|Hlavní stránka]]