Kompajliranje kernela je prilično jednostavan posao, ako znate da ga podesite. Širom neta postoje razna uputstva za podešavanje kernela (konfigurisanje) neophodna za primenu raznih dodataka (drajvera za grafičke karte, zvučne karte, tjunere, gedžete i drugo. Ja ću vam opisati bezbedan način kompajliranja kernela serije 2.4. na Slackware Linux-u.
Ceo postupak dobijanja gotovog kernela se radi u konzolnom okruženju, te ćete prvo morati ili da pređete u terminal (Ctrl+Alt+F6) ili da otvorite neki grafički emulator terminala (xterm, aterm, rxvt, Konsole, gnome-terminal, Terminal i drugi) u kome ćete kucati naredbe koje ću pominjati u ovom uputstvu.
Izvorni kôd kernela se na Slackwareu nalazi u /usr/src. Sa verzijom 10.2 dolazi kernel 2.4.31 raspakovan u /usr/src/kernel-2.4.31. Za bezbedno „igranje“ sa kernelom preporučujem upotrebu proizvoljnih nastavaka za sopstvenu tvorevinu. Odaberite nastavak koji će kernel da ima, za primer ću uzeti da je to „-custom“. Potrebno je iskopirati originalni izvorni kôd kernela naredbom
# cp -R /usr/src/linux-2.4.31 /usr/src/linux-2.4.31-custom
Nakon toga treba prelinkovati simbolički link /usr/src/linux na novo stablo izvornog kôda kernela naredbom
# rm /usr/src/linux # ln -s /usr/src/linux-2.4.31-custom /usr/src/linux
a potom pređite u novonapravljeni direktorijum naredbom
# cd /usr/src/linux
Rad na dobijanju gotovog kernela počinje od ovog koraka. Pre svega je potrebno pripremiti izvorni kôd kernela za konfigurisanje i kompajliranje naredbom
# make mrproper
Ova naredba će obrisati nepotrebne datoteke zaostale iz originalne verzije kernela koju smo kopirali, u slučaju da je ona bila kompajlirana.
Naredni korak je konfigurisanje. Preporučujem da koristite ncurses meni za konfigurisanje jer je najupotrebljiviji. Učinite to naredbom:
# make menuconfig
Podrazumevano će se učitati konfiguracija iz datoteke arch/i386/defconfig. Ako imate ranije podešen kernel možete učitati podešavanje izborom opcije „Load an Alternate Configuration File“ koja se nalazi na dnu menija za konfiguraciju kernela, i unošenjem apsolutne pitanje do konfiguracione datoteke (npr. /boot/linux-2.4.31-ubs). Pažljivo pregledajte sve opcije i koristeći pomoćne tekstove za svaku stavku odredite da li ona treba da bude isključena, uključena u sam kernel (oznaka je zveza) ili kompajlirana kao modul (oznaka je slovo M). Odredite arhitekturu procesora (opcija „Processor type and features“) i ostale pojedinosti bitne za vaš hardver koje ovoga puta neću pominjati jer bi oduzelo dosta vremena u smorilo uputstvo.
Kada konfigurišete kernel sačuvajte izmene i zatovorite konfigurator izborom opcije „Exit“, kada ćete biti upitani da li želite da sačuivate novu konfiguraciju kernela na šta treba odgovoriti sa „Yes“.
Sledeći korak je dodavanje nastavka „-custom“ skripti koja se stara za kompajliranje kernela. Pomoću nekog uređivača teksta (vi, joe, mcedit i sl.) otvorite datoteku Makefile i u četvrtu liniju koja počinje sa EXTRAVERSION = dodajte tekst -custom (vi: tri puta pritisnite j pa $, potom i pa otkucajte -custom). Sačuvajte izmene i zatovorite uređivač teksta (vi: pritisnite Esc pa otkucajte :wq! i pritisnite Enter).
Pošto smo pripremili konfiguraciju treba pripremiti i zavisnosti za izgradnju kernela i modula naredbom
# make dep
Kada se ovo završi prelazimo na dugo očekivano kompajliranje kernela. Pokrenućemo sledeću naredbu
# make bzImage && make modules
Obratite pažnju da se u gornjoj naredbi u bzImage nalazi veliko slovo „i“ a ne malo slovo „L“! Ovo „&&“ je uslovni veznik koji će, ako se uspešno izvrši kompajliranje kernela pokrenuti kompajliranje modula. Ako u toku kompajliranja kernela dođe do neke greške (što ovoga puta nećemo razmatrati, a ako vam se dogodi tako nešto psotavite pitanje u forumu Kernel) onda se ni moduli neće kompajlirati za „neispravan“ kernel.
Kada su kernel i moduli uspešno kompajlirani treba ih i instalirati. Module ćemo odmah instalirati naredbom
# make modules_install
dok ćemo automatsku instalaciju kernela preskočiti. Razlog ovome je mogućnost izbora nepodrazumevanog boot loadera (ja koristim GRUB na Slackwareu kod koga je podrazumevani LILO), te bi automatska instalacija kernela oštetila drugi boot loader. Zato izvršavamo sledeće naredbe:
# cp arch/i386/boot/bzImage /boot/kernel-2.4.31-custom
napravimo rezervnu kopiju konfiguracije našeg kernela naredbom
# cp .config /boot/config-2.4.31-custom
(ne zaboravite tačku ispred prvog config), a potom kopiramo simboličku mapu kernela (šta je System.map?)
# cp Systam.map /boot/System.map-2.4.31-custom
Naredni korak se odnosi na završnicu instalacije kernela. Dakle, konfigurisali smo ga, kompajlirali i instalirali, ali da bi sve ovo imalo i nekakvu svrhu treba negde izabrati taj kernel i korisitti ga. To se čini u meniju boot loadera.
Ako koristite LOLO otvorite njegovu konfiguraciju pomoću naredbe vi /etc/lilo.conf i dodajte novokompajlirani kernel kao novu stavku, recimo ovako:
label=Linux-2.4.31-custom boot=/dev/hda root=/dev/hda1 image=/boot/linux-2.4.31-custom read-only
NAPOMENA: Ovo je samo primer. Za boot i root parametre stavite one koji određuju strukturu vašeg diska. U slučaju da upišete navedene parametre kernel može da ne radi! Nakon ovoga instalirajte izmenjeni LILO naredbom # lilo.
Ako koristite GRUB (kao ja), dodajte u /boot/grub/menu.lst nešto ovako:
title Linux 2.4.31-custom root (hd0,0) kernel (hd0,0)/boot/linux-2.4.31-custom init=noinit root=/dev/hda1 savedefault boot
NAPOMENA: Važi kao i za LILO. Ovo je samo primer i za root unesite parametre koji odgovaraju vašem sistemu. Dobra strana GRUB-a je što ne treba ništa naknadno „instalirati“ kao kod LILO-a.
Čak iako ste nebrojeno puta kompajlirali svoj kernel, uvek to radite sa proizvoljnim dodatkom naziva (-custom u ovom primeru), kako bi u slučaju da ste nešto pogrešno uključili/isključili pri konfigurisanju kernela mogli da podignete sistem sa drugim ispravnim kernelom i ispravili grešku.
Takođe obratite pažnju da nakon instaliranja novog kernela treba reinstalirati i drajvere za grafičku kartu, ALSA drajvere za zvučnu kartu, LIRC za daljinsko upravljanje, drajvere za modeme i drugo što zavisi od samog kernela.