Ohjeet ytimen käännöksen tekemiseksi siten että lähtökohtana käytetään viimeistä virallista RHEL-ydintä ja lopputuloksena on asennettava RPM. Red Hat ei tue koko prosessia ja sen takia se on vaikea. Red Hat:in oma prosessi vie noin 4 tuntia, tässä käytämme vielä epävirallisempaa tapaa tehdä ydin ja sen käyttö on vähän nopeampaa.
Muistathan että omien ytimien käyttö ei ole RH:n tukemaa!
Red Hat on jo kauan käyttänyt ytimissään paljon muutoksia (patches) varsinaisen virallisen ytimen päälle (http://www.kernel.org/). Tämän lisäksi huomionarvoinen asia on se että ytimen varsinainen versio ei muutu yhden RHEL-sarjan sisällä. Tämä tarkoittaa sitä että vaikka nyt uusin virallinen versio ytimestä on 2.6.14, niin RHEL:issä käytetään ytimen versiota 2.4.9. Red Hat toki tekee uusimpien versioiden korjaukset myös omaan versioonsa joten esim. tietoturva-asiat ovat samalla tasolla (ellei paremminkin) RH:n omassa versiossa. Samalla logiikalla toimivat myös muut kaupalliset Linux-jakelutoimittajat (esim. SUSE).
Johtuen Linuxin ytimen lisenssistä, Red Hat joutuu pakostakin jakamaan lähdekoodin ytimeen sekä siihen liittyvät muutokset. Päivitetyt lähdekoodipaketit löytyvät osoitteesta http://ftp.redhat.com/pub/redhat/linux/updates/enterprise/4AS/en/os/SRPMS/ .
Tarvittavat paketit ovat muotoa kernel-2.6.9-*.src.rpm . Ei ole merkitystä minkä RHEL-ominaisuusversion ytimen lähdekoodit otat (samasta paketista muodostetaan kaikkien eri versioiden ytimet (AS, ES ja WS).
Latauksen jälkeen tulee lähdekoodipaketti asentaa seuraavasti:
[root@lk7400 /var/spool/up2date]$ rpm -ivh kernel-2.6.9-22.0.1.EL.src.rpm 1:kernel ########################################### [100%]
[ Ytimen lähdekoodin asennus ]
Lähdekoodi RPM:t purkautuvat /usr/src/redhat/-hakemistohierarkian alle. Rakennusta ohjaa nk. SPEC-tiedosto (RPM specification file).
[root@lk7400 /var/spool/up2date]$ cd /usr/src/redhat/SPECS [root@lk7400 /usr/src/redhat/SPECS]$ ls -la total 172 drwxr-xr-x 2 root root 4096 Nov 17 09:50 . drwxr-xr-x 7 root root 4096 Nov 14 17:38 .. -rw-rw-r-- 1 root root 149448 Oct 19 01:16 kernel-2.6.spec
[ Lähdekoodipakettien mukana tulevat SPEC-tiedostot ]
Normaalisti paketti rakennettaisiin rpmbuild työkalulla ilman -bp -optiota mutta haluamme jättää rakennuksen siihen vaiheeseen että lähdekoodi on valmisteltu käännöstä varten mutta käännöstä ei ole aloitettu. Tämä sen vuoksi että voimme käydä muokkaamassa rakennettavan ytimen konfiguraatiota.
[root@lk7400 /usr/src/redhat/SPECS]$ rpmbuild -bp --target=i686 kernel-2.6.spec Building target platforms: i686 Building for target i686 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.27837 + umask 022 + cd /usr/src/redhat/BUILD + LANG=C + export LANG + unset DISPLAY + cd /usr/src/redhat/BUILD + rm -rf kernel-2.6.9 + /bin/mkdir -p kernel-2.6.9 + cd kernel-2.6.9 + /usr/bin/bzip2 -dc /usr/src/redhat/SOURCES/linux-2.6.9.tar.bz2 + tar -xf - ...
[ Ytimen lähdekoodin valmistelu käännöstä varten ]
[root@lk7400 /usr/src/redhat/SPECS]$ cd ../BUILD/kernel-2.6.9/linux-2.6.9/
[ Vaihto rakennushakemistoon ]
Seuraavaksi otetaan konfiguraatiotiedosto (.config) jota RH itse käyttää ytimiensä käännökseen. Se on hyvä konffis pohjalle jottei tarvitse keksiä mitä kaikkia ominaisuuksia juuri RHEL (jakeluna) tarvitsee ytimeltä. SOURCES-hakemistossa on useampi .config-tiedosto joten valitse tarpeidesi mukainen. Tässä otetaan yhden prosessorin ytimen konffis ja kopioidaan se paikoilleen.
[root@lk7400 /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9]$ cp ../../../SOURCES/kernel-2.6.9-i686.config .config cp: overwrite `.config'? y
[ Uusimman ydinkonfiguraation päivitys ]
Normaalisti -bp-optiolla purkautuvat kernelit tulevat 2.6.9-prep-nimisiksi. Vaihdetaan seuraavaksi versiotarkennin vähän kuvaavammaksi (jossa tosin tässä tapauksessa on arveluttavaa onko tarkennin yhtaan kuvaavampi kuin aiemmin :-).
[root@lk7400 /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9]$ head -6 PATCHLEVEL = 6 SUBLEVEL = 9 EXTRAVERSION = -prep NAME=AC 1 Muuta EXTRAVERSION kuvaavammaksi EXTRAVERSION = -foo
[ Versiotarkentimen muutos ]
Joskus RH:n käyttämät konffikset eivät ole täysin tarkasti synkassa levitetyn lähdekoodipaketin suhteen. Tämän vuoksi ajetaan konfiguraation päivitysvaihe jossa joudutaan vastaamaan interaktiivisesti kysymyksiin joihin ei löydy valmista vastausta nykyisestä .config-tiedosta. Tässä tapauksessa asetuksia on vain yksi joten kysymyksen oletusvastaus hyväksytään ENTER:illä.
[root@lk7400 /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9]$ make oldconfig ... * * QoS and/or fair queueing * QoS and/or fair queueing (NET_SCHED) [Y/n/?] y Packet scheduler clock source >gt; 1. Timer interrupt (NET_SCH_CLK_JIFFIES) (NEW) 2. gettimeofday (NET_SCH_CLK_GETTIMEOFDAY) (NEW) 3. CPU cycle counter (NET_SCH_CLK_CPU) (NEW) choice[1-3?]: [ENTER] ...
[ Konfiguraation sisäinen päivitys ]
Käynnistetään seuraavaksi tekstimenipohjainen konffisohjelma jonka kautta käydään sitten asettamassa halutut ominaisuudet päälle.
[root@lk7400 /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9]$ make menuconfig
[ Tekstimenupohjaisen konfiguraation käynnistys ]
[ Menuconfig ]Mikäli et halua että ytimen debuggausta varten tarvittavat tiedot eivät paisuta tehtyä RPM-tiedostoa, ota alla kuvattu asetus pois päältä. Mikäli valmistuva RPM-pakettisi on noin 40 MiB:in kokoinen, olet jättänyt debug-tiedot sisälle. Kannattanee ottaa koko "Kernel debugging" pois jottei riippuvuudet mene rikki ytimen sisällä.
[ DEBUG-tieto pitää ottaa pois ellet halua isoa ydintä ]
[ Muista tallentaa asetukset lopettaessasi ]Jotta kernel-RPM asennettaessa tekee tarvittavan initrd:n sekä lisätään GRUB:iin, tarvii tehdä pieni lisäys skriptiin joka rakentaa RPM:n. Skriptiin tarvittava lisäys on ohjeiden jälkeen mutta voit ladata myös paremman version täältä: mkspec.
[root@lk7400 /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9]$ cp /home/oppi/make_newmkspec scripts/package/mkspec cp: overwrite `scripts/package/mkspec'? y
[ Paremman mkspec-ohjelman päivitys ]
Ja nyt seuraa viimeinen vaihe, eli paketinrakennuksen aloitus, jonka lopputuloksena meille pitäisi ilmeistyä RPM-tiedosto /usr/src/redhat/RPMS/-hakemiston alle. Johtuen hiukan rikkinäisestä mkspec:istä, valmis paketti ilmestyy i386-hakemiston alle vaikka pitäisi ilmestyä i686-hakemiston alle.
[root@lk7400 /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9]$ make rpm /bin/sh /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/scripts/package/mkspec >gt; /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/kernel.spec make clean set -e; cd ..; ln -sf /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9 kernel-2.6.9foo set -e; cd ..; tar -cz -f kernel-2.6.9foo.tar.gz kernel-2.6.9foo/. ...
[ Ytimen paketoinnin käynnistys ]
Ytimen käännös RH:n oletuskonfiguraatiolla vie noin 15-20 minuuttia nopealla koneella.
[root@lk7400 /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9]$ cd ../../../RPMS/i386/ [root@lk7400 /usr/src/redhat/RPMS/i386]$ ls -la total 9208 drwxr-xr-x 2 root root 4096 Nov 17 14:08 . drwxr-xr-x 8 root root 4096 Nov 14 17:38 .. -rw-r--r-- 1 root root 9391802 Nov 17 10:58 kernel-2.6.9foo-1.i386.rpm [root@lk7400 /usr/src/redhat/RPMS/i386]$ rpm -ivh kernel-2.6.9foo-1.i386.rpm Preparing... ########################################### [100%] 1:kernel ########################################### [100%] [root@lk7400 /usr/src/redhat/RPMS/i386]$ cat /boot/grub/menu.lst # 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/rootLV # initrd /initrd-version.img #boot=/dev/hda default=1 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux ES (2.6.9-foo) root (hd0,0) kernel /vmlinuz-2.6.9-foo ro root=/dev/VolGroup00/rootLV rhgb quiet initrd /initrd-2.6.9-foo.img title Red Hat Enterprise Linux ES (2.6.9-22.ELsmp) root (hd0,0) kernel /vmlinuz-2.6.9-22.ELsmp ro root=/dev/VolGroup00/rootLV rhgb quiet initrd /initrd-2.6.9-22.ELsmp.img title Red Hat Enterprise Linux ES-up (2.6.9-22.EL) root (hd0,0) kernel /vmlinuz-2.6.9-22.EL ro root=/dev/VolGroup00/rootLV rhgb quiet initrd /initrd-2.6.9-22.EL.img
[ Ytimen asennus RPM:stä ]
Kuten yltä voi huomata, ytimen mkspec tekee RPM:n väärällä arkkitehtuuritiedolla. Sen pitäisi olla i686, mutta onkin i386. Ydin on kuitenkin käännetty i686:lle joten tässä tapauksessa RPM:n nimessä oleva tieto on väärin. Tämä on korvattavissa luultavasti jostain mutta se selvinnee myöhemmin että mistä :-).
Tarkista aina että menu.lst on päivitetty oikein. Meidän tapauksessa uusi kernelimme ei ole oletuskerneli (default). Tarkista että default on 0 mikäli uusi kernelisi on asetettu ensimmäiseksi.
Alla on parempi mkspec skripti joka tekee RPM-tiedostoihin myös automaattisen initrd-generoinnin sekä menu.lst-päivityksen.
#!/bin/sh # # Output a simple RPM spec file that uses no fancy features requring # RPM v4. This is intended to work with any RPM distro. # # The only gothic bit here is redefining install_post to avoid # stripping the symbols from files in the kernel which we want # # Patched for non-x86 by Opencon (L) 2002 <opencon@rio.skydome.net> # # how we were called determines which rpms we build and how we build them if [ "$1" = "prebuilt" ]; then PREBUILT=true else PREBUILT=false fi # starting to output the spec if [ "`grep CONFIG_DRM=y .config | cut -f2 -d\=`" = "y" ]; then PROVIDES=kernel-drm fi PROVIDES="$PROVIDES kernel-$KERNELRELEASE" __KERNELRELEASE=`echo $KERNELRELEASE | sed -e "s/-//g"` echo "Name: kernel" echo "Summary: The Linux Kernel" echo "Version: $__KERNELRELEASE" # we need to determine the NEXT version number so that uname and # rpm -q will agree echo "Release: `. $srctree/scripts/mkversion`" echo "License: GPL" echo "Group: System Environment/Kernel" echo "Vendor: The Linux Community" echo "URL: http://www.kernel.org" if ! $PREBUILT; then echo "Source: kernel-$__KERNELRELEASE.tar.gz" fi echo "BuildRoot: /var/tmp/%{name}-%{PACKAGE_VERSION}-root" echo "Provides: $PROVIDES" echo "%define __spec_install_post /usr/lib/rpm/brp-compress || :" echo "%define debug_package %{nil}" echo "" echo "%description" echo "The Linux Kernel, the operating system core itself" echo "" if ! $PREBUILT; then echo "%prep" echo "%setup -q" echo "" fi echo "%build" if ! $PREBUILT; then echo "make clean && make %{_smp_mflags}" echo "" fi echo "%install" echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules' echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{_smp_mflags} modules_install' echo 'cp $KBUILD_IMAGE $RPM_BUILD_ROOT'"/boot/vmlinuz-$KERNELRELEASE" echo 'cp System.map $RPM_BUILD_ROOT'"/boot/System.map-$KERNELRELEASE" echo 'cp .config $RPM_BUILD_ROOT'"/boot/config-$KERNELRELEASE" echo "" echo "%clean" echo '#echo -rf $RPM_BUILD_ROOT' echo "" echo "%files" echo '%defattr (-, root, root)' echo "%dir /lib/modules" echo "/lib/modules/$KERNELRELEASE" echo "/boot/*" echo "" # this snippet should be appended to # !AK this is the append echo "%pre" echo "/sbin/modprobe loop 2> /dev/null > /dev/null || :" echo "exit 0" echo "%post" echo "[ -x /usr/sbin/module_upgrade ] && /usr/sbin/module_upgrade" echo "[ -x /sbin/new-kernel-pkg ] && /sbin/new-kernel-pkg --package kernel --mkinitrd --depmod --install $KERNELRELEASE" echo "%preun" echo "/sbin/modprobe loop 2> /dev/null > /dev/null || :" echo "[ -x /sbin/new-kernel-pkg ] && /sbin/new-kernel-pkg --rminitrd --rmmoddep --remove $KERNELRELEASE"
[ Uusi versio mkspec:istä, huomaa viimeiset rivit ]
Copyright 2005 Tieturi Oy/Aleksandr Koltsoff paitsi mkspec joka on GPL:n alainen