- předchozí článek - následující článek - obsah -

Linuxové noviny Prosinec 1997

Kterak jádro přeložiti

Dan Ohnesorg, 28. listopadu 1997

Úvodem si řekněme několik důvodů, proč se vůbec jádra překládají. Drtivá většina distribucí v současné době obsahuje modulární jádro, které se skládá ze základního jádra, jehož možnosti se rozšiřují nahráváním modulů.

Prvním důvodem pro překlad je přeložení základních ovladačů, které jádro potřebuje pro náš hardware, přímo do jádra. To má jednak výhodu v jednodušší konfiguraci systému, protože není nutné natahovat moduly ručně, resp. ze startovacích skriptů a navíc některé ovladače umí v nemodulární verzi najít svůj hardware bez nutnosti zadávat další konfigurační parametry při startu jádra. Zvláště u serverů bych překlad ovladačů do jádra velmi doporučoval. Má to i další výhodu, takové jádro je možné nahrát na jednu disketu a pokud nám nejde namountovat hlavní disk, můžeme nastartovat z této diskety a máme všechno přístupné.

Dalším důvodem pro překlad je zavedení podpory pro specifické zařízení. Poměrně typickým zástupcem této skupiny je řadič pevného disku s obvodem UMC, u kterého je možné po překladu jádra s podporou pro UMC dosáhnout několikanásobného zvýšení rychlosti čtení z disku. U karet NE* je možné nastavovat adresy, na kterých se karta hledá a ovladač lze potom použít i na noname PCI karty kompatibilní např. s NE2500 bez dalších parametrů při startu jádra.

Další skupinou důvodů jsou různé upgrady jádra. Ty jsou nutné buď pro zacelení bezpečnostních děr nebo pro odstranění chyb. Případně pro rozšíření možností jádra. Tady jmenujme např. patche pro možnost čtení dat z CD ve formátu joliet nebo podporu tzv. FAT32.

Dalším důvodem pro kompilaci může být optimalizace jádra z hlediska velikosti nebo výkonu. Optimalizací na výkon se vůbec nebudeme zabývat, není to nic jednoduchého. Jediné co lze snadno ovlivnit je optimalizace jádra pro konkrétní procesor. Všechna jádra používaná pro prvotní instalaci jsou přeložena pro 386. Pokud máme Pentium Pro, je škoda jeho možností nevyužít a nepoužívat vylepšené instrukce. Z hlediska velikosti se jádro optimalizuje tím, že se přeloží jen skutečně potřebné věci, ale v dnešní době dimenzování počítačů na produkty firmy Microsoft je ušetření několika desítek kilobytů paměti zanedbatelné, zvláště u systému, který nemá omezení 640 kilobytů paměti na běh programů. Je třeba upozornit na to, že jádro optimalizované pro Pentium nemusí běžet na intelských klonech od AMD nebo Cyrix, ty potřebují jádro přeložené pro 386.

Pokud jsem Vás přesvědčil, že byste měli s Vaším jádrem něco udělat, čtěte dále, neboť se konečně dostáváme k tomu jak to udělat.

Získání a příprava jádra

Primárním server, odkud je možné jádro získat je ftp://ftp.kernel.org. Jádro se nachází v adresáři /pub/linux/kernel a dále podle verze buď v adesáři v2.0 nebo v2.1. Verze, které mají na druhé pozici liché číslo jsou vývojové a sudé jsou tzv. stabilní. Výhodou vývojových verzí je obvykle širší podpora speciálního hardware, ale nejsou tolik vyzkoušené a proto se nehodí pro kritické aplikace a pro začátečníky také ne. Sice zřídka, ale přece se občas dostane do světa vývojová verze, která nejde přeložit bez oprav přímo ve zdrojových textech. V adresáři s jádrem se vždy vyskytuje soubor LATEST-IS-2.0.32, kde číslo v názvu udává poslední verzi jádra. Jádro si musíme stáhnout na náš počítač. Vhodný postup je následující.

cd /usr/src
ftp ftp.kernel.org
ftp
Login@Pocitac.Domena.cz
cd /pub/linux/kernel/v2.0
binary
get linux-2.0.32.tar.gz
bye

Potom jádro rozbalíme

tar xvzf linux-2.0.32.tar.gz

Parametry příkaru tar znamenají eXtract=rozbal, Verbose=piš co se děje, gunZip=dekomprimuj, File=načti archív ze souboru.

Tip: Pokud používáte distribuce Red Hat nebo Debian, nainstalujte si balík kernel source, pomocí tzv. dependencies (závislostí) se zároveň instalují všechny programy pro překlad potřebné. Jádro, které již pravděpodobně bude poněkud zastaralé, můžete potom smazat.

Aby mohlo být jádro přeloženo musí existovat následující odkazy. To se ověří např. následujícími příkazy:

cd /usr/include
ls -l linux asm scsi
které musí zobrazit příslušné symbolické odkazy

asm -> /usr/src/linux/include/asm/
linux -> /usr/src/linux/include/linux/
scsi -> /usr/src/linux/include/scsi/
Pokud tyto odkazy neexistují, je nutné je vytvořit, a to následovně:

cd /usr/include
rm -rf asm linux scsi
ln -s /usr/src/linux/include/asm asm
ln -s /usr/src/linux/include/linux linux
ln -s /usr/src/linux/include/scsi scsi

Dále je nutné mít v záloze kernel starý. Je to sice nepopulární, ale zálohovat je nutné. Je lepší dělat zálohy hned dvě. První na disketu, to je velmi snadné, nejdříve je ale nutné vědět, kde se kernel v naší distribuci nachází, bude to buď v /vmlinuz nebo /boot/vmlinuz, efektivní metoda jak to zjistit je použití příkazu

more /etc/lilo.conf
a najít řádek na kterém je napsáno image=....

Jádro překopírujeme na disketu, která neobsahuje žádná podstatná data (v průběhu akce bude smazána) příkazem

dd if=/boot/vmlinuz of=/dev/fd0
přičemž první parametr nahradíme skutečnou cestou k jádru a druhý reprezentuje disketu v mechanice. Tímto je vytvořena bootovací disketa. Dále je vhodné zkopírovat jádro do zálohy, např. takto:

cp /boot/vmlinuz /boot/vmlinuz.old
a opravit konfigurační soubor /etc/lilo.conf. Pro úpravu je vhodné použít např. textový editor joe, který má ovládání obdobné jako textový editor Word Star, z nehož vychází ovládání většiny dosových programů. Editor je nutné instalovat zvlášť, distribuce jej obvykle nemají ve standardních volbách. Výsledný soubor by měl vypadat přibližně tak, jak je uvedeno na výpisu Soubor lilo.conf. Pokud je v originále v sekci image nějaký další parametr, jako např. initrd=, musí být také v sekci old.


 boot=/dev/hda
 map=/boot/map
 install=/boot/boot.b
 prompt
 timeout=50

 image=/boot/vmlinuz
 	label=linux
 	root=/dev/hda2
 	read-only

 image=/boot/vmlinuz.old
 	label=old
 	root=/dev/hda2
 	read-only

Výpis 1: Soubor lilo.conf

Nyní je bezpodmínečně nutné zadat příkaz lilo. To je nutné po každé změně jádra nebo konfiguračního souboru /etc/lilo.conf.

Nyní je příprava k překladu hotová.

Konfigurace jádra

Jádro lze konfigurovat v zásadě třemi způsoby. První funguje téměř vždy, ale není tak komfortní jako další dvě varianty. Vyvolá se příkazem
make config
v adresáři /usr/src/linux. Postupně se dotazuje na různé parametry a požadavky uživatele.

Mnohem lepší jsou další dvě varianty. Nejkomfortnější z nich je příkaz

make xconfig
který je nutné spouštět z běžícího X-serveru, tedy nejlépe z xtermu. Po chviličce překladu se objeví okno, ve kterém lze postupně vybrat všechny parametry a požadavky. V případě potřeby se ke každé volbě dá zobrazit nápověda. Tam kde uživatel neví co vybrat, lze doporučit nechat původní nastavení. U některých položek je možné kliknout do sloupce M a ovladač nebo něco jiného se přeloží jako modul.

[ make xconfig ]

Poslední variantou je

make menuconfig

Opět pomocí systému menu umožňuje vybrat vše potřebné.

Při konfiguraci jádra je nutné znát velice přesně konfiguraci počítače. Pokud počítač obsahuje noname karty, je vhodné vědět, jaké obsahují čipy. Není vyloučeno, že čip má v jádře podporu.

Jemné doladění lze provést ještě přímo ve zdrojových textech jednotlivých ovladačů. Drtivá většina z nich je rozdělena na dvě části, první je určena k editaci a druhá ne. Co je možné editovat se pozná snadno, obvykle je to bohatě popsané a okomentované. Např. u síťových karet je možné nastavit vlastní adresy, na kterých se má karta hledat. Je potřeba dát pozor na to, že adresy, které píše počítač při startu jsou v hexadecimálním tvaru a musí se zadávat ve tvaru 0x000, třeba pro síťovou kartu sídlící na typické adrese 300 je nutné zadat 0x300.

Pokud je vše nastaveno, lze spustit překlad příkazem

make

Pro vyzkoušení jádra se překlad spustí příkazem

make bzdisk
s vloženou novou disketou v mechanice a:. To zajistí, že se nové jádro po překladu nakopíruje na disketu a z ní je možné pokusně nabootovat. Hlášky, které systém při startu vypsal si lze prohlédnout stiskem kláves SHIFT a PGUP případně PGDOWN. (Tato kombinace nefunguje, pokud v průběhu startu natahujete obrazovkové fonty, např. češtinu. Natažení totiž maže buffer videokarty.) Pokud je vše v pořádku a počítač se rozběhne, je možné přeložit jádro přímo na disk, to se dělá příkazem

make bzlilo

Pokud byl některý ovladač vybrán jako modul, je nutné přeložit moduly. Tady mohou nastat dvě situace. Buď překládáte jádro stejné verze jako provozujete, nebo se jedná o jádro novější. V prvním případě přejmenujte adresář /lib/modules/verze_jádra na /lib/modules/verze_jádra.old, moduly tam uložené by jinak nesouhlasily s verzí jádra a nebyly by splněny všechny závislosti. V obou případech je možné po vyzkoušení jádra adresář definitivně smazat. Potom je již možné přeložit moduly. K tomu slouží příkaz

make modules
Pokud proběhne úspěšně, je možné moduly instalovat příkazem

make modules_install

Jak se moduly používají

Modul lze do jádra vložit dvěma způsoby - manuálně, nebo si jej jádro pomocí démona, který se jmenuje kerneld, natáhne samo. Druhá metoda není všemocná, ale pro natažení podpory PPP protokolu při startu pppd ji lze použít. Chování kerneld se řídí jeho konfiguračním souborem /etc/conf.modules. Příklad takového souboru je na výpisu Soubor /etc/conf.modules.


 # používaný SCSI řadič
 alias scsi_hostadapter aha1542

 # používaná síťová karta
 alias eth0 3c509

 # modul pro ax25 zatím není k dispozici
 alias net-pf-3 off

 # pokud nepoužíváte IPX
 alias net-pf-4 off

 # pokud nepoužíváte AppleTalk
 alias net-pf-5 off

 # zvláštní nastavení síťové karty
 options 3c509 io=0x300 irq=10

 # zvláštní nastavení jiných karet
 options cdu31a cdu31a_port=0x1f88 \
 		sony_pas_init=1

Výpis 2: Soubor /etc/conf.modules

Pokud nejsou uvedeny aliasy pro net-pf-?, hlásí kernel při startu např.

cannot locate net-pf-4 module
což není žádná zásadní závada. Pro úplnost budiž uvedeno, že soubor conf.modules se může jmenovat i modules.conf, protože kerneld hledá obě varianty.

Alias zpřístupňuje jádru modul pod dalším jménem. Jádro při potřebě ovladače síťové karty natahuje modul eth0, který neexistuje a proto je nutné pomocí aliasu "označit" ten správný. Řádek obsahující options definuje standardní parametry pro start modulu. Pokud je modul natahován z příkazové řádky, mají na ní uvedené parametry přednost.

Druhou možností je vložit modul do jádra ručně. K tomu lze použít dva příkazy, vhodnější je

modprobe název_modulu případné_parametry
Tento příkaz také využívá parametry nastavené v konfiguračním souboru /etc/conf.modules. Umí si sám najít, které další moduly jsou případně pro činnost požadovaného modulu nutné a natáhne je. Pokud má korektně fungovat, je nutné před prvním použitím vytvořit zadáním příkazu

/sbin/depmod -a
seznam závislostí mezi moduly. Většina distribucí tento příkaz spouští při každém startu.

Další možností je příkaz insmod, který dokáže vložit modul o něco "agresivněji" než modprobe. Modprobe tento příkaz volá pro natažení modulu po kontrole verze a závislostí. Pro začátečníka nemá tento příkaz, podle mého názoru, žádný význam.

Pokud není modul po nějakou dobu používán a byl natažen přes kerneld, je automaticky z jádra vyjmut. Většinou se tak stane po 1 minutě. Ručně natažený modul zůstává v jádře trvale. Odstraní se příkazem

rmmod jméno_modulu

Pokud jméno není známé, nebo chceme vědět jaké moduly jádro aktuálně používá, zadáme příkaz

lsmod

Informace o modulech v jádře lze získat také příkazem

cat /proc/modules

Závěrem

Nakonec bych ocitoval několik rad, které lze najít v dokumentaci k jádru, která je uložena v adresáři /usr/src/linux/Documentation. Obsahuje mnoho pokynů ke konfiguraci konkrétních periferií, nastavení jednotlivých karet, kompatibilitě jednotlivých výrobků a podobně.

Nejdůležitější jsou dva soubory - README, ve kterém je popsána instalace jádra a Changes, který obsahuje popis novinek a požadavků pro překlad jádra. Speciálně v případě vývojové řady je často nutné upgradovat některé programy, jako gcc, linker apod. Jak na to, a kde se nové verze nachází je popsáno právě v tomto souboru.

Vývojáři radí nepoužívat zbytečně ovladače, které nejsou potřeba. Některé karty se totiž mohou při hledání zařízení cizím ovladačem zaseknout a potom není možné kartu ovládat ani korektním ovladačem.

Dále není vhodné zapínat ladící parametry jádra (Kernel Profiling), protože takové jádro je pomalejší a potenciálně méně stabilní. Tyto volby jsou určeny především pro vyhledávání chyb a ladění jádra.

Přeji vám mnoho štěstí při kompilaci jádra. *


- předchozí článek - následující článek - obsah -