Fedora kerneli kompileerimine

Allikas: Pingviini viki
Tux resized.png 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. (Teise osa tõlkimine on hetkel pooleli).


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

Nüüd käivitage käsk:

make menuconfig

mis toob Teile ette kerneli seadistusmenüü. Valige Load an Alternate Configuration File ja valige sealt .config.

Fck1.png

Fck2.png

Nüüd võite liikuda mööda erinevaid menüüsid ja sisse viia endale sobivad muudatused. Kas siis luua mõned lisamoodulid, või need hoopis eemaldada jne. Kui olete lõpetanud, siis valige Exit ja vastake küsimusele Do you wish to save your new kernel configuration? Yes (jah).

Fck3.png

Kerneli rpm paketti loomine

Nüüd pole muud, kui luua oma kernelist ka rpm pakett. Selleks käivitage järgnev käsk:

make rpm

Peale seda leiate uue src.rpm paketti ~/rpmbuild/SRPMS/ kataloogis. Näiteks: ~/rpmbuild/SRPMS/kernel-2.6.18custom2.6.18.2-1.src.rpm.

Lisaks sellele ka vastavalt teie target real kirjeldatud arhidektuurile ka rpm paketi. ~/rpmbuild/RPMS/i386/ (või siis ~/rpmbuild/RPMS/i586/, ~/rpmbuild/RPMS/i686/ ).

Uue kerneli paigaldamine

Nüüd tuleb siis uus kernel ka süsteemi paigaldada.

cd ~/rpmbuild/RPMS/i386
rpm -ivh kernel-2.6.18custom2.6.18.2-1.i386.rpm

( kataloog /rpmbuild/RPMS/i386 sõltub teie arhidekturist) Samal moodusel võite sama kernelit paigaldada ka kõigisse teistesse Fedora Core masinatesse.

Nüüd tuleb veel paigaldada ka ramdisk fail, sest muidu ei buudiks süsteem Teie uute kerneliga.

mkinitrd /boot/initrd-2.6.18-custom-2.6.18.2.img 2.6.18-custom-2.6.18.2

Nüüd tuleb muuta natuke Grubi konfiguratsioni faili. Fedoras saate seda teha:

nano /boot/grub/menu.lst 

Näidis enne uue kerneli lisamist olnud Grubi menu.lst failist:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu

title Fedora Core (2.6.18-1.2798.fc6)
       root (hd0,0)
       kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
       initrd /initrd-2.6.18-1.2798.fc6.img

Ja siin näidis, kuidas näeb väja vastav fail peale uue kerneli lisamist:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu

title Fedora Core (2.6.18-custom-2.6.18.2)
       root (hd0,0)
       kernel /vmlinuz-2.6.18-custom-2.6.18.2 ro  root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-custom-2.6.18.2.img

title Fedora Core (2.6.18-1.2798.fc6)
       root (hd0,0)
       kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
       initrd /initrd-2.6.18-1.2798.fc6.img

Täpse kerneli nime leidmiseks on Teile abiks ls -l käsk:

cd /boot
ls -l

Nüüd tuleks siis süsteem uuesti käivitada:

shutdown -r now

Kui kõik läks korralikult, siis peale restarti võite anda käsu:

uname -r

ja selle tulemuseks peaks olema:

2.6.18-custom-2.6.18.2

Või mis iganes nime oma kernelile andsite.

Kui kõik ei läinud nii nagu peaks

Kui süsteem siiski ei käivitu teie uue kerneliga, siis pange kirja, mis veateate ta annab. Seda läheb teil vaja, et viga üles otsida. Siis restartige uuesti süsteem ja Grubi laadimisel:

Fck4.png

vajutage siis esc nuppu ja teile avaneb umbes järgmine vaade:

Fck5.png

Seal nimekirjas on kõik teie süsteemi kernelid. Valige sealt mõni varasem kernel, mis töötas ja käivitage sellega süsteem. Siis saate uuesti siirduda oma uue kerneli juurde ja vajaminevad muudatused sisse viia. Vajadusel võite ta ajutiselt alati Grubi menu.lst failist eemaldada.


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