Kernel

"Kompajliranje Kernela"
Napisala: Amila Akagic, bono@linux.org.ba
 *Objavljeno u INFO Magazinu

 # v0.1, ~2002, bono, prva verzija
 # v0.2, 01.2004, Babysitter, dopune, ispravke
 # v0.3 29.09.2004, Vedran, jezičke sitnice

Ovaj dokument namijenjen je svima onima koji žele saznati kako kompajlirati, instalirati i konfigurisati kernel. Ukoliko imate pitanja vezana za ovaj dokument, pišite na bono@linux.org.ba.



Zašto novi kernel ?

Najvažniji dio bilo kojeg operativnog sistema je kernel. Možemo reći da je to veza između hardverskog i softverskog svijeta. Kernel je, recimo, zadužen za podršku za TCP, IP, PPP i druge protokole. Kompajliranje kernela bi trebalo biti najlakši dio korištenja Linuxa, međutim iz iskustva mogu reći da je ovo jedna od najtežih tema za početnike. Tako pri pomenu kernela, mnogi će reći "aaa ne... ne želim upropastiti ovo što imam".

Današnje distribucije sadrže već gotove, sređene kernele tako da većinom nije potrebno kompajliranje novog kernela. Postavlja se pitanje: u kojim situacijama je potrebno kompajlirati kernel?

Ništa jednostavnije

Novi Linux korisnici se često plaše kompajliranja novog kernela jer imaju osjećaj da operiraju na "srcu" sistema. Odmah na početku želim da vam kažem da je kompajliranje u suštini vrlo jednostavno. Nema potrebe da se plašite kompajliranja jer za cijelo vrijeme postoji mogućnost da vratite početnu konfiguraciju i pokrenete stari kernel koji uvijek ostaje na sistemu.

Za razliku od drugih operativnih sistema gdje već jedan jedini pogrešno instaliran driver dovodi do kreša cijelog sistema, Linux kernel je tako koncipiran da je njegova gradnja tj. kompajliranje vrlo sigurno i brzo.

Glavu gore i samo naprijed! Vidjećete i sami kako je jednostavno vratiti stari sistem u slučaju da izostavite neki važan driver, ali nadam se da do toga neće doći.

Kernel source

Ukoliko ste se odlučili da konačno naučite kompajlirati kernel onda ćete morati skinuti patch ili čitav kernel u tar.gz formatu. Ukoliko već imate source kernela i želite uraditi samo update novog kernela, biće potrebno skinuti patch file. Prije nego što počnete skidati kernel ili patch trebali biste znati kako se oni označavaju. Na stranicama ćete pronaći datoteke sa imenima tipa linux-x.y.z.tar.gz, gdje je x uvijek jednako 2 (bar za sada). Ukoliko je y paran broj (npr. 6), to označava da je data verzija kernela stabilna dok neparan broj označava nestabilnu verziju (nešto poput beta verzije), koja može da radi ali isto tako se može desiti da veoma brzo padne.

Za vrijeme pisanja ovog teksta aktuelan je kernel 2.6.xx. Vrijeme je da skinemo kernel ili patch kojeg možete pronaći na www.kernel.org ili na sunsite.unc.edu. Najbolje je da ih za početak ostavite u /root direktoriju.

Sa svakom modernom distribucijom dobićete i izvorni kod (source) kernela koji obavezno mora biti instaliran prije neko što počnete sa kompajliranjem. Obratite pažnju da kompletan kernel source ima veličinu preko 100Mb. Instalirajte ga sa CD-a vaše distribucije pošto je stari kernel potreban za gradnju novog. Ukoliko niste sigurni da li ste instalirali source, možete to provjeriti naredbom:

 # rpm -q kernel-source
 kernel-source-2.4.18
ili
 # dkpg -p linux
 linux-2.4.18
Na raznim distribucijama paket sa kernelom se različito zove, obično je to "kernel" ili "linux". Napominjem da je ovo instalirani binarni kernel, dok se paket sa izvornim kodom može zvati kernel-source ili kernelsource ili linux-src i tome slično. Možda ćete trebati izlistati sve instalirane pakete i potražiti nešto nalik na ovo.

Sigurnosne mjere, prije nego počnemo

1. Potrudite se da napravite jednu boot disketu sa kojom je moguće podignuti vaš sistem (isprobajte je).

2. Sada ćemo osigurati staru konfiguraciju. Prvo ćemo preći u direktorij gdje se nalaze stari moduli i sačuvati ih u novom direktoriju koji se zove backup.

U primjeru ću koristiti kernel 2.4.xx kao stari kernel a 2.6.xx kao novi:

 cd /lib/modules
 cp -a 2.4.xx backup
(ovdje zamijenite xx odgovarajućom verzijom vašeg starog kernela). Ovom naredbom će biti napravljen direktorij /lib/modules/backup.

3. Sada ćemo osigurati datoteku u kojoj se nalazi konfiguracija boot-managera LILO, a to je datoteka /etc/lilo.conf. Ako koristite GRUB ovaj zahvat nije potreban pošto GRUB ne čuva svoju konfiguraciju u datoteci.

 cp /etc/lilo.conf /etc/lilo.conf.backup
Time smo praktično završili sve sigurnosne mjere i sada se možemo posvetiti kompajliranju kernela.

Kompajliranje novog kernela

Prije nego instaliramo novi kernel, preći ćemo u direktorij /usr/src i baciti jedan kratak pogled na nj:

 cd /usr/src/
 ls -l
Vidjećemo sličnu situaciju kao na slici:

  ========> UBACITI SLIKU <========= 
Kao što vidimo, u direktoriju se nalazi poddirektorij koji nosi ime aktuelnog kernela kao i jedan link na taj direktorij koji nosi ime linux.

Prije nego počnemo sa instalacijom novog kernela, trebamo odstraniti taj link jer bismo u suprotnom raspakivanjem arhive novog kernela prepisali stari:

 rm -f /usr/src/linux
Sad možemo otpakovati novi kernel koji se još uvijek nalazi u /root direktoriju:
 tar xzf /root/linux-2.6.xx.tar.gz
Ovom naredbom ćemo napraviti novi direktorij sa imenom /usr/src/linux. Pošto je tradicija da ovaj direktorij nosi ime verzije kernela, trebali bismo mu promijeniti ime i napraviti link, kao što je bilo i ranije.
 mv linux linux-2.6.xx
 ln -s linux-2.6.xx linux
Ukoliko ovdje zaboravite da napravite link, nećete moći kompajlirati kernel jer se pri tome koristi direktorij /usr/src/linux/include.

Izbor radnog sučelja

Iako je kernel program koji se može kompajlirati uz pomoć poznatog kompajlera gcc, nisu potrebna nikakva programerska iskustva za njegovu gradnju. Sve što nam je potrebno možemo odraditi koristeći jedan grafički meni u kojem se određuju potrebni i nepotrebni moduli. Postoje tri vrste tog menija:

1. Meni u tekstualnom modusu koji nije naročito ugodan za upotrebu.

2. Meni sa tzv. curses-površinom kojim se da upravljati uz pomoć tastature (strelice)

3. Pravo grafičko sučelje koje je vrlo komforno za korištenje i funkcioniše samo iz X Window sistema.

Najprije provjerite da li je na vašem sistemu instalirano neko od programerskih okruženja sa kompajlerom.

 rpm -qa | grep gcc
 gcc-2.95.3-216
ili
 rpm -qa | grep egcs
 egcs-1.1.2-12
Ako bilo koja od ovih naredbi odgovori nekim rezultatom onda ne morate više ništa instalirati. U protivnom, instalirajte kompajler koji se nalazi na CD-ovima vaše distribucije.

Korak 1: Konfiguracija kernela

Počećemo od naredbe make menuconfig. U direktoriju /usr/src/linux kucajte "make menuconfig" što će startati aplikaciju koja će vam olakšati izbor. Pored ove opcije tu je i "make config" koji je nešto manje pregledan i ukoliko pogriješite u odabiru neke opcije moraćete početi ispočetka i ispraviti grešku.

Ako imate instaliran X Window sistem (XFree86 ili X.org), mi ipak preporučujemo korištenje naredbe "make xconfig" koja predstavlja poznat i jednostavan grafički interfejs.

  ========> UBACITI SLIKU <========= 
Šta sada uraditi? Jednostavno izaberite one opcije za koje mislite da su potrebne. Recimo, ukoliko nemate podršku za zvuk i ako je ona u kernelu isključena (disabled), a imate zvučnu karticu i želite imati zvuk, logično je da je uključite (enable).

Možete se kretati kroz opcije tipkama sa strelicama gore ili dolje, te tipkom ENTER ući u neko od područja (za "make menuconfig") ili jednostavno izabrati mišem (za "make xconfig"). Opcijom Exit se uvijek možete vratiti do glavnog menija. Ako želite da isključite neki modul onda izaberite "n", a da biste ga aktivirali izaberite "y". Osim toga, neke drivere možete označiti sa "m" što znači da će pomenuti driver biti napravljen kao "modul". Moduli nisu dio samog kernela nego se pozivaju po potrebi. Preporučljivo je sve module koje pri podizanju sistema ne trebate označiti kao "modul" jer broj modula ne usporava direktno rad sistema. (Napomena: na nekim sistemima se prilikom starta izvršava naredba "modprobe -l" koja skenira sve module, te za jako veliki broj istih može potrajati nekoliko sekundi.)

Na primjer, ako koristite SCSI diskove onda obavezno ugradite podršku za SCSI direktno u kernel, jer u suprotnom ne možete pokrenuti sistem sa tog SCSI diska. S druge strane, drivere za TV karticu možete označiti kao modul koji će biti učitan onog trenutka kada probate gledati TV.

Neki od najvažnijih modula

Moduli se stalno mijenjaju. Svakodnevno dolaze izvještaji o novim modulima te se zanemaruju stari moduli. Zbog toga je teško nabrojati sve module i ostale mogućnosti koje se daju izabrati u kernelu.

Pokušaću navesti neke od njih. Ukoliko naiđete na modul za koji niste sigurni da li vam je potreban, najbolje je da ga označite kao modul (m) ako je moguće, a ako nije da ga izaberete (y).

PROCESOR TYPE AND FEATURE:

LOADABLE MODULE SUPPORT:

GENERAL SETUP:

NETWORKING OPTIONS:

CHARACTER DEVICES:

FILESYSTEMS:

CONSOLE DRIVERS - Dvije opcije su interesantne:

SOUND - Najbolje da drivere za vašu karticu označite kao module (m).

Zatim, recimo jedna od interesantnih stvari je "kernel hacking". Jednom prilikom mi se desilo da sam zaboravila root password, a dobila sam i previše e-mailova u kojima me preklinju da im pomognem jer su zaboravili root password. Jedno od rješenja je, ukoliko vam je kernel hacking uključen (enabled), da pronađete start-up disketu, stavite je u disketnu jedinicu (pogledajte u BIOSu da li je omogućeno prvo boot-anje sa diskete) i kada se pojavi LILO: kucate "linux single". Gdje ćete se naći? Interesantno je da pomoću diskete možete uraditi ovako nešto. Nakon silnih boot poruka pisaće bash#: i sve što trebate uraditi je kucati passwd i promijeniti root password. Nakon toga uraditi reboot i logujte se kao root kako biste vidjeli da li je vaša operacija uspjela! Ovo je jedna od opcija koju možete pronaći u konfiguraciji kernela.

Dakle, sve što trebate uraditi je pogledati koje su vam ocije zaista potrebne a koje ne. Ukoliko niste sigurni šta je šta, koristite upitnik (?) pored opcije koja vas interesuje.

2. Kompajliranje

Nakon što ste izabrali sve što vam je trebalo i onemogućili ono što vam više ne treba kucajte:

 make dep clean
Ovo će očistiti sve nepotrebne stvari koje se nalaze u kernelu. Zatim kucajte:
 make zImage 
Pazite na slovo I koje treba pisati veliko.

Ovaj korak će potrajati određeno vrijeme. Na mojoj 450x2/256mb mašini traje oko 5 minuta, a na sporijim može i do 20 minuta pa čak i do 1 sat (zavisno od RAMa). Dobro je sjediti i pratiti sve poruke koje se pojavljuju jer možete uočiti neka upozorenja ili eventualne greške - što se ne bi trebalo dešavati sa stabilnim kernelima. Loše vijesti su ako se pojavi greška "signal 11". Još jedan problem je da je kernel "preveliki", u kojem slučaju bi trebali poslije završetka prethodne naredbe uraditi

 make bzImage
zImage je gzip kernel, koji je kompresovan što bootanje kernela čini nešto sporijim. "signal 11" znaci da je gcc pronašao neku grešku prilikom kompajliranja. "sig11S" je greška uzrokova posjedovanjem lošeg ili oštećenog hardvera, uzrokovana je ili lošim procesorom ili lošom memorijom ili pak overklokiranim procesorom. Mnogi ljudi rade "overkloking" (overclocking) da bi ubrzali svoj računar, a pojedine (ne baš profesionalne) firme čak prodaju overklokirane računare predstavljajući ih kao noviji model.

3. Instalacija modula

Sada ćemo kompajlirati i instalirati module naredbom

 # make modules modules-install
I ovo će da potraje malo. Ovim nastaje novi direktorij /lib/modules/2.6.xx u koji se kopiraju svi kernel moduli.

Ukoliko prilikom kompajliranja vidite neke greške poput "Unresolved Modules", pokušajte premjestiti direktorij /lib/modules u /lib/oldmodules.

Ponekad se prilikom bootanja novog kernela javlja greška kako modul (npr.) 2.2.13 "can't be resolved". Da biste izbjegli ove poruke uradite ovo:

 # cp -r /lib/modules/2.2.yy /lib/oldmodules/
 # rm -rf /lib/modules/2.2.yy
prije nego što otkucate "make modules" i "make modules_install".

Instalacija novog kernela

Kernel se u skoro svim distribucijama nalazi u direktoriju /boot pa ćemo i mi novi kernel premjestiti u taj direktorij.

 cp arch/i386/boot/zImage /boot/vmlinuz-2.6.xx 
Naravno da i ovdje xx stoji za odgovarajuću verziju vašeg kernela i zImage treba zamijeniti sa bzImage ukoliko ste napravili veliki kernel.

Editovanje /etc/lilo.conf

lilo.conf je datoteka u kojoj se nalaze opcije za LILO. LILO je skraćenica od LInux LOader, to je program koji vam omogućuje izbor operativnog sistema nakon paljenja/reseta računara.

Prije nego što počnemo praviti bilo kakve promjene u lilo.conf napravite prvo backup (cp /etc/lilo.conf /etc/lilo.conf.backup), što ste već i uradili ako ste pažljivo čitali ovaj tekst ;) Otvorite lilo.conf u vašem omiljenom editoru i počnimo. Evo kako izgleda jedna vrlo jednostavna lilo.conf datoteka:

 image=/boot/vmlinuz-2.4.18
 label=linux
 root=/dev/hda2
 read-only
Vaš lilo.conf je vjerovatno nešto složeniji, ali fokusirajte se na linije slične ovima, vjerovatno pri kraju.

Sada nakon ovog bloka napravite jednu kopiju istog i prepravite red sa label=linux u label=novikernel. Osim toga, prepravite red sa "image=/boot/vmlinuz-2.4.18" i stavite ime vašeg kernela koje ste odabrali maloprije, dakle /boot/vmlinuz-2.6.xx (xx zamijeniti za odgovarajuću verziju), tako da dobijete situaciju:

 image=/boot/vmlinuz-2.4.18
 label=linux
 root=/dev/hda2
 read-only 
 image=/boot/vmlinuz-2.6.xx
 label=novikernel
 root=/dev/hda2
 read-only 
Sačuvajmo ovaj novi lilo.conf. Kako bismo isprobali da li smo sve dobro sredili kucajte u konzoli:
 # lilo
Naredba bi trebala dati izlaz npr. ovakav:
 Added Linux *
 Added novikernel
 Added dos
što bi zapravo trebalo da znači da je "novikernel", naš novi kernel, dodan u LILO izbornik, pri čemu je stari kernel "Linux" i dalje podrazumijevana opcija (označen zvijezdom - *). Jedna uobičajena greška je da "image" nije na mjestu na kojem smo označili.

Na kraju je potrebno još samo uraditi reboot. Kada se pojavi LILO: kucajte ili izaberite "novikernel". Ukoliko želimo da se novi kernel automatski podiže moramo promijeniti redoslijed ova dva, gore navedena, bloka u lilo.conf ili obratiti pažnju na opciju "default=Linux" - koju naravno treba promijeniti u "default=novikernel".

Uživajte u vašem novom kernelu :) Javite nam kako je prošlo kompajliranje, na koje ste probleme nailazili, da li novi kernel radi brže ili sporije od starog - ma svakako je bolji jer je TVOJ LIČNI ;)

 


Najnoviju verziju dokumentacije potrazite na sajtu start.linux.org.ba