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.
Sisukord
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.
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.
Jõudu Kernelite kompileerimisel :)
Õpetuse algallikas on HowtoForge. Tõlkis spott