In dit hoofdstuk wordt het compileren van de kernel behandeld, en het ingebruik nemen van de nieuwe kernel door middel van de bootmanager.
De kernel, het hart van het Linux besturingssysteem wordt al ettelijke jaren door vrijwilligers ontwikkeld. Dit is mogelijk omdat de sourcecode openbaar is gemaakt. Vanaf deze sourcecode, die de programmacode van de kernel bevat kan een nieuwe kernel worden aangepast en opgebouwd met behulp van een compiler, een vertaalprogramma die programmacode in de taal C en assembler omzet in machinecode, die door de processor direct wordt uitgevoerd.
Er zijn een groot aantal functies in de kernel. Met behulp van een configuratieprogramma kan iemand de kernel helemaal aan zijn eigen wensen aanpassen, door een of meer functies of juist weg te laten uit het compileerproces.
Tot slot wordt de nieuwe gebouwde kernel toegevoegd in het bootmenu en getest door de computer met deze nieuwe kernel te starten.
De huidige gebruikte kernelversie is waarschijnlijk 2.4.22. Dit is de kernel van de Mandrake Linux 9.2 distributie . Met het commando uname kun je deze informatie zichtbaar maken. Meer informatie nog geeft uname -a .
[cursist@localhost linux]$ uname -a
Linux localhost 2.4.22-10mdk #1 Thu Sep 18 12:30:58 CEST 2003 i686 unknown unknown GNU/Linux
[cursist@localhost linux]$
Om de kernel te kunnen compileren is een compiler nodig. Een compiler vertaalt programmacode in leesbare tekst om in voor de processor begrijpelijke machineinstructies. Hiervoor wordt de GNU C Compiler (gcc) gebruikt. Om dat te doen is het voldoende om met het programma Software Installeren het pakket gcc te selecteren en installeren. De versie van de compiler is niet kritisch maar men raadt een aantal specifieke versies van gcc aan. Versie 2.96 is een versie die gedurende lange tijd geadviseerd werd voor kernelcompilaties, maar de op Mandrake aanwezige versie 3.3.1 werkt ook.
Daarnaast zijn nog enkele tools nodig : GNU Make, module-init-tools, binutils. Deze tools zijn al geinstalleerd of worden samen met gcc geinstalleerd.
De sourcecode van de kernel is als tarball te downloaden van de website www.kernel.org . Je kunt de nieuwste kernelsource (op dit moment 2.6.11) downloaden van de FTP-site in deze directory . (of download hem van de cursusserver ) Je ziet hier verschillende soorten bestanden. De kernel sourcecode is in twee soorten bestanden te vinden : .tar.gz en .tar.bz2 bestanden. De laatste soort zijn aanzienlijke kleiner dan de .tar.gz bestanden en zijn sneller te downloaden. Deze zijn ingepakt met bzip2 compressie en vereisen de -j switch van tar om uit te pakken.
Op moment van schrijven is de kernel 2.6.11 de meest recente. De kernelsource is te vinden in het bestand linux-2.6.1.tar.bz2 . Deze download ik dus.
De kernelsource is nu aanwezig in het gecomprimeerde bestand linux.2.6.11.tar.bz2. Dit noemen we een tarball. Om het uit te pakken in een terminalvenster, kan het met het tar commando worden gedecomprimeerd in een map:
$ tar jxvf linux-2.6.11.tar.bz2
Het uitpakken kan enige tijd duren. Er zitten namelijk veel bestanden in , wel ongeveer 18.000 bestanden.
Na het uitpakken zijn de bestanden te vinden in de map linux-2.6.11 die het tar programma heeft aangemaakt. De map die is aangemaakt is precies hetzelfde als de naam van de tarball bestand, maar zonder de naamaanhangsels .tar.bz2 . Verander de aktieve directory naar deze map om verder te gaan. Gebruik
$ cd linux.2.6.11
Er zijn een groot aantal functies in de kernel. Met behulp van een configuratieprogramma kan de kernel helemaal aan eigen wensen worden aangepast, door een of meer functies of juist weg te laten uit het compileerproces.
Deze functies bestaan voor een belangrijk deel uit driverprogrammas voor allerlei soorten hardware. Voor elke specifiek hardware moet een driver in de kernel aanwezig zijn, anders kan de hardware niet worden gebruikt. Sommige van deze drivers worden als module geladen, d.w.z. dat deze niet in de kernel wordt ingebouwd, maar in een los bestand. Alle overige functies komen allemaal in het kernelbestand.
Er zijn een aantal commando voor het configureren van de kernel beschikbaar:
Het is aan te raden om eerst make oldconfig te starten, en op alle vragen een antwoord te verschaffen. Deze vragen behandelen alle vragen waarop in de laatste configuratie geen antwoord was gegeven. Het gaat hier met name om keuzen die nieuw zijn in de nieuwe kernelsource maar nog niet bestonden in de huidige kernel. Het is voldoende om de Enter-toets ingedrukt te houden, omdat alle verstekantwoorden goed zijn.
Daarna kun je de kernel aanpassen door binnen het X windowing system make xconfig uit te voeren. Werp eens een blik op alle beschikbare keuzen. Er zijn onnoemelijk veel keuzen en mogelijkheden in de linux kernel die allemaal afzonderlijk aan of uit kunnen worden gezet. Sommige van de onderdelen zijn noodzakelijk om een normale linuxkernel te kunnen starten op een normale PC, andere weer niet. Er zijn hier modules die ondersteuning bieden voor filesystemen (FAT, NTFS, enz), opties voor andersoortige typen processors (68k, ARM, PPC, enz), vele drivers voor hardware uiteenlopende van netwerkkaarten, video, audio, harddisken tot I2C, packetradio en scanners, bijzondere functies in de kernel zoals devfs, procfs, geheugenbeheer en nog veel meer. Het valt buiten het bestek van deze cursus om alle onderdelen te behandelen. Laat voor nu de onderdelenselectie maar zoals ze zijn. Je krijgt hiermee een bruikbare kernel.
Het is mogelijk om zelf wijzigingen te maken in de sourcecode van de kernel. Het aantal sourcecode-regels is onnoemelijk. Een ding is wel leuk om te wijzigen en dat is de kernelversie. Dit is niet een nuttige aanpassing maar dient vooral als demonstratie dat de wijzigingen in de kernel zichtbaar zijn.
De wijziging die ik voorstel is het aanpassen van een zogenaamde define in een sourcebestand include/linux/version.h . Dit bestand is pas beschikbaar na de stap make dep in het volgende hoofdstuk ! . Deze define is een definitie van de kernelversie, zoals het uname commando zichtbaar maakt. Deze aanpassing wordt als volgt gedaan.
Verander de actieve directory naar de directory waar de sourcecode is uitgepakt (bijvoorbeeld linux-2.6.11 ) . Geef het volgende commando om het bestand in Kedit te bewerken .
$ kedit include/linux/version.h &
Je ziet de inhoud van version.h :
#define UTS_RELEASE "2.6.11"
#define LINUX_VERSION_CODE 132619
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
Verander nu de eerste regel zodat deze luidt:
#define UTS_RELEASE "2.6.11-paul"
Je kunt ook je eigen naam gebruiken. Sla het bestand op en compileer de kernel zodat verderop wordt beschreven. Zodra de computer is gestart met de nieuwe kernel, kun je met uname de versie zien.
Tijdens de compileren wordt een speciaal programma gestart die de programmacode (sourcecode) van de kernel omzet in machineinstructie die door de processor van de computer direct kunnen worden uitgevoerd.
Bijna alle onderdelen die zijn aangevinkt in de configuratiestap worden bij het compileren in de kernel opgenomen, met als resultaat dat al deze onderdelen in een bestand terechtkomen. De uitzondering zijn de modules, welke stukjes kernel zijn die in afzonderlijke bestanden worden opgeslagen en alleen worden geladen wanneer ze nodig zijn. Dankzij modules wordt de kernel niet monsterlijk groot. De modules zijn over het algemeen driverprogrammas, waarvan het meerendeel niet geladen hoeft te worden. Ze zijn opgeslagen in de map /lib/modules in een map die hetzelfde heet als de kernel.
Het daadwerkelijk compileren bestaat ook uit een aantal verschillende stappen.
$ make dep
Met make dep worden onder meer include files aangemaakt die nodig zijn. Er scrollen heel veel teksten voorbij . Na deze stap is het bestand include/linux/version.h beschikbaar en kan aangepast worden. Zie de vorige paragraaf.
$ make clean
Met make clean worden enkele nutteloos geworden bestanden opgeruimd. Deze stap is noodzakelijk.
$ make bzImage
Met make bzImage wordt het daarwerkelijke compileren gestart. Het compileren is zwaar werk voor de computer en deze stap kan lang duren afhankelijk van de grootte van de kernel en vooral de snelheid van de computer. Een gemiddelde compilatie duurt tussen 25 minuten tot meer dan 3 uur. Het commando make bzImage maakt een gecomprimeerde linuxkernel aan, die naderhand in de folder arch/i386/boot kan worden gevonden.
$ make modules
Als tweede belangrijke stap worden de modules gecompileerd. Dit is een afzonderlijke proces, die ook enige tijd duurt Ook kunnen de laatste twee commandos een voor een achter elkaar uitgevoerd worden, door ze achter elkaar te tikken met een puntkomma ertussen .
$ make bzImage ; make modules
Dat mag ook.
$ su
# make modules_install
Met deze stap worden de modules geinstalleerd in de systeemmap. De kernelmodules zijn afzonderlijke bestanden die zijn opgeslagen in /lib/modules/<kernelversie> . Alleen root mag dingen installeren in een systeemmap , dus daarom is het nodig om eerst aan te melden als root gebruiker .
Om de kernel te gebruiken, moet de kernel naar de /boot map worden
gekopieerd. Het is dringend aan te raden om niet de nieuwe kernel over
de bestaande kernel te kopieren, want als de nieuwe kernel niet goed
is, krijg je zo een onbruikbaar systeem. Het is beter om de kernel te
kopieren in een nieuw bestand met een andere naam. In noodgevallen kun
je de originele kernel toch nog starten. Geef de kernel een duidelijke
naam zoals vmlinuz-2.6.11 , zodat je weet welke versie hij had.
$ cp arch/i386/boot/vmlinuz /boot/vmlinuz-2.6.11
Pas daarna het bootmenu aan. Laadt /boot/grub/menu.lst in een editor (als root gebruiker uiteraard) en pas de tekst zo aan dat er een extra startkeuze wordt toegevoegd die als volgt luidt.
title mijnkernel
kernel (hd0,4)/boot/vmlinuz-2.6.11 root=/dev/hda5 devfs=mount acpi=ht resume=/dev/hda6 splash=silent vga=788
initrd (hd0,4)/boot/initrd.img
Bewaar het gewijzigde bestand op. Er is nu een extra keuze in het bootmenu genaamd mijnkernel waarmee de computer de zojuist gebouwde kernel start.
Start de computer opnieuw en kies in de bootmanager mijnkernel . Let goed op de foutmeldingen die de computer eventueel tijdens het starten aangeeft. Wanneer het starten niet goed gaat, start de computer opnieuw met de gewone kernel (keuze linux) . Als alles goed gaat wordt de nieuwe kernel gestart. Controleer nu de versie van deze kernel met
$ uname -a