Linuxi kerneli kompileerimine

Allikas: Hinnavaatlus.ee Wiki
Redaktsioon seisuga 21. oktoober 2005, kell 12:39 kasutajalt Cbr (arutelu | kaastööd) (→‎Moodulite paigaldamine)
Mine navigeerimisribaleMine otsikasti

Järgnev õpetus käsitleb seda, kuidas konfigureerida ja kompileerida Linuxi kernelit versiooninumbriga 2.6.x.

Hoiatus: Juhendi hetkel olemas olev osa käsitleb nn. ametliku, Linus Torvaldsi ja meeskonna poolt loodava kerneli ehk nn. vanilla kerneli kompileermist ja paigaldamist. Juhendid on üldised, ja ei sisalda distributiividele spetsiifiliste vahendite kasutamist. Samuti pole käsitletud kernelile "mitteametlike" modifiaktsioonide, ehk patchide lisamist. NB! vanilla kerneli kasutamine distributiivdes, mis kernelit tugevasti modifitseerivad (Fedora Core, Suse/Novell Linux jne.) ei ole soovitav ja võib tekitada ettenägematuid tõrkeid. Kindla soovi korral ise kernel kompileerida oleks selliste distributiivde kasutajal soovitav hankida distrospetsiifiline kerneli lähtekood kasutades oma distro pakihaldusvahendeid. Samuti on soovitav meeles pidada, et sedasi käsitisi loodud ja paigaldatud kernel ei ole paikhalduri jaoks enam hallatav, uuendatav, modifitseeritav ega eemaldatav. Samuti pole hetkel veel käsitletud kerneli kompileerimise jaoks vajalikud vahendid: arendusvahendid ja libraryd ning nende paigaldamine.

Lähtekoodi hankimine

Kõigepealt läheb meil muidugi vaja Linux'i kerneli lähtekoodi, mille leiab selle ametlikult lehelt http://www.kernel.org. Sealt otsi üles rida mis algab nii:

The latest stable version of the Linux kernel is:

Vajuta samal real olevale F'ile, et tirida täielik lähtekood (full source). Salvesta lähtekoodi tarball oma kodukausta.

Eeltöö

  • Nüüd ava oma lemmik terminaliemulaator (konsole, gnome-terminal, xterm) ning liiguta tarball õigesse kohta:
$ su
Password:
# mv /home/minukasutaja/linux-*.tar.bz2 /usr/src/


  • Järgmisena pakime .tar.bz2 arhiivi lahti:
# cd /usr/src
# tar xjf linux-<versioon-mille-tirisid>.tar.bz2

Kui ei mäleta täielikku failinime, saad alati poole failinime trükkimise peal kasutada klaviatuuri TAB klahvi, et failinime automaatselt täiendataks.
Nüüd peaks sul olema selline kaust: /usr/src/linux-<versioon>

Konfigureerimine

Linux'i kerneli kompileerimiseks tuleb ta eelnevalt konfigureerida ehk tuleb valida, millise raudvara jaoks tugi sisse jätta, milliseid failisüsteeme toetada jne.
NB! Kui sa ei ole enda arvuti raudvara tundmise poolelt just väga kogenud, siis oleks vast siin paslik asi pooleli jätta ja rahulduda distributsioonide poolt koostatud pakikernelitega, mis iseenesest on vägagi töötavad ja piisavalt head rakendused! Kui aga on huvi ja oled juba kogenum, loe julgelt edasi.

Linux'i kernelil on mitu erinevat konfigureerimise võimalust. Selles juhendis käsitleme neist kolme.

menuconfig

Tegemist on ncurses teegi baasil loodud konsoolipõhise konfigureerimiskeskkonnaga.

menuconfig

menuconfig'i kasutamiseks piisab lahtipakitud kerneli kaustas järgmise käsu jooksutamisest:

# make menuconfig

menuconfig'is on järgmised tingmärgid:

  • [*] - valik kompileeritakse kernelisse
  • [M] - valik kompileeritakse moodulina, mis on kerneli image'st eraldi ja mida saab laadida käsuga modprobe
  • [ ] - valikut ei kaasata kernelisse

menuconfig'i menüüdel põhinev kasutajaliides on suhteliselt selge ning erilisi probleeme sellega ei tohiks tekkida. Iga valiku abiteksti nägemiseks vajuta klahvi "?".
NB! Väljumisel ära unusta kerneli konfiguratsiooni salvestamast!

config

Teine natuke arhailisem ja aeganõudvam viis kernelit konfigureerida, on lasta tööle käsk

# make config

Antud juhul küsitakse sult kõiki valikuid ükshaaval, kus valikuteks on [y/n/m/?] (yes/no/module/help).
Seda moodust kerneli kompiilimiseks ei soovita ma kellelegi, kui selle järele just tungivat vajadust ei ole.
Kasutage igal võimalusel menuconfig'it!

oldconfig

Juhul, kui oled juba ühe korra kerneli vastavalt oma raudvarale konfigureerinud, ei pea sa uut kernelit paigaldades seda täies mahus uuesti tegema. Sa pead ainult kopeerima vana kerneli konfiguratsioonifaili (/usr/src/linux-<versioon>/.config) uue kerneli kausta samuti ning laskma tööle käsu

# make oldconfig

Sellisel juhul küsitakse sinult ainult neid valikuid, mis on vahepeal juurde tulnud.

Kompileerimine

NB! Tavapärast moodust kasuta ainult siis, kui selline moodus on sinu distro poolt eelistatud (näiteks Gentoo arendajad peaksid sellisesse meetodisse suhtuma täiesti normaalselt). Kui sinu valituks distroks on Debian või mõni Debianil baseeruv distro (Ubuntu, MEPIS jt), siis pöördu punkti "Debian'i moodi"!

Tavapärane

Kui oled edukalt kerneli konfiguratsiooniga valmis saanud, kompileeri kernel lastes kerneli kaustas tööle järgnev käsk:

# make

Nüüd pead sa ära ootama pika joru igasugust mõistmatut teksti. Kui asi lõpuks õnnelikku lõppu jõuab ning protseduur ei lõppe mingite erroritega, läks kõik õnneks. Suundu järgmisesse punkti!

Debian'i moodi

Seda meetodit kasuta siis, kui sinu distroks on Debian või mõni Debianil põhinev distro (Ubuntu, MEPIS jt). Sellist meetodit isetehtud kernelite installeerimiseks ja kompileerimiseks soovitavad Debiani arendajad!

Kõigepealt tuleb meil installida mõned pakid, et kompileerimine üldsegi toimuda saaks:

# apt-get install build-essential kernel-package

Sellega installisid sa vajalikud pakid binaaride loomiseks ja vajalikud scriptid kerneli kompileerimiseks ja .deb pakiks muutmiseks.
Nüüd mine kerneli kausta ja kerneli koheseks kompileerimiseks ja pakendamiseks .deb arhiivi lase tööle järgnev käsk.

# make-kpkg kernel_image

Rohkem infot make-kpkg käsu kohta manuaalist (man make-kpkg).

Selle käsu eduka tulemusena tekib kausta /usr/src sinu kerneli pakk nimega näiteks kernel-image-2.6.13.2_10.00.Custom_i386.deb
Selle paki installimist käsitleme järgmises punktis!

Moodulite paigaldamine

NB! Kui kasutasid eelmises punktis "Debiani moodust" kerneli kompileerimiseks, jäta see punkt vahele ja suundu järgmisesse punkti.
Kui kasutasid tavapärast moodust, on järgnev tekst sulle!

Tavapärane

Kerneli moodulitele on olemas spetsiaalne kaust /lib/modules/, kuhu nad on vaja paigaldada selleks, et kernel neid korrektselt laadida ja kasutada suudaks. Selle töö teeb sinu eest ära käsk

# make modules_install

Ka selle käsu käivitamiseks pead olema kerneli kaustas (/usr/src/linux-<versioon>)

Kerneli paika kopeerimine

Kui kerneli kompileerimine lõpeb edukalt, siis tuleb sulle ette tühi käsurida ning vahetult eelnevas väljundis pole veateateid, mis viitaksid sellele, et kompileerimine ebaõnnestus.

  • Otsi viimaste väljundi ridade seast välja selline lõik (väljundi kerimiseks sobib enamkasutatavates terminaliemulaatorites hiirerull või klahvikombinatsioon Shift+nool üles/nool alla:
Root device is (3, 4)
Boot sector 512 bytes.
Setup is 6878 bytes.
System is 1862 kB
Kernel: arch/i386/boot/bzImage is ready

Teised read on sinu väljundis tõenäoliselt erinevad, kuid otsi üles viimane rida (Kernel: ... is ready) , mis peaks olema samasugune (i386 asemel võib olla midagi muud vastavalt protsessori arhitektuurile).

  • Kopeeri või trüki see osa, mis jääb pärast "Kernel:" uuesti käsureale ning pane ette käsk cp (copy) ja lõppu kaust, kuhu me kerneli kopeerime. Tulemus peaks välja nägema selline:
# cp arch/i386/boot/bzImage /boot/kernel-<versioon>

Selle käsu tulemuseks on kerneli kopeerimine kausta /boot, kus asuvad GNU/Linux süsteemi bootloader, kernelid ja initrd image'd.

  • Kui tahad kinnitust sellele, et kopeerimine õnnestus, saad selle leides oma kerneli järgnevast loetelust:
# ls /boot/kernel*

Kerneli kausta puhastamine

Kui tekib vajadus kerneli kompileerimist täiesti puhtast kaustast alustada, on võimalik terve lähtekoodi kaust puhastada juba kompileeritud failidest. Selleks tuleb kasutada käsku

# make clean

Kui on vaja viia kaust tagasi sellisele kujule nagu ta enne konfigureerimist ja kompileerimist oli, on ka selleks olemas vastav käsk.

# make mrproper

NB! make mrproper kustutab lisaks kompileeritud binaaridele ka .config faili, kus asub kerneli konfiguratsioon. Seda käsku pole tavaliselt vaja käivitada. Kui selleks mingil põhjusel siiski vajadus tekib, tee oma .config failist varukoopia!

Bootloaderi uuendamine

GRUB

Tuleb teha!

LILO

Tuleb teha!