Konfigurácia jadra
Juraj Michálek, xmichal5@fi.muni.cz
Obsah
1 Kernel všeobecne
2 Kompilácia kernelu
2.0 Moduly
2.1 Získanie zdrojového kódu
2.2 Zaplátanie kódu
2.3 Štruktúra adresárov
2.4. Konfigurácia jadra
2.4.1 Spustenie konfiguračného nástroja
2.4.2 Nastavenie jadra
2.4.3 Kompilácia a zavedenie jadra
2.4.4 Parametre pri zavádzaní
jadra
Kernel je jadro unixových operačných systémov. Každý unixový systém vykazuje
určité odlišnosti a špecifickú implementáciu. Všetky kernely sa snažia priblížit
sa štandardu POSIX, ktorý predpisuje, čo všetko by mal moderný unixový systém
zvládat. Myšlienkou štandardu POSIX je, aby aplikácie, ktoré sú napísané
podla štandardu bežali na všetkých systémoch dodržujúcich tento štandard.
Na to, aby bola táto požiadavka splnená, je nutné, aby sa aj vývoj jadra operačného
systému riadil zásadami popísanými v POSIXe.
Linuxový kernel, ktorého základná schéma bola inšpirovaná Unixom, začal
svoju históriu v roku 1992. Pri jeho základoch stál Linus Torvalds. Kernel
je distribuovaný pod licenciou GNU/GPL. Kernel bol zozačiatku vyvíjaný pre
procesory typu 386 - cielom vývoja bolo maximálne využitie schopností týchto
procesorov. Po rade procesorov 386 nastúpila rada 486, takže jadro bolo vylepšované
a upravované aj na tento procesor. S rozšírením komunity venujúcej sa vývoju
kernelu prišli na radu dalšie procesory a tak kernel je v súčastnosti schopný
bežat na rôznych typoch procesorov. Sú to procesory ARMs - nasadené firmou
Compaq do iPaqov, Aplha - procesory firmy DEC, trieda procesorov Sparc od
spoločnosti SUN, M68000 od Motoroly, MIPS procesory nasadené aj do malých
prenosných zariadení a procesory PowerPC pre Macintosh. Tým však zoznam
podporovaných procesorov nekončí, linuxový kernel je možné prevádzkovat takmer
na všetkom, pre čo je možné napísat cross kompilátor.
Samotný kernel je možné skompilovat, ako akýkolvek iný program v systéme.
Jeho zdrojové kódy sa nachadzajú na stránkach http://www.kernel.org. Tu sa
nachádza ,,čistý'' kernel, ktorý je spoločným základom pre všetky Linuxové
distribúcie. Slovíčko ,,čistý'' má naznačit, že do kernelu nie sú pridané
žiadne špeciálne rozšírenia, ktoré sú špecifické pre jednodlivé linuxové
dostribúcie. Každá firma, či skupina tvoriaca vlastnú distribúciu tento si
kernel náležite upraví. Pridá logo do framebufferu, prípadne skupiny pracujúce
na minimalistických distribúciach vyhodia nepotrebné kusy kódu.
Pri získavaní balíka so zdrojovým kódom je nutné overit si verziu kernelu.
V súčastnosti (rok 2003) má hodnotu 2.4.20 (stabilná verzia). Číslovanie
verzií kernelu sa skladá z niekolkých častí. Prvé číslo značí major version
number, toto číslo sa mení len v prípade výrazných odlišností (napr. zmena
konceptu systému). Linus Torvalds nie je príliš ochotný toto číslo menit.
Tu stojí za zmienku spor medzi vývojarmi, ktorí presadzovali uvedenie verzie
jadra 3 namiesto verzie 2.6. Hlavnými argumentami pre zmenu major version
number bolo to, že nové jadro obsahujé úplne odlišný systém správy pamäte
a rôzne dalšie významné odlišnosti. Ďalšia hodnota špecifikuje stabilitu jadra
párna (sudá) hodnota značí stabilnú verziu a nepárna (lichá) značí vyvojovú
verziu. Tretie číslo vo verzii kernelu určuje verziu úprav. S každou úpravou,
resp. opravou sa táto hodnota zvyšuje (samozrejme, že sa nejedná o úpravu
jedného riadku kódu, ale o rozsiahlejšiu skupinu úprav). Stabilné verzie
jadra sa príliš nelíšia od predchádzajúcich - v podstate obsahujú len opravy
predchádzajúcich verzií. Vyvojová verzia je velmi premenlivá a verziu od
verzie sa môže jadro znažne odlišovať.
Pri každej zmene verzie jadra je zverejňovaný balík s kompletne novou
verziu a záplata (patch) z predchádzajúcej verzie na novú. Pre udržiavanie
najnovšej verzie jadra je výhodnejšie zaplátat staré jadro patchom, pretože
záplata má pomerne malý objem. Tu je však nutné dat si pozor na to, z akej
distribúcie je zdrojový kód pôvodného kernelu. Ako už bolo spomínané každá
firma (skupina) modifikuje kernel a patch nemusí preto úplne stopercentne
fungovat a môže sa aplikovat len čiastočne, čo vedie k tomu, že nový kernel
nie je možné skompilovat.
Kernel umiestnený na kernel.org neobsahuje všetko, čo by bežný užívatel
očakával. Existujú totiž projekty, ktorých vývojári pracujú relatívne nezávisle
na verzii kernelu a pritom tieto projekty sú dôležitou súčastou systému.
Dobrým príkladom je projekt Alsa - Advanced Linux Sound Architecture, ktorý
je zameraný na tvorbu ovládačov zvukových kariet pre Linux. Samotný kernel
obsahuje podporu len pre velmi malý rozsah zvukových kariet. Množstvo kariet
podporovaných Alsou je pomerne velký a bolo by zbytočné ich pridávat priamo
do jadra. Preto ak váš hardver nie je priamo podporovaný v jadre Linuxu, je
nutné pozriet sa po projektoch, ktoré sa venujú vývoju príslušných ovládačov.
2.0 Moduly
Od jadra 1.2 (rok 1995) je kernel modulárny, tzn. že je možné za behu pridávať
(resp. odoberať) jeho časti - moduly. Moduly slúžia napríklad na ovládanie
hardvéru. Na manipuláciu s modulmy existuje balíček utilít - modutils. Modul
(binárny kód pre procesor) sa do jadra zavedie príkazom insmod, zoznam modulov
získame príkazom lsmod a príkazom rmmod modul z jadra možeme odstrániť.
Zdrojový kód jadra je možné získat na adrese http://www.kernel.org, prípadne
na serveri, ktorý je určený pre danú distribúciu. Ak je kernel inštalovaný
z rpm, deb či iného balíka, tak jeho kód nájdete v adresári /usr/src/kernel-source-verzia,
prípadne v adresári /usr/src/linux (čo často býva len symbolický
odkaz na predchádzajúci adresár). Pokial je k dispozícii tarball so zdrojovými
kódmi, je vhodné rozbalit ho práve do adresára /usr/src.
Inštalácia balíka s kódom jadra (najčastejšie postupy):
- Debian: dpkg -i balík.deb
- Red Hat like: rpm -i balík.rpm
- Source tarball: tar xvjf balík.tar.bz2
V prípade, že už máte k dispozícii zdrojový kód jadra a chcete ho zmenit
na vyššiu verziu, je vhodné použit patch. V adresári, kde je umiestnený kernel
spustite nasledujúci príkaz: patch -p0 < balík_s_patchom. Prípadne
pre komprimované patche použite príslušný dekompresný program:
- gzip -cd patch-verzia.gz | patch -p0
- bzip2 -dc patch-verzia.bz2 | patch -p0
V adresári so zdrojovým kódom jadra je možné nájst niekolko podadresárov
s rozličným významom.
- Documentation - obsahuje dokumentáciu k jadru a modulom, tento adresár
je užitočný v prípade, že užívatel potrebuje získat informácie kóde a poskytovaných
vlastnostiach
- arch - obsahuje súbory, ktoré sú špecifické pre určitú architektúru
procesora
- drivers - obsahuje ovládače pre konkrétny hardver (a je
ich tam požehnane vela)
- fs - obsahuje kódy pre správu súborových systémov (file
systems), podporované Linuxom
- include - obsahuje hlavičkové súbory jadra (samostatne býva
tento adresár dostupný v balíku kernel-headers)
- init - adresár so zavádzačom init procesu
- kernel - základ jadra
- net - práca so sieťou - kódy pre sockety a pod.
- scripts - podporné skripty pre kompiláciu jadra
Kernel obsahuje množstvo kódu a modulov, ktoré nie sú vždy nutné na jeho
prevádzkovanie a pri ich zakompilovaní do jadra, môžu systém spomalovat,
alebo zbytočne zaberat pamäť. Na upresnenie konfigurancie a optimalizácie
kernelu je nutné nastavit volby, podla ktorých sa kernel skompiluje.
V adresári, kde sa nachádza kernel, je možné spustit utilitu make a špecifikovat,
aký spôsob konfigurácie požadujeme:
- make config - spustí sa konfiguračný program, kde je nutné
odpovedat na sériu otázok, čo je pomerne náročné a zdhavé
- make oldconfig - spustí sa konfiguračný program, ktorý prevezme
pôvodnú konfiguráciu zo súboru .config, pôvodná konfigurácia je zachovaná
a minimalizuje sa práca pri výbere balíkov
- make menuconfig - spustí sa textový konfiguračný nástroj,
kde si môžeme zvolit konfiguráciu kernelu (pre tento nástroj je nutné mat
nainštalovanú knižnicu ncurses a príslušné hlavičkové súbory - balík ncurses-devel)
- make xconfig - spustí konfiguračný nástroj pre X Window
systém, jednotlivé volby kernelu je možné ,,vyklikat'' (postavené nat knižnicou
Tk)
Pri nastavovaní položiek z konfiguračného menu si môže užívatel vybrať,
či má byt položka v jadre zabudovaná (built-in) alebo nie. Pri niektorých
položkách je naviac volba module, kedy je príslušný kód uložený do modulu
a je do jadra zavedený iba v prípade, že ho jadro potrebuje. Používanie modulov
umožňuje zmenšit jadro a nechat v ňom len to najnutnejšie na prežitie a
taktiež pridávanie nových funkcii jadru bez nutnosti jeho kompletnej rekompilácie
a reštartu. Tejto vlastnosti jadra sa hovorí modularita - jadro je modulárne.
Pri konfigurácií sú k dispozícii nasledujúce voľby (popísal som hlavné
menu a z ďalších menu som vybral len tie zaujímavejšie voľby, ktoré su prístupné
pre danú oblasť):
- Code maturity level option - umožňuje aktivovat vývojárske časti
jadra, pridávanie nekompletných modulov do jadra. Vhodné pre vývojárov.
- Loadable module support
- Enable loadable module support - podpora pre nahrávanie modulov do
jadra - ak je táto volba vypnutá nie je možné do jadra zaviest žiadny modul
- Processor type and features - určuje typ procesora, pre ktorý je
kernel optimalizovaný a umožňuje zapnút niektoré špeciálne vlastnosti súvisiace
s procesorom
- Processor family - určuje typ procesora pre, ktorý je kernel oprimalizovaný
- je nutné vybrat príslušný procesor. V prípade, že je vybraný nekompatibilný
procesor, je velmi pravdepodobné, že kernel nebude spoľahlivo fungovať
- Machine Check Exeption - umožňuje procesoru informovat kernel, že
bola detekovaná výnimka - napr. prehriatie procesoru. Ďalej je možné nástavit
na aké vynímky bude kernel reagovat.
- High memory support - Linux dokáže na architektúre x86 pracovať až
so 64GB pamäte. Imlicitne je táto volba na hodnote off, čo znamená, že jadro
má pracovat s pamätou do 960 MB. Ďalej je možné zmenit hodnoty na 4GB a 64GB
- Math emulation - po zapnutí tejto voľby jadro detekuje matematický
co-procesor, ak matematický co-procesor je k dispozícii, tak ho používa
na výpočty. V prípade, že co-procesor nie je dostupný, tak ho emuluje. Táto
volba umožňuje prenášat kernel bez závislosti na matematickom co-procesore
- Memory Type Range Register - procesory P6 umožňujú rýchle presuny
velkých oblastí dát, po zapnutí tejto volby je možné dosiahnuť až 2,5 násobné
zrýchlenie systému
- Symetric Multiprocesing - podpora pre viac procesorov na jednej doske
- General Setup - všeobecné nastavenie systému
- PCI support - podpora pre PCI zariadenia
- Support for hot-pluggable devices - podpora pre zásuvné zariadenia,
vhodné aktivovat na notebookoch
- Sysctl support - umožňuje meniť parametre jadra priamo zabehu systému
bez nutnosti jeho reštartovanie. Parametre je možné meniť zápisom do adresára
/proc/sys. (to sa využíva napríklad pri aktivovaní forwardovania pri nasadení
firewallu s maškarádou)
- Kernel support for ELF binaries - umožňuje jadru spúšťať binárky
skompilované v Executable and Linkable formáte. Na niektorých platformách
(prenosné zariadenia) sa napr. používa iný typ linkovania.
- Power Management support - umožňuje správu napájania, posielanie
signálov sleep a shutdown
- Memory Technology devices - špeciálne pamäťové zariadenia, používanie
RAM/ROM/flash pamätí
- Parallel port support - podpora zariadení komunikujúcich cez paralelný
port (využitie napr pri protokole PLIP)
- Plug and Play configuration - podpora zariadení s automatickou detekciou
IRQ a nastavením, pre tieto zariadenia nie je nutné prehadzovat žiadne
jumpery a ani modifikovat hodnoty v BIOSe
- Block devices - podpora blokových zariadení
- Normal floppy disk support - podpora klasickej disketovej mechaniky
- Loopback device support - podpora spätnoväzobného rozhrania - vhodné
pre vývojárov testujúcich softvér pracujúci nad blokovými zariadeniami
- Multi-device support (RAID and LVM) - podpora RAID polí
- Networking options - nastavenie sietových vlastností kernelu
- Packe socket - umožňuje aplikáciam priamu komunikáciu so sieťovými
zariadeniami
- Network packet filtering - podpora pre filtrovanie paketov, túto
voľbu je nutné zapnút v prípade maškarádovania siete
- Socket Filtering - filtrovanie soketov založené na Berkeley Packet
Filter, umožňuje priame filtrovanie socketov
- TCP/IP networking - podpora TCP/IP sietí - po aktivovaní tejto voľby
je možné nastavovať rôzne špeciálne vlastnosti jadra pre TCP/IP protokol,
ako je multicasting, advanced routing, automatickú konfiguráciu siete, tunelovanie
IP protokolu a pod.
- IP: Netfilter Configuration - obsahuje menu s vlastnosťami pre sieťový
filter (skutočne požehnané množstvo vlastností)
- The IPX protocol - podpora pre protokol na konunikáciu v Novellovských
sietach
- QoS and/or fair queueing - správa Quality of Service - umožňuje rozdeľovať
sieťovú kapacitu medzi rôzne sieťové uzly - vhodné pri nasadení počítača
ako routera pre viac podsietí
- SCSI support - využívanie SCSI host adaptéru (ak máte v počítači
SCSI disky - nezabudnite skompilovat príslušný ovládač)
- I2O device support - podpora komunikácie so zariadeniami typu Intelligent
Input/Output (I2O)
- Network device support - podpora sietových zariadení
- Bonding driver support - ak sú k dispozícii dve ethernetové pripojenia
k druhému stroju, po zapnutí tejto voľby je možné ich nakonfigurovať tak,
aby sa tvárili ako jedno s dvojnásobnou rýchlosťou
- Ethernet (10 or 100Mbit) - podpora zariadení pre klasické siete
- PPP (point-to-point protocol) support - podpora pre komunikáciu cez
sériové rozhranie
- Wireless LAN - podpora pre bezdrôtové siete
- IrDA (infrared) support - podpora pre zariadenia konunikujúce infračerveným
signálom
- ISDN subsystem - podpora pre Integrated Services Digital Networks
- Old CD-ROM drivers - sprístupnenie archaických CD-ROM zariadení
- Input core support - podpora pre USB Human Interface Device zariadenia
- Character devices - podpora znakových zariadení (terminálov)
- Virtual terminal - podpora virtuálnych terminálov, umožňuje na
jednej klávesnici prevádzkovať viac virtuálnych terminálov, medzi ktorými
sa dá prepínať pomocou ALT+Fx. Túto voľbu je veľmi vhodné aktivovať, petože
inak si svojho nového Linuxu príliš neužijete.
- Support for console on virtual terminal - konzola je zariadenie,
ktoré dostáva od jadra všetky správy a umožňuje nalogovať nalogovanie do
single user modu. Zapnutím voľby je možné využiť na tieto účely virtuálny
terminál.
- Standard/generic serial support - podpora pre sériové porty
- Support for console on serial port - umožňuje pripojenie konzoly
cez sériový port. Toto je vhodné pri zariadeniach, ktoré nemajú klávesnicu,
príp. zobrazovaciu jednotku. Pripojenie cez sériový port sa využíva napr.
pri vreckových počítačoch.
- /dev/agpgart - podpora pre grafické karty s 3D akcelerátorom
- Video For Linux - podpora pre spracovávanie videa a moduly pre rádio
karty (pozn. k rádio kartám - ak nie je možné presvedčiť rádiokartu, aby
fungovala, je vhodné vyskúšať ruský projekt venujúci sa rádio kartám - fmio)
- File systems - podpora pre súborové systémy
- Quota support - podpora pre kvóty
- Kernel automounter - umožňuje automatické pripájanie súborových
systémov cez sieť
- Reiserfs support - podpora pre žurnálový systém pracujúci na princípe
vyváženého stromu - je rovnako rýchly ako ext2fs, ale efektívnejší pri rozsiahlych
adresároch
- ISO 9660 CDROM file system support - podpora pre súborový systém
bežný na CD-ROM diskoch (ak vypnete, už CDnenačítate)
- NFS file system support - sieťové pripojenie súborových systémov
- SMB file system support - umožňuje pripájať Mrkvosoftie zdieľané
zložky
- NCP file system support - pripájanie fs pre Novell
- Console drivers - podpora pre konzolu
- VGA text console - podpora VGA módu pre konzolu - odporúča sa
zapnúť voľbu
- Video mode selection support - pri štarte jadra je možné parametrom
určiť, aký grafický mód sa bude používať
- Support for frame buffer devices - umožňuje využívať grafickú
medzivrstvu - framebuffer - využíva sa ako náhrada grafického módu na miestach,
kde nie je možné nasadiť systém X
- Sound - podpora zvukových kariet (pre podporu viacerých kariet porite
projekt Alsa)
- OSS sound modules - podpora Open Sound System, vrámci ktorého
je vytvorené jednotné API na prístup k zvukovým zariadeniam
- USB support - podpora USB zariadení
- Bluetooth support - podpora komunikácie cez mdrozub - bezdrotová
konunikácia na krátku vzdialenosť
- Kernel hacking - možnosti pre ladenie kernelu - umožňujú zachytiť
stav systému a prevádzať operácie aj keď nastane zrútenie systému
Po výbere a skonfigurovaní všetkých vlastností je nutné nastavenie uložiť.
Po zdĺhavom konfigurovaní nasleduje ešte zdĺhavejšia fáza kompilácie.
Príkazom make dep, sa vybuduje zoznam závislostí medzi jednotlivými
časťami kódu.
Obraz jadra sa vytvorí príklazom make bzImage.
Bootovacia disketa príkazom make bzdisk.
To isté je možné dosiahnuť príkazom make install, kde naviac
bude zmeneá konfigurácia LILO závádzača.
Obrazy jadra sú najčastejšie umiestnené: /vmlinuz, /boot/vmlinuz,
/bzImage, /boot/bzImage (je nutné nastaviť zavádzač systému, tak aby
zaviedol správny obraz jadra do pamäte)
Ak boli niektoré časti kernelu vybrané ako moduly, je nutné ich skompilovať
príkazom make modules.
Inštalácia modulov sa prevedie príkazom make modules_install.
Nuž a zostáva len reštartovať systém.
Pred zavedením jadra je možné nadefinovat parametre, ktoré sa dajú jadru,
prípadne procesu init na vstup. Parametre sú zapisované v tvare klúč=hodnoty
oddelené čiarkou. Premenné sú oddelené medzerami. (Medzery sa nesmú vyskytovať
v zápise jednej premennej).
Príklad: ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1
- root=/dev/hda1 - určenie zariadenia, ktoré má byť použité ako root
filesystém pri bootovaní systému
- ro - root filesystém je pripojený v móde readonly
- rw - root filesystém je pripojený ako read/write (neodporúča spúšťanie
kontrolnych nástrojov ako fsck)
- mem - špecifikuje dostupnú pamäť (pri zadaní hodnoty nonpentium sa
nepoužíva stránkovanie 4MB page table)
- nfsroot - špecifikuje umiestnenie NFS systému (syntax: nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>])
- debug - spustí ladenie ketnelu - zobrazujú sa rôzne hlášky jadra
- init - umožnuje nstaviť program, ktorý sa spustí po aktivovaní initu
(init=/bin/sh)
- panic - umožňuje definovať čas, po ktorom sa systém pokúsi o reštart
jadra v prípade, že sa jadro dostalo do stavu panic (panic=30)
- vga - špecifikuje grafický mód v ktorom má bežat rozhranie (typicky
je hodnota 80x25)
- video - využíva
- ide0 - umožnuje zadať modul pre ovládanie disku