Keď sedíte za počítačom a čítate tento článok, robíte tak pomocou prehliadača a možno, vám do toho počítač hrá nejakú muziku a tlačí na tlačiarni dokument. Za tým všetkým je, ale schované niečo iné. Nenápadné. Jadro.
Jadro (angl. kernel) má tieto hlavné úlohy:
Pri štarte počítača sa používa dohoda o tom akým spôsobom BIOS odovzdá
riadenie operačnému systému. Táto dohoda prakticky znamená, že po vykonaní
štartovacích testov pamäte a niektorých periférií sa riadenie odovzdá tzv.
boot manager-u. V Linux-e sa najčastejšie používa lilo
,
grub
alebo loadlin
, či boot manažér iného
operačného systému - napr. Windows. Úlohou boot manažéra je nájsť na disku
súbor jadra, nahrať ho do pamäti a odovzdať mu riadenie.
V podstate každý kus hardwaru v počítači potrebuje svoj ovládač. Klávesnica, video-karta, sieťová karta, sériové, paralelné či USB porty, disk, disketová mechanika a tak ďalej. Okrem toho existujú aj ovládače pre algoritmické záležitosti ako sú súborové systémy, sieťové protokoly či rôzne systémy ako napr. APM (advanced power management). Jadro poskytuje množinu funkcií, ktoré umožňujú programom robiť rôzne operácie ako napríklad otvorenie súboru, čítanie a zápis do súboru a podobne.
Moderné operačné systémy sú mnohoúlohové (umožňujú beh viacerých programov
naraz) a mnohoužívateľské (umožňujú prácu viacerých užívateľov naraz). Jadro
sa stará o to, aby rozdelenie výkonu, pamäti, sieťovej priepustnosti bolo
spravodlivo
rozdelené medzi bežiace programy (potenciálne rôznych
užívateľov).
Najčastejšie dôvody pre kompilovanie jadra:
Keď dostanete do ruky inštaláciu Linux-ového systému tak spravidla vlastne máte nejakú distribúciu. Niekto zobral jadro a množinu programov a dal ich dohromady tak aby spolu fungovali. Medzi známe distribúcie patrí RedHat, Debian, Mandrake či Slackware alebo Gentoo. Ten, kto distribúciu zostavuje, sa spravidla postará o to aby ste dostali aj jadro (niekedy máte na výber z viacerých). Toto jadro bolo tvorcom distribúcie nejako nakonfigurované. Spravidla tak, aby podporovalo čo najrozmanitejšie konfigurácie hardwaru a požiadavky užívateľov.
V súčasnosti je veľmi zriedkavo nutné, aby ste jadro kompilovali sami. Linux-ové
jadro je postavené ako skladačka. Skladá sa z mnohých častí, nazývaných moduly, ktoré
nie sú priamo v súbore jadra, ale je možné jadro požiadať o to, aby ich funkcionalitu
nahralo zo súboru dodatočne - už v čase kedy je systém rozbehnutý. Preto je často možné,
že ak vaše jadro neobsahuje podporu pre nejaký hardware, možno do neho túto podporu
doplniť neskôr - nahraním modulu. Niekedy medzi modulmi existujú závislosti. Napríklad ak máte
všeobecnú podporu pre SCSI aj podporu pre SCSI disky ako moduly, tak najprv musíte
nahrať všeobecnú podporu pre SCSI a až potom môžete nahrať podporu SCSI disky.
Nahrávanie modulov (príp. ich odstraňovanie) sa spravidla robí pomocou
programov z balíka modutils
. Veľmi stručne:
lsmod
- vypíše moduly zavedené v pamäti v danom okamihu
# lsmod Module Size Used by ipt_state 1984 0 ipt_limit 2432 0 iptable_nat 22732 0 iptable_filter 2752 0 ip_tables 17920 4 ipt_state,ipt_limit,iptable_nat,iptable_filter ip_conntrack 34560 2 ipt_state,iptable_nat uhci_hcd 30924 0 usb_storage 101328 1
insmod mojmodul
- sa pokúsi zaviesť do pamäti modul mojmodul
# insmod ipt_LOG.ko # lsmod Module Size Used by ipt_LOG 6336 0 ipt_state 1984 0 ipt_limit 2432 0 iptable_nat 22732 0 iptable_filter 2752 0 ip_tables 17920 5 ipt_LOG,ipt_state,ipt_limit,iptable_nat,iptable_filter ip_conntrack 34560 2 ipt_state,iptable_nat uhci_hcd 30924 0 usb_storage 101328 1
rmmod mojmodul
- sa pokúsi zrušiť modul mojmodul
# rmmod ipt_LOG # lsmod Module Size Used by ipt_state 1984 0 ipt_limit 2432 0 iptable_nat 22732 0 iptable_filter 2752 0 ip_tables 17920 4 ipt_state,ipt_limit,iptable_nat,iptable_filter ip_conntrack 34560 2 ipt_state,iptable_nat uhci_hcd 30924 0 usb_storage 101328 1
depmod
- zistí závislosti medzi modulmimodprobe mojmodul
- nahrá modul mojmodul spolu so všetkými
modulmi potrebnými pre jeho beh
# lsmod Module Size Used by uhci_hcd 30924 0 usb_storage 101328 1 # modprobe ipt_LOG # lsmod Module Size Used by ipt_LOG 6336 0 ip_tables 17920 1 ipt_LOG uhci_hcd 30924 0 usb_storage 101328 1
Pridať alebo ubrať modul môže len užívateľ root
.
Druhá varianta pridávania a odoberania modulov je použitie automatického
nahrávania modulov, ktoré ešte spomeniem nižšie.
Ak dospejete k rozhodnutiu, že je nutné skompilovať vlastné jadro, musíme najprv získať jeho zdrojový kód. Existuje viacero variant jadier, ktoré môžete chcieť a preto si najprv treba ujasniť zdrojový kód, ktorého jadra vlastne chceme:
-ac
. Tieto
odnože sa spravidla líšia použitím niektorých experimentálnych algoritmov.
Zdrojový kód jadra má vo forme archívu cez 30MB. Preto v prípade, že máte k dispozícií zdrojový kód staršej verzie, môže vám stačiť zobrať len zmeny oproti tejto staršej verzii - tzv. patch.
Ak máte úplný zdrojový kód jadra rozbaľte ho (tradične sa rozbaľuje do /usr/src):
# cd /usr/src # tar xvfz kernel-2.6.3.tgz
alebo
# cd /usr/src # tar xvfj kernel-2.6.3.tar.bz2
Podľa toho, či máte zdrojový kód jadra komprimovaný programom gzip, alebo bzip2.
Rozbalením vznikne adresár, ktorý nesie meno verzie
/usr/src/linux-2.6.3/
. Je vhodné ho buď premenovať
# mv linux-2.6.3 linux
alebo vytvoriť symbolickú linku
# ln -s linux-2.6.3 linux
tak aby zdrojový kód bol dostupný pod adresárom /usr/src/linux
.
Ak máte patch musíte ho aplikovať na svoje zdrojový kód jadra
# cd /usr/src/linux # gunzip -c patch-2.6.4.gz | patch -p1 -
alebo
# cd /usr/src/linux # bunzip2 -c patch-2.6.4.bz2 | patch -p1 -
Číslo záplaty 2.6.4 znamená, že ho možno aplikovať na zdrojový kód jadra 2.6.3 a jeho aplikovaním získame kód jadra 2.6.4.
Prv než spustíme samotnú kompiláciu musíme povedať čo bude v jadre a čo nie.
Táto informácie je uložená v súbore /usr/src/linux/.config
. Tento
súbor buď musíme vytvoriť, alebo upraviť už existujúci. Ak potrebujete len mierne
upraviť vlastnosti jadra z distribúcie, skúste zistiť či distributér tento súbor
niekde neponúka. Ak ste na zdrojový kód jadra aplikovali patch na vyššiu verziu,
môžete spustiť príkaz (predpokladám, že
sa nachádzate v adresári /usr/src/linux):
# make oldconfig
Tento príkaz zistí aké nastavenia pribudli v novšej verzii a opýta sa vás len na tieto nastavenia. Ostatné zostanú nezmenené.
Ak potrebujeme urobiť kompletnú konfiguráciu alebo meniť pôvodné nastavenia máme na výber niekoľkých možností v závislosti od toho aké prostredie máme k dispozícii:
Tento spôsob patrí medzi historické. Stačí nám ľubovoľný textový terminál. Konfigurácia spočíva v tom, že dostávate rad otázok. Za každou otázkou sú v hranatých zátvorkách uvedené možnosti:# make config make[1]: `scripts/fixdep' is up to date. scripts/kconfig/conf arch/i386/Kconfig # # using defaults found in .config # * * Linux Kernel Configuration * * * Code maturity level options * Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?] Select only drivers expected to compile cleanly (CLEAN_COMPILE) [Y/n/?] ...
.config
je veľkým písmenom a bude
tiež použitá keď otázku jednoducho odklepnete klávesou Enter.
# make menuconfig
ncurses
.
Tak ako v predchádzajúcom prípade môžete zvoliť medzi y/n/m/?# make xconfig
Pri jadrách 2.2 a 2.4 budete potrebovať mať nainštalovaný jazyk Tcl/Tk:
# make gconfig
Nech už zvolíte ľubovoľný spôsob, je isté, že nato, aby ste správne nastavili konfiguráciu budúceho jadra, je vhodné mať dosť rozsiahle znalosti ako o hardwéri, ktorý máte v počítači, tak aj o rôznych subsystémoch. V tom či zvládnete tento krok spočíva 99% úspechu. Ak ho nezvládnete môžete skončiť s jadrom, ktoré nenabootuje alebo nebude podporovať hardware, ktorý máte, alebo nebude efektívne využívať možnosti tohoto hardwaru. Pri niektorých voľbách je tiež vhodné zvážiť na aký účel budete potom celý systém používať.
Ako som už spomínal, pri niektorých nastaveniach v konfigurácii možno zvoliť kompilovanie vo forme modulov. To znamená, že príslušná funkcionalita nebude začlenená do výsledného súboru jadra, ale do iného súboru. Meno tohoto súboru sa zvyčajne (no nie vždy) možno dočítať v nápovede pre danú voľbu alebo v dokumentácii.
Rozhodnutie či kompilovať ako modul, či nie je na vás. Treba ale pamätať
na to, že niektoré distribúcie a niektoré podsystémy očakávajú niektoré
ovládače vo forme modulov. Priveľa niektoré
, takže konkrétne:
je zvykom, že ovládače pre sieťové karty sa kompilujú ako moduly, pretože
to uľahčuje konfigurovanie systému pre použitie viacerých sieťových kariet
kariet naraz. Tiež to uľahčuje odovzdávanie parametrov do ovládača, akými
môže byť IRQ, či DMA. Distribúcie ponúkajú štartovacie skripty, ktoré sa
pokúšajú nahrať postupne všetky moduly až kým nenájdu ten správny pre vašu
sieťovú kartu. Podobne napríklad, podsystém pre podporu zvuku - ALSA -
očakáva ovládače pre zvukovú kartu vo forme modulov.
Zodpovednosť za automatické nahrávanie modulov môžete prenechať podsystému
jadra nazvanému KMOD - Automatic kernel module loading. Tento podsystém,
dokáže automaticky nahrať príslušný modul v čase, keď je potrebný - napríklad
ovládač pre súborový systém FAT sa nahrá v čase, keď sa vykoná
mount
na takýto súborový systém.
Po nakonfigurovaní nám ostáva len spustiť samotné kompilovanie.
Nástroje potrebné na kompilovanie sú popísané v súbore
/usr/src/linux/Documentation/Changes
spolu so spôsobom
ako zistiť verziu nástrojov, ktoré máte nainštalované:
o Gnu C 2.95.3 # gcc --version o Gnu make 3.79.1 # make --version o binutils 2.12 # ld -v o module-init-tools 0.9.10 # depmod -V ...
a tiež informáciu, kde získať aktuálne verzie týchto nástrojov:
o <ftp://ftp.gnu.org/gnu/gcc/> o <ftp://ftp.gnu.org/gnu/make/> o <ftp://ftp.kernel.org/pub/linux/devel/binutils/> ...
Ak na vašom systéme potrebné nástroje nemáte, môže to byť kvôli tomu, že len nie sú súčasťou typickej inštalácie vašej distribúcie - takže sa najprv pozrite či sa nedajú odinštalovať.
Ak váš systém má potrebné nástroje, môžeme sa pustiť do kompilácie. Opäť je rozdiel medzi verziami 2.6 a nižšími. Ak máte konfiguráciu urobenú správne a chcete skompilované jadro hneď aj nainštalovať môžete to urobiť takto:
# make dep clean bzlilo modules modules_install
# make bzlilo modules modules_install
To čo nasleduje, za príkazom make, je takzvaný cieľ. Existuje mnoho cieľov, ktoré môžete použiť. Tu je ich stručný popis:
/usr/src/linux
.
Táto voľba je nutná pri jadrách do verzie 2.4.
/usr/src/linux/arch/i386/boot
(za predpokladu, že kompilujete
na IBM kompatibilnom PC-čku). Pri tomto cieli sa nekompilujú moduly./lib/modules/{verzia jadra/
bzImage
ale výsledné jadro je automaticky
nainštalované pomocou lilo
. Predpokladom je, že lilo je správne
nainštalované a očakáva súbor s jadrom na tom istom mieste ako ho špecifikuje
súbor /usr/src/linux/Makefile
na riadku
Inými slovami, ak lilo očakáva súbor vmlinuz inde ako vexport INSTALL_PATH=/boot
/boot
,
musíte tento riadok upraviť.
.config
.Documentation
.
V tomto adresári nájdete súbory popisujúce všeobecné princípy fungovania
jadra, spôsoby konfigurovania rôznych ovládačov, ale aj informácie o tom
ako začať, ak chcete pridávať do jadra vlastnú funkcionalitu. Do verzie
2.4 sa tu nachádzal aj súbor Configure.help
obsahujúci
popis jednotlivých volieb zobrazovaný pri konfigurovaní jadra. V jadre 2.6
bol obsah tohoto súboru porozdeľovaný do súborov Kconfig
v adresároch obsahujúcich kód zodpovedajúcich ovládačov.
uname -r
# uname -r 2.6.6
rdev
:
V prípade, že informácia v jadre nezodpovedá tomu, kde v skutočnosti máte hlavný súborový systém, jadro pri štarte systému spravidla havaruje s hláškou podobnou tejto:# rdev /boot/vmlinuz Root device /dev/hda2 # rdev /boot/vmlinuz /dev/hda3 # rdev /boot/vmlinuz Root device /dev/hda3
Kde čísla XX a YY označujú minor a major číslo zariadenia, na ktorom jadro očakáva hlavný súborový systém.Kernel panic: VFS: Unable to mount root fs on XX:YY
Z tohoto výpisu vidno, že máme VIA686A čipset, USB porty typu UHCI a IDE disky. O zriadeniach na PCI zbernici nám niečo povie /proc/pci:> cat /proc/interrupts CPU0 0: 3946431 XT-PIC timer 1: 30669 XT-PIC i8042 2: 0 XT-PIC cascade 3: 576 XT-PIC serial 4: 16665 XT-PIC serial 5: 1 XT-PIC eth0 8: 1 XT-PIC rtc 9: 1275 XT-PIC VIA686A 12: 0 XT-PIC uhci_hcd, uhci_hcd 14: 14132 XT-PIC ide0 15: 42 XT-PIC ide1 NMI: 0 ERR: 0
Teda mám zvukovú kartu, ktorá potrebuje kodek AC97. Výstup programu> cat /proc/pci ... Bus 0, device 7, function 5: Multimedia audio controller: VIA Technologies, Inc. VT82C686 AC97 Audio Controller (rev 32). ...
mount
nám povie, aké súborové systémy potrebujeme (pozor na to,
že podporu pre hlavný súborový systém /
musíme mať zakompilovanú
priamo v jadre, nie ako modul). A tak ďalej.