Fedora kerneli kompileerimine

Allikas: Pingviini viki
Redaktsioon seisuga 15. november 2006, kell 14:43 kasutajalt Spott (arutelu | kaastöö) (→Vajalike pakettide paigaldamine)
Mine navigeerimisribaleMine otsikasti
Oodake, artikli kirjutamine on alles pooleli!

Kuigi Fedoral on korralikud oma paki Kernelid olemas tekib alati mõnel kasutajal tahtmine ise endale uus Kernel valmis kompileerida. Põhjuseid võib olla mitmeid. Näiteks soov luua endale minimalistlik versioon Fedorast, kus kernelist on kõik mittevajalik eemaldatud. Või siis on tarvis lisada hoopis mõne sellise riistvara tugi, mida kohe kaasas pole. Või soovitakse kasutada uusimat olemasolevat Linuxi Kernelit, mida on võimalik tõmmata ainult otse netist ja ise valmis kompileerida.

Käesolev õpetus õpetabki, kuidas Fedoras valmis kompileerida Vanilla Kernel, ehk siis Kernel www.kernel.org lehelt. Õpetus peaks toimima Fedora Core 6-ga.

alustuseks

Kogu õpetuse võib sisuliselt jagada kaheks. Esimene osa on Fedora spetsiifiline õpetus, mille tulemuseks on vastav kerneli rpm pakett, mida on võimalik jagada ka kõigile teistele kasutajatele.

Teine osa õpetusest näitab aga kerneli kompileerimist üldiselt ja see osa õpetusest peaks sobima kõigile erinevatele süsteemidele.


Soovituslik on läbi viia kõik uue kerneli kompileerimise ja valmistamise toimingud root kasutaja õigustes. Samas võib aga paljud toimingud läbi viia ka tavakasutaja õigustes. Et seda olukorda lihtsustada, siis parimaks mooduseks on lisada oma kasutajanimi (olgu selleks näiteks toomas) sudo kasutajate grupp. Seda saate teha /etc/sudoers failis.

nano /etc/sudoers

Seda saate loomulikult teha ainult root kasutaja õigustes. Lisage sinna faili järgmine rida:

toomas  ALL=(ALL) ALL

Nüüd saate ka tavakasutajana erinevaid käske anda, mis muidu nõuavad root kasutaja õiguseid. Näiteks, kui soovite paigaldada mõningaid pakette yumi abil, siis antav käsk näeks välja:

sudo yum install fedora-rpmdevtools unifdef

Loomulikult võite endale aga käsku su kasutades võtta root kasutaja õigused kogu ajaks ja teha kõik toimingud root kasutaja õigustes. Siis enam sudo ette pole vaja lisada.

Kerneli rpm paketti loomine

rpmbuild kataloogi loomine

Selleks, et luua mingit rpm paketti on alati hea, kui selles tegevuses on mingi korrapära. rpm pakettide loomiseks on kõige mõistlikum luua rpmbuild kataloog:

cd ~
cp -a /usr/src/redhat/ rpmbuild
echo '%_topdir %(echo $HOME)/rpmbuild' >> .rpmmacros 

Nüüd paigaldame vajalikud pakettid:

yum install fedora-rpmdevtools unifdef

ja käivitage käsk:

fedora-buildrpmtree

Laadige alla Fedora kernel src.rpm pakett

Nüüd tuleb alla laadida viimane Fedora kerneli src.rpm pakett vastavalt oma Fedora Core versioonile. Fedora Core 6 kohta leiate src.rpm paketti: http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/

Fedora Core 5 jaoks: http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/

Ja nii edasi.

Hetkel viimane kerneli versioon Fedora Core 6-le on kernel-2.6.18-1.2798.fc6.src.rpm, seega laeme selle alla:

cd /usr/src
wget http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/kernel-2.6.18-1.2798.fc6.src.rpm
rpm -ivh kernel-2.6.18-1.2798.fc6.src.rpm

Juhul, kui saate paigaldusel veatetateid:

warning: user brewbuilder does not exist - using root
warning: group brewbuilder does not exist - using root

Siis neid hoiatusi võite lihtsalt ignoreerida.

Nüüd olemegi siis tõmmanud 2.6.18 kerneli lähtekoodi, millega on kaasas ka hulgaliselt Fedora erinevaid paikasid ja täiustusi ja ühtlasi ka täiendus 2.6.18.1 kerneli jaoks. Jätkates saame me tõmmatud lähtekoodist lõpuks valmis kompileerida 2.6.18.1 kerneli.

Kerneli täiendamine

Samas soovime meie valmistada hoopis 2.6.18.2 kernelit. Tõmmatud src.rpm pakett lubab meile aga valmistada ainult 2.6.18.1 kernelit. Seega vajame vastavat täiendust (patch) www.kernel.org kodulehelt. Selleks:

cd ~/rpmbuild/SOURCES/
wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.18.2.bz2

Ühtlasi võite tõmmata endale ka muud täiendused (patchid), mida soovite. Näiteks, kui soovite hoopis katsetada 2.6.19 kerneli eelväljalaskeid, siis võite tõmmata näiteks: http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc5.bz2 Samas tuleb arvestada, et sellisel kujul versiooni uuendada saate ainult seni, kuni 2.6.19 kernel pole ametlikult välja lastud. Ja seda täiendust saate kasutada ainult 2.6.18 kerneliga, mitte juba selle täiustusega. Lähem selgitus selle kohta on siin: http://kernel.org/patchtypes/pre.html


Nüüd tuleb muuta kernel-2.6.spec faili, et viimane teaks meie uue loodava kerneli täiendusi (patche). Selleks:

cd ~/rpmbuild/SPECS/
nano kernel-2.6.spec

Sealt otsige nüüd üles järgnev rida:

Patch1: patch-2.6.18.1.bz2

ja asendage see järgnevaga

Patch1: patch-2.6.18.2.bz2

(või mis iganes täienduse te alla tõmbasite) Nüüd käivitage käsk:

rpmbuild -bp kernel-2.6.spec

Kui soovite aga valmistada kernelit mõnele konkreetsele arhidektuurile, siis võite kasutada hoopis järgnevat käsku:

rpmbuild -bp --target=i686 kernel-2.6.spec

target taha määrake siis soovitud arhidektuur i386, i586, i686 või x86_64. Juhul, kui te ei määra, mis arhidektuurile kernel valmistatakse, siis tehakse see i386 arhidektuurile.

Nüüd tuleb aga üks kõige huvitavam osa Fedora kerneli kompileerimisel. Nimelt tõmmatud src.rpm pakettid sisaldasid endas ka mitmeid Fedora täiendusi (patche), mis ei pruugi aga koos töötada teie soovitud versiooniga (ehk siis meie õpetuse puhul 2.6.18.2 täiendusega). Teile kuvatakse rpmbuildi väljund, mis sarnaneb järgnevaga:

+ echo 'Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):'
Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):
+ patch -p1 -s
Reversed (or previously applied) patch detected! Assume -R? [n]
Apply anyway? [n]
1 out of 1 hunk ignored -- saving rejects to file  drivers/block/DAC960.c.rej
error: Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)


RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)

See tähendab, et Teil tuleb taas muuta kernel-2.6.spec faili ja eemaldada sealt täiendus (patch) number 300:

nano kernel-2.6.spec

Otsige sealt üles siis järgnev rida, mis veateate andis ja kommenteerige see välja, lisades # sinna ette:

[...]
#Patch300: linux-2.6-ppc-dac960-ipr-clash.patch
[...]
#%patch300 -p1
[...]

Ja nüüd käivitage rpmbuild käsk uuesti.

rpmbuild -bp kernel-2.6.spec

või koos target lipuga. 'OLULINE ON TÄHELE PANNA, ET PEATE EEMALDAMA kernel-2.6.spec FAILIST KÕIK NEED READ, MIS VEATEATEID ANNAVAD! VAJADUSEL TULEB SEDA SAMMU MITU KORDA LÄBI TEHA!'

Määrake kerneli tuvastamine

Hiljem on Teil vaja kuidagi siiski ka tuvastada, millise kerneli te ise kokku kompileerisite. Selleks oleks talle hea anda kas konkreetne nimi või tähis. Selleks:

cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i386
nano Makefile

Sealt leiate rea EXTRAVERSION ja sinna taha võite lisada oma tähise. Näiteks:

EXTRAVERSION = -custom-2.6.18.2

Kerneli seadistamine

Hangime Kerneli lähtekoodi

Nüüd on paras aeg hankida endale Kerneli lähtekood. Kõige õigem on ta tõmmata kataloogi /usr/src, seega esimesena liikuge sinna kataloogi:

cd /usr/src

Nüüd on paras aeg kindlaks teha, mis Kernelit soovite endale paigaldada. Kõik erinevad Linuxi 2.6 seeria Kernelid leiate http://www.kernel.org/pub/linux/kernel/v2.6/ valige endale sealt meelepärane välja. Näiteks otsustasite valida linux-2.6.18.1.tar.bz2 Kerneli. Siis selle saate alla tõmmata:

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2

Kui sobiv Kernel on alla tõmmatud, siis tuleb ta lahti pakkida ja luua link kataloogile /usr/src/linux. Edaspidistes käskudes jälgige, et sisestaksite ikka oma tõmmatud Kerneli numbri.

tar xjf linux-2.6.18.1.tar.bz2
ln -s linux-2.6.18.1 linux
cd /usr/src/linux

Lisame Kernelile mõned paigad (valikuline)

Vahest on vaja lisada Kernelile mõned paigad/täiustused. Näiteks riistvara tugi, mida pole ametlikult Kernelis. Või soovite lisada virtualiseerimise toe, mida vaikimisi Kernel veel ei toeta.

Näiteks tõmbasite endale Kernelile mõeldud paiga (path) - patch.bz2 kataloogi /usr/src kataloogi. Nüüd on aeg see path lisada Kerneli lähtekoodile (olete endiselt /usr/src/linux kataloogis)

bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run

See käsk ainult testib, et kas saab antud pathi Kernelile lisada. Kui sellega Teil mingeid veateateid ei tule, siis võite alles käivitada teise käsu.

bzip2 -dc /usr/src/patch.bz2 | patch -p1

Selle käsuga siis lisasite soovitud pathi oma Kerneli lähtekoodile.

Näiteks soovite endale luua viimast 2.6.19-r4 Kernelit. Neid Kerneleid välja pole lastud vaid ongi just lisatud ainult vajaminevad paigad stabiilsele 2.6.18 Kernelile (just 2.6.18 Kernelile, mitte enam selle vigade parandustele 2.6.18.1 jne) Seega tuleb Teil alla tõmmata patch-2.6.19-rc4.bz2 ja 2.6.18 Kerneli lähtekood. Ehk siis sellisel juhul oleks kogu tegevus järgmine (algusest peale):

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2
tar xjf linux-2.6.18.tar.bz2
ln -s linux-2.6.18 linux
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1

Kerneli seadistamine

Nüüd oleme jõudnud järgmise sammuni oma Kerneli kompileerimisel. Nimelt Kerneli seadistamiseni. Samas on igati kasulik hoida oma hetke Kerneli seadistus alles, et seda saaks uuesti kasutada ja muudatusi sisse viia. Kopeerime selle /boot partitsioonile (või kataloogi):

cp /boot/config-`uname -r` ./.config 

Nüüd on aeg siis käivitada Kerneli peamine seadistusprogramm - menuconfig

make menuconfig

See avab Teile Kerneli seadistuste menüü, sealt valige Load an Alternate Configuration File ja valige .config. Sellega laete oma praeguse töötava Kerneli seadistuste faili (eelnevalt tegite sellest koopia).



Nüüd pole siis muud, kui liikuda mööda Kerneli seadistuste menüüsid, lisada ja eemaldada endale sobivad lisad. Kui olete lõpetanud, siis valige Exit ja sealt küsitakse Do you wish to save your new kernel configuration? valige sealt Yes:


Kerneli valmistamine

Nüüd pole siis jäänud muud, kui Kenrnel valmis kompileerida. Seda saate teha järgmiste käskudega:

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers 

Peale --append-to-version= võite kirjutada oma Kernelit iseloomustava pealkirja. Kuid oluline on teada, et see peab algama - märgiga ja vahel ei tohi olla tühikut. Nüüd kompileeritakse Teie Kernelit. See võib võtta aega tunde. Sõltuvalt, mida oma Kernelisse lisasite ja kui kiire on Teie protsessor.

Uue Kerneli paigaldamine

Kui Kernel kompileeritud, siis on paras aeg ta ka paigaldada. Leiate oma /usr/src kataloogist nüüd kaks uut deb paketti. Seda saate näha:

cd /usr/src
ls -l

Meie esialgse näite kohaselt peaks nüüd olema järgmised deb paketid:

linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb ja linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb Need saame paigaldada järgmiste käskudega:

dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb

Te võite need deb pakettid viia ka mujale masinasse. Ehk Teil pole vaja neid kohapeal ise kompileerida.

Ongi kõik, te võite nüüd veel vaadata, kas on tekitatud ka vastavad kirjed /boot/grub/menu.lst faili:

nano /boot/grub/menu.lst

Seal peaksite leidma endale järgmised read:

title           Ubuntu, kernel 2.6.18.1-custom
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splash
initrd          /boot/initrd.img-2.6.18.1-custom
savedefault
boot

title           Ubuntu, kernel 2.6.18.1-custom (recovery mode)
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro single
initrd          /boot/initrd.img-2.6.18.1-custom
boot

Nüüd pole muud, kui restartida süsteem:

shutdown -r now

Kui kõik läks hästi, siis peaksite buutima üles juba oma uue Kerneliga. Seda saate hiljem kontrollida käsuga:

uname -r

Mille tulemuseks peaks siis olema midagi sellist: 2.6.18.1-custom (või siis vastavalt Teie pandud nimele ja Kernelile)

Juhul, kui süsteem ei käivitu selle loodud Kerneliga, siis ärga muretsege. Käivitage uuesti arvuti ja Grubi juures vajutage Esc klahvi. Teile avaneb kõigi saadaolevate Kernelite nimekiri. Valige mõõni vanem ja käivitage arvuti sellega. Kuid kindlasti on mõistlik eelnevalt kirja kuskile panna, mis veateate Teie Kernel andis, et ta ei käivitanud. See on abiks vea otsingul.

Jõudu Kernelite kompileerimisel :) Õpetuse algallikas on HowtoForge. Tõlkis spott