Home
 
Je eigen kernel compileren
In deze handleiding ga ik in op het besturen, compileren en installeren van een kernel. Het is geschreven voor newbies.
Op- en aanmerkingen omtrent deze tekst kunnen naar mij toegestuurd worden (contact).
 
Wat is nou eigenlijk de kernel ?
De Linux-kernel is de kern van het besturingssysteem Linux. Het werkt in principe als een doorgeefluik. Als een programma met een hardware-apparaat wil communiceren - bv bij het kopieren van data of het printen van tekst - worden de aanvragen door het programma aan de kernel gestuurd die wederom de hardware aanspreekt. Ook wordt het virtueel geheugen, de hardware-drivers enzoverder door de kernel geregeld.
Omdat de Linux-kernel een zgn 'monolithische' kernel is, zitten de hardware- en netwerkdrivers in de kernel zelf. Met andere woorden: als men een nieuwe driver nodig heeft zal men de kernel, of de verantwoordelijke kernel-module opnieuw moeten compileren.

In deze handleiding worden de stappen om een nieuwe kernel op een PowerPC te compileren stap voor stap uitgelegd.
Waarom moet ik eigenlijk mijn kernel opnieuw compileren ?
Vaak is het niet nodig. De kernel die bij de Linux-distro wordt meegeleverd is voor een hoop drivers reeds geschikt. Het wordt pas noodzakelijk als:
- bepaalde apparatuur niet aan te spreken is onder de huidige kernel, denk aan grafische kaarten, printers, firewire etc
men stabielere kernels nodig heeft
- software nieuwere kernel vereist
- oude Macs gebruikt worden en men handig moet omgaan met de beperkte hoeveelheid RAM
- men een hoogbelaste webserver heeft waarvoor modules zijn te compileren die de webserver sneller maken
Uiteraard zijn er nog andere reden te bedenken om te compileren echter heb ik hier de meestvoorkomende genoemd.
 

Kernelcompilatie: een snelle leidraad
De volgende stappen kunnen alleen worden uitgevoerd als root. In het voorbeeld wordt uitgegegaan van een compilatie van een 2.4.x kernel.

Belangrijk: Als men dit gaat doen is het handig om een 'rescue-CD' bij de hand te hebben als iets zou misgaan (je vergeet een belangrijke module te compileren bv) en men zo de oude kernel weer kan installeren.

Kernels zijn te vinden op kernel.org maar voor de Mac zijn er ook source kernels te vinden op PenguinPPC.org, ontwikkeld door BenH of ppc.samba.org,. Overigens zijn op TuxPPC.com ook pregecomplieerde kernels te vinden, geoptimaliseerd voor bepaalde types van Macs.
We gaan ervan uit dat de broncode van de BenH-boom gebruikt gaat worden in het volgende experiment. Als men een officiele kernel gaat compileren kan men dit stukje overslaan.

cd /usr/src
mkdir benh_kernel
rsync -avz rsync.penguinppc.org::linux-2.4-benh /usr/src/benh_kernel


Rsync is een stukje software die het mogelijk maakt via internet de laatste kernel te downloaden. Het kan een paar minuten duren, afhankelijk van de internetverbinding. Alles wat je vanaf nu moet doen om een kernel bij te werken is het laatste commande opnieuw uit te voeren voordat je de kernel opbouwt ('build'). De bron zit namelijk vanaf nu in de benh_kernel dir. Typ nu

mv /usr/src/linux usr/src/linux/old
ln -sf /usr/src/benh_kernel /usr/src/linux


Dit laatste commando zorgt ervoor dat de nieuwe kernel-bron wordt 'gelinkt'.
Je kunt nu naar Gereedschap controleren gaan of lees door als je een officiele kernel wilt compileren.

Tip: Als je een 'Newworld' Mac hebt is het aan te raden de BenH kernels te gebruiken om problemen te voorkomen.

Het hangt af welke mirror je gebruikt, de bron is meestal te vinden in /pub/linux/kernel/. Hier vind je heel veel vX.X (X.X zijn versie-nummers). Afhankelijk van de mirror kunnen ze wel teruggaan naar de origenele 0.X kernel-series. Dus de vraag is: welke gaan we nemen ? De huidige stabiele versie is 2.4, en 2.5 zit in een ontwikkelingsfase. Het is makkelijk te herkennen of een versie stabiel is of een zgn ‘development’ versie is: het tweede getal is oneven voor ‘development’ en even voor stabiel. Als je heel paranoia bent over deze laatste 2.4 versie, kun je ook de laatste 2.2 nemen.
We gaan ervan uit dat je de 2.4 versie gaat nemen. Ga naar de v2.4 dir. Je ziet hier heel veel patch-* en linux-* (* = versie.tar.ext en ext kan gz, bz2). De patch-files kunnen gebruikt worden om om de bron van de ene naar de andere versie om te zetten zonder dat je de hele bron hoeft te downloaden. De linux v2.4 broncode is ongeveer 23 Mb groot, dus breedbandinternet is gewenst !
Op het moment van het schrijven van deze handleiding is de stabiele kernel versie 2.4.18 (26 april 2002). In pricipe zijn alle kernels vanaf 2.4.12 veilig. Dus de beste kernel is waarschijnlijk nu linux-2.4.18.tar.bz2.

 

Voorbereiding voor de opbouw van de kernel
Nu dat de kernel is gedownload moet men het systeem klaarmaken voor de opbouw van de kernel. Standaard wordt de bron geplaatst in /usr/src maar zorg ervoor dat alle handelingen uitgevoerd worden als root ! Voor de veiligheid maken we eerst een andere dir in /usr/src, bv linuxtemp. Dus u typt:
mkdir /usr/src/linuxtemp
We gaan in deze handleiding uit dat u weet waar u uw kernel heeft gedownload. Wij hebben hem in /tmp geplaatst. Cd naar /tmp en (cd /tmp) en decomprimeer het bestand:

bunzip2 linux-2.4.18.tar.bz2 (als het een bz2 ofwel een bzip-bestand is)
gzip –d linux-2.4.18.tar.gz (als het een gz ofwel gzip-bestand is)

Als u nu een kijkje neemt in de directory door ‘ls’ of ‘ls linux*’ ziet u dat de extensie is veranderd. Het is vanaf nu gedecomprimeerd (linux-2.4.18.tar). We willen nu het .tar-bestand uitpakken in de /usr/src/linuxtemp dir (we zijn nl nog in de /tmp). Cd naar /usr/src/linuxtemp en typ:

tar xvf /tmp/linux-2.4.18.tar

Tip: in het algemeen bestaan in de command line veel manuals over de commando’s, zo krijg je met ‘man tar’ een handleiding over het tar-commando.

Als alles goed is gegaan geeft een ‘ls’ een linux-dir weer. U heeft ook in /usr/src een linux-dir staan (dit is de huidige kernel). We willen uiteraard niet dat deze twee kernels door elkaar gehaald worden dus geven we linux een nieuwe naam, bv linux-2.4.18, dus:

mv linux linux-2.4.18

Bekijk in de /usr/src dir of er niet toevallig iets van 2.4.18 inzit. Als dat zo is, noem die liunux-2.4.18 anders. Nu willen we de kernel-bron naar de /usr/src dir verplaatsen. Dit is een makkie, typ in de /usr/src/linuxtemp dir:

mv linux-2.4.18 ..

De twee puntjes vertellen Linux om het hele zooitje een dir hoger te verplaatsen. Uiteraard had men i.p.v. ‘..’ ook /usr/src kunnen typen.
Uiteindelijk moeten we linux ‘linken’ met linux-2.4.18. We doen dit met een zogenaamde symlink. De reden hiervoor is dat we dan makkelijk kunnen switchen tussen de verschillende kernels door de symlink weer te herlinken met de oude linux-kernel. Dit scheelt een hoop verplaats-werk. Er zou een bestaande symlink met de naam linux reeds kunnen bestaan, daarom hernoemen we hem maar. Cd naar /usr/src en typ:

mv linux linux.old

De symlink wordt gemaakt door het volgende in te typen:

ln –sf /usr/src/linux-2.4.18 /usr/src/linux

Je kunt de link zien als een verkeersbord die naar de linux-2.4.18 dir verwijst.

Gereedschap controleren
Voordat we de kernel kunnen opbouwen ofwel ‘builden’ moeten we ons afvragen of het juiste gereedschap wel binnen Linux is geinstalleerd. Een redhat gebaseerde distro zoals YellowDog of Mandrake heeft het ‘rpm’-commando. Dit wordt gebruikt om reeds gecompileerde pakketten te installeren. Het kan ook gebruikt worden om te zien wat reeds geinstalleerd is op ons systeem. Typ:

rpm –qa | more

We zien nu een lijst met geinstalleerde pakketten. De | vertelt linux om de ‘output’ van rpm –qa door te geven aan het more-commando (het pipe-principe). Dit zorgt ervoor dat je de info scherm voor scherm te zien krijgt in plaats van een hele lange lijst die van het scherm afrolt. We willen weten of ‘gcc’ en ‘make’ zijn geinstalleerd. In principe als tijdens de installatie van de distro is gekozen voor een development-pakket moeten deze commando’s aanwezig zijn. Dit doen we sneller door:

rpm –qa | grep gcc

Het grep-commando kijkt of gcc zich bevindt in rpm –qa en laat alleen die regels zien. Heel handig dus !
We moeten ook even een kijkje nemen in de Changes file die zich in de documentatie van de distro bevindt:

cd /usr/src/linux/documentation (bij 'less Changes')

Zorg ervoor dat alle vereiste software geinstalleerd is en dat de versies hoger zijn dan de vereiste. In principe voldoet elke recente distro aan de eisen.
Het laatste wat we moeten doen voordat we de kernel gaan bouwen, is nagaan of de kernel headers gesymlinkt zijn (zeker in het geval van redhat distro’s). Dus:

cd /usr/include

De twee dirs waarin we geinteresseerd zijn, zijn linux en asm. Deze moeten zijn gelinkt naar /usr/src/linux/include/linux en /usr/src/linux/include/linux. Echter, het zijn waarschijnlijk slechts dirs. Om dit te controleren typt u:

ls –la | grep linux
ls –la | grep asm


Als we iets van linux -> /usr/src/linux/include/linux zien, dan is alles in orde. Als we alleen linux en niks anders zien, dan moeten we een symlink maken. Hetzelfde geldt voor asm. Om dit te doen typt u:

ln –sf /usr/src/linux/include/linux /usr/include/linux (voor de linux headers)
ln –sf /usr/src/linux/include/asm-ppc /usr/include/asm
cd /usr/src/linux

Nu zijn we klaar om te bouwen ! Ga door naar Het bouwen van een kernel.