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!

Ytimen lähdekoodi

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
[ 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ä
[ DEBUG-tieto pitää ottaa pois ellet halua isoa ydintä ]

Muista tallentaa asetukset lopettaessasi
[ 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