6,190 pregleda

Kompiliranje kernela – kako i zašto

22

Ako ste malo dulje prisutni na nekom Linux/FOSS orijentiranom forumu ili newsgrupi, često ćete se susresti s pojmom “kompiliranja” ili “kompajliranja” kernela. Najprije bi dobro bilo znati što je kernel i zašto bi ste se uopće htjeli upuštati u kompiliranje kernela. Kompiliranje kernela ne treba shvatiti olako niti se treba u to upuštati bez jasnog cilja što hoćete napraviti, ali ako ste željni vježbe, uvijek je dobro za “skill building”.

Što je kernel, da ne izmišljam definicije, evo što kaže wikipedia:

Kernel operacijskog sustava jest srž operacijskog sustava i najniži apstracijski sloj koji je izveden programski. Jezgra je most između programa koji se izvode (procesa) i svega u njihovoj okolini, dakle za međusobnu komunikaciju između procesa, tako i između njih i ostatka računala ili vanjskog svijeta. Jezgra ima sve ovlasti i može pristupiti svakom resursu računala, dok se programima koji se izvode uskraćuje da izravno pristupaju željenim resursima, već u tu svrhu programi moraju pozivati funkcionalnosti jezgre. Time se postiže da se na jednom mjestu (u jezgri) mogu nametnuti sigurnosna i druga pravila važna za osiguranje smislenog ponašanja računala i svih programa u njemu kao cjeline. Jezgra može i ovlastiti neki program da pristupa određenom resursu računala i izravno, bez posredovanja jezgre. Ovo se obično koristi da se programu dâ izravan pristup određenom dijelu memorije (kako privatne memorije koju koristi samo taj program, tako i dijeljene memorije koju istovremeno koristi više programa); za pristup u druge resurse se to rjeđe koristi, prvenstveno zato što je preduvjet za to odgovarajuća sklopovska podrška.

 

 

Koje su uloge kernela?

  1. upravljanje memorijom: primarnom i sekundarnom
  2. upravljanje sklopovljem: paljenje, gašenje
  3. upravljanje procesima: stvaranje, pokretanje, izvođenje, zaustavljanje, gašenje, sinkronizacija, prioritizacija
  4. upravljanje vremenom: osiguravanje da kritični poslovi dobiju dovoljno vremena
  5. zamjena konteksta (eng. context switch)
  6. međuprocesna komunikacija
  7. upravljanje prekidima
  8. kontrola prava pristupa: svi programi mogu od kernela tražiti neku radnju, pravo pristupa ili slično, ali jezgra će voditi računa koje od toga će programu dopustiti, a koje neće
  9. datotečne funkcionalnosti: jezgre tipično uključuju sve potrebno za podršku jednog ili više tipova datotečnih sustava
  10. mrežne funkcionalnosti: također, jezgre obično implementiraju i podršku za jedan ili više mrežnih protokola (npr. sve funkcionalne slojeve za TCP/IP)
  11. upravljanje modulima: mikro jezgre i hibridne jezgre ukljujuču mogućnost da se neki funkcionalni dijelovi jezgre naknadno učitaju i aktiviraju, te nakon prestanka potrebe, deaktiviraju i odbace
  12. zbirke funkcija: neke jezgre, kao neobavezni dio, sadrže i zbirke funkcionalnosti koje nisu kritične za ponašanje sustava, ali su često korištene, te su smještene u jezgri da su na raspolaganju svim programima

Ova gornja definicija vam neće vjerojatno previše pomoći u tehničkom shvaćanju pojma “kernel”, ali će vam dati predodžbu što kernel zapravo jest. Ako pogledate ovu sliku gore, vidite da je kernel poveznica između komponenti sklopovlja sa aplikacijskim slojem. Dakle, o njemu ovisi koliko će uređaj brzo razmjenjivati podatke između sklopovlja i programske podrške, na koji način će prosljeđivati podatke, po kojim algoritmima i kojom brzinom.

Što radimo kompiliranjem kernela?

Kompiliranjem (kernela) prevodimo kod kernela u jezik razumljiv stroju, ali nas zanima onaj međukorak, tj. modifikacija kernela. Kernel modificiramo (patchiramo) iz raznih razloga, npr. želimo optimizirati kernel za naš procesor jer većina operacijskih sustava dostavlja generički kernel koji nije optimiziran za vaš procesor ili želimo dodati određeni patch koji će (eventualno) ubrzati rad (vidi ~200 Line Linux Kernel Patch) ili ukoliko nam ne radi određeni dio sklopovlja, pa želimo omogućiti određeni upravljački program (u daljnjem tekstu driver) ili firmware ili pak želimo odbaciti nepotrebne drivere iz kernela.

Što trebamo?

Za početak trebamo nabaviti vanilla kernel, vanilla kernel je originalni ne-patchirani kernel i na njega ćemo stavljati patcheve i mijenjati konfiguraciju kroz “text user interface”.
Sam kernel možete nabaviti sa kernel.org stranice. Preporučam zadnji stable kernel, bez “point patcheva”, dakle ne 3.4.4, nego 3.4.

Kada smo skinuli kernel otpakirajte ga u proizvoljnu mapu (prikazan je postupak odpakiravanja u ~/src direktorij kojeg kreiramo):

mkdir src
cd src
wget -c http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.4.tar.bz2
tar xjf linux-3.4.tar.bz2

Nakon što smo otpakirali kernel u ~/src moramo instalirati alate koji će nam biti potrebni za kompilaciju i uređivanje konfiguracije kernela.

Za Debian:

sudo aptitude install kernel-package libncurses5-dev fakeroot wget bzip2

Za OpenSuSe:

sudo yast -i ncurses-dev gcc

Za Fedoru:

su -c ‘yum install fedora-rpmdevtools unifdef’

Sada može krenuti patchiranje kernela, prvo ćemo skinut bfq I/O sched i -ck patchset koji sadrži mnogobrojne patcheve(uključujući i BFS), postoji još popularnih patchsetova kao liquorix, zen, pf, ice i slični, ali mi smo se odlučili za ck i s njime ćemo patchirati postojeći vanilla kernel.

chmod g-s ~/src/linux-3* -R
cd ~/src/linux-3*  #ako već niste u njemu
wget -c http://ck.kolivas.org/patches/3.0/3.4/3.4-ck2/patch-3.4-ck2.bz2
wget -c http://algo.ing.unimo.it/people/paolo/disk_sched/patches/3.4.0-v3r4/0001-block-cgroups-kconfig-build-bits-for-BFQ-v3r4-3.4.patch
wget -c http://algo.ing.unimo.it/people/paolo/disk_sched/patches/3.4.0-v3r4/0002-block-introduce-the-BFQ-v3r4-I-O-sched-for-3.4.patch
bzcat patch-3.4-ck2.bz2 | patch -p1
patch -p1 -i 0001* && patch -p1 – i 0002*

Zatim kreće uređivanje konfiguracije, a ovdje će biti navedene neke važnije postavke u konfiguraciji koje biste željeli promijeniti.

Prvo moramo doći do dijaloga za konfiguraciju. Samu konfiguraciju možete urediti u grafičkom ili tekstualnom okruženju, mi ćemo koristiti tekstualno okruženje radi neovisnosti o DE-u koji koristite.

 

Otvorite terminal u istoj lokaciji (~/src/linux-3.4) i pokrenite:

1. Konfiguracija – Krećemo s uređivanjem konfiguracije kroz tekstualni izbornik

make menuconfig

Processor type and features —> Processor family —> (X)
Ovdje trebate izabrati tip vašeg procesora, vrlo vjerojatno je izabrana generička opcija.

Processor type and features —> Timer Frequency —> (X) 1000 HZ
…za desktop strojeve viša frekvencija je najčešće najbolji izbor, a kod laptopa će produžiti trajanje baterije.

Processor type and features —> Preemption Model —> (X) Preemptible Kernel (Low-Latency Desktop)
…za desktop strojeve Volontary Kernel Preemption ili Preemptible Kernel, puni preemptibile će imati nešto brži odaziv.

General setup —> BFS cpu scheduler
omogučite BFS jer od 3.x verzija kernela se mora dodatno postaviti u konfiguraciji

Enable the block layer —> IO Schedulers —> BFQ I/O Scheduler (*)
i Default IO Scheduler postavite BFQ

Izbacite nepotrebne drivere ili dodajte drivere koji nisu uključeni kako biste smanjili vrijeme kompilacije i optimizirali sam kernel i spremite konfiguraciju, a kako bi ste pronašli koji vam driveri trebaju poslužite se slijedećim naredbama:

# lspci -vv
# lsusb
# hwinfo
# cat /proc/cpuinfo

2. Kompilacija – koristimo “Debian way” kompilacije s make-kpkg pa za ostale distribucije koristite klasični make s napomenom da možete ubrzati sam proces s dodavanjem -j flaga gdje iza njega stavite broj vaših jezgri + 1, tj. ukoliko imate dual core proc to će izgledati ovako.

Ostali:

make -j3 && sudo make modules_install && sudo make install
sudo depmod
update-initramfs -c -k
update-grub

Debian i deb-based sustavi:

sudo make-kpkg –initrd kernel_image kernel_headers

… i krenula je kompilacija, vidjet će te sličan output ovome na konzoli, a u međuvremenu pročitajte neki manual :)

HOSTCC  scripts/basic/fixdep
HOSTCC  scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC  scripts/kconfig/zconf.tab.o
HOSTLD  scripts/kconfig/conf

CHK     include/linux/version.h
UPD     include/linux/version.h
CHK     include/generated/utsrelease.h
UPD     include/generated/utsrelease.h
CC        kernel/bounds.s
GEN     include/generated/bounds.h
CC        arch/x86/kernel/asm-offsets.s

3. Instalacija (Samo debian) – Nakon kompilacija make-kpkg je stvorio *deb pakete, pa ih možemo instalirati standardnom procedurom.

cd ..
sudo dpkg -i linux-image*.deb
sudo dpkg -i linux-headers*.deb

Što ako nešto krene krivo?

Često se prilikom kompilacije može dogoditi pogreška i to zna biti iritirajuće jer sama kompilacija traje cca 30-60 min. U trenutku pogreške je najbolje kopirati output i pretražiti po Googleu, velika je vjerojatnost da je netko imao isti problem. Kernel čija je kompilacija prekinuta se najvjerojatnije neće moći bootati ili će se bootati s greškom jer mu nedostaje potrebni driver. Bootajte u stari (ispravni) kernel i ponovo ga rekonfigurirajte.

 

Autor:Retsam

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)

Povezani članci:

Objavljen Linux kernel 3....
Blender - kompletan video...
Instalacija Dropboxa na X...
Objavljen Linux kernel 3....
Fluxbox tutorijal, prvi d...

22 Responses

  1. Shicy kaže:

    Kul članak! Svaka čast autoru :)

  2. Kova kaže:

    a super, sad cu izgubiti najmanje mjesec dana života kako bih najbolje optimiziro kernel na archu, hvala autoru

  3. blacx kaže:

    Odličan članak! Hvala :)

  4. Z0K4 kaže:

    Članak je preodličan! :D
    Branko svaka čast…
    Mene samo čudi vrijeme kompilacije… meni je do sad kompajliranje kernela trajalo minimalno 8h!!! Bit će da sam nešto pogrešno radio… :D
    Hvala autoru na članku! ;)

    • lutherus kaže:

      pa ako uključiš sve kaj ima unutra onda i traje toliko

    • retsam kaže:

      Da ti nisi možda kompilirao kernel + gnome + office paket + Xorg + cijeli userland ?
      Štopao sam dok sam kompilirao (i paralelno pisao čalnak :D ) i to bez make localconfig i trajalo je 42 min. 8 h je stvarno nemoguće osim ako nemaš neku perverziju od stroja iz 80′.

    • Z0K4 kaže:

      @lutherus: Izbacio sam dosta toga, ali izgleda da nije bilo dovoljno… :O
      @retsam: Hehe… samo kernel! B)
      Vjeruj mi, da imam neki stroj iz 80-ih prodao bih ga za masne novce! :D
      Ne, procesor je intelov dvojezgreni T4400 s 2.2 GHz.

  5. b4sh kaže:

    Odlicno napisan clanak , svaka cast ;)

  6. mali radnik kaže:

    S ovim u vezi predlažem kao koristan i sljedeći link: http://linux.slim-rijeka.com/2012/03/22/downgrade-kernela/

    • retsam kaže:

      Pa to je isključivo instaliranje pre build paketa s ubuntuovog repozitorija, tu je procedura ista kao i za instaliranje bilo kojeg drugog .deb paketa

  7. miki kaže:

    Totalno los clanak.

    Samo je povrsno objasnjena svrha i koraci ovog postupka.

    NPR.
    —-
    Kernel čija je kompilacija prekinuta se najvjerojatnije neće moći bootati ili će se bootati s greškom jer mu nedostaje potrebni driver. Bootajte u stari (ispravni) kernel i ponovo ga rekonfigurirajte.
    —-

    Na ovakvu izjavu neko izgubi i 3 dana ako unaprijed ne zna kako to da izvrsi a ako zna, SIGURNO mu ovaj clanak ne treba.

    • retsam kaže:

      Imaš DRAFT sekciju, napiši vlastiti članak u vezi kompilacije kernela, objasni svaki dio postupka i detaljno razradi tematiku, možeš dijeliti i neke svoje patcheve jer vjerujem po stručnosti da imaš i vlastiti patchset bolji od Conovog, jako bi to volio vidjeti. Konstatacija u vezi grješke prilikom kompilacije u podpunosti stoji ako se dogodi grješka prilikom kompilacija valja pretražiti internete ili postati grješku na forum, jedino što ne stoji tvoj komentar koji nema smisla, ajde ga još jedanput pročitaj i probaj shvatiti kako netko može izgubiti 3 dana na izjavu, ja to nisam shvatio. Možeš li izdvojiti još jedan dio koji ti kao “iskusnom liscu” nije jasan, samo probaj ovaj put malo razraditi komentar da bude razumljiv čitateljima.

    • Branko kaže:

      Ni ja nisam shvatio u čemu je problem?
      Ako ne uspije kompajliranje kernela, butaš u neki ispravni kernel i probaš opet. Zašto bi bootanje u stari kernel bilo problem?

      • Blacx kaže:

        “Samo je povrsno objasnjena svrha i koraci ovog postupka.”
        Pa što si očekivao? Tekst na 500 strana?
        Ukratko, koncizno i jasno objašnjen postupak kompiliranja/kompajliranja kernela koji navede na pravi put, a ostale eksperimente radi sam korisnik, kao i sve ostalo u Gnu/Linuxu.
        Ako ti je ovo malo, izvoli:
        http://shop.oreilly.com/product/9780596000028.do

        I ta citirana rečenica je poprilično logična.

      • lutherus kaže:

        Kompajliram kernel brzo i efikasno. Cijena? Prava sitnica, 100€ po modulu.

Ostavi komentar

© 2014 Linux Za Sve. | Impressum | Sadržaj je licenciran pod CC-SA-3.0 ako nije drugačije naznačeno.
Proudly designed by Theme Junkie.