Fedora kerneli kompileerimine
|
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
Nüüd käivitage käsk:
make menuconfig
mis toob Teile ette kerneli seadistusmenüü. Valige Load an Alternate Configuration File ja valige sealt .config.
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).
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:
vajutage siis esc nuppu ja teile avaneb umbes järgmine vaade:
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.
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








