Bouwen van een Aangepaste Kernel

Als je Linux op een systeem draait, of mogelijkheden wenst te gebruiken, die niet in de stock kernels worden ondersteund, of misschien dat je het geheugen dat de kernel in beslag neemt wilt verminderen om beter gebruik te maken van het systeemgeheugen, vind je het wellicht nodig je eigen aangepaste kernel te bouwen.

Het upgraden van de kernel bestaat uit het configureren van de gewenste modules, het compileren van de kernel en modules en als laatste het installeren van de kernel-image. Dit wordt gevolgd door een systeemboot (met de vingers gekruist!) om de nieuwe kernel te laden. Dit is allemaal gedocumenteerd in het ``README'' bestand dat met ieder kernel-package wordt meegeleverd. Verdere informatie is te vinden in de ``Documentation/'' subdirectory. Een in het bijzonder behulpzaam bestand is ``Configure.help'' waarin gedetailleerde informatie staat over de beschikbare kernel compileer-opties en modules.

Het volgende is een voorbeeldsessie waarbij wordt gedemonstreerd hoe je een aangepaste kernel, versie 2.0.36 voor het Intel-platform kunt bouwen. Ondanks dat het bouwen van een aangepaste kernel gewoonlijk een kwestie is van het configureren, compileren & installeren, is het soms (meestal in het geval van nieuwe hardware) nodig aanvullende driversoftware te downloaden mocht je hardware nog niet worden ondersteund door de kernelversie die je gaat compileren.

De eerste stap in het bouwen van een aangepaste kernel bestaat uit het downloaden en installeren van de kernel-sources óf vanuit een RPM- (heeft de voorkeur), óf vanuit een tar-archief. Zie de the section called Linux Kernel Upgrades voor details over het verkrijgen van de juiste bestanden.

Gebruik vervolgens het ``rpm'' utility (of ``tar'', als dit van toepassing is) om de kernel-source structuur en header bestanden te installeren. Om bijvoorbeeld de 2.0.36-3 kernel RPM-bestanden te installeren:

rpm -Uvh kernel-source-2.0.36-3.i386.rpm kernel-headers-2.0.36-3.i386.rpm
rpm -Uvh kernel-ibcs-2.0.36-3.i386.rpm

(Als je Linux op een notebook draait, zou je waarschijnlijk ook het bestand ``kernel-pcmcia-cs-2.0.36-3.i386.rpm'' willen downloaden, waarmee in mogelijkheden voor power management wordt voorzien).

Na het installeren van de kernel-bestanden, zou je de nieuwe source tree in de ``/usr/src/linux/'' directory moeten kunnen vinden.

De volgende stap bestaat uit het downloaden van de aanvullende driverbestanden (als dit van toepassing is) en het installeren daarvan in de nieuwe kernel source-tree. Om bijvoorbeeld ondersteuning voor de Mylex DAC960 hardware RAID-controller toe te voegen, zou ik de driversoftware downloaden van de website http://www.dandelion.com/. Helaas wordt dergelijke driversoftware vaak alleen als een tar-archief aangeboden en moet het worden geïnstalleerd door gebruik te maken van het ``tar'' utility. Bijvoorbeeld:

cd /usr/src/
tar zxvpf DAC960-2.0.0-Beta4.tar.gz

Als dit van toepassing is, zou je de documentatie moeten lezen die met je aanvullende driversoftware wordt meegeleverd. Bij de DAC960-driver wordt bijvoorbeeld een bestand ``README'' meegeleverd waarin instructies worden gegeven over waar de nieuwe gedownloade bestanden zouden moeten zijn gelokaliseerd en hoe de kernel-patch kan worden toegepast:

mv README.DAC960 DAC960.[ch] /usr/src/linux/drivers/block
patch -p0 < DAC960.patch

De volgende stap is om er zeker van te zijn dat de links naar symbolische bestanden op je systeem consistent zijn met de nieuwe kernel-structuur. Eigenlijk hoeft deze stap slechts éénmaal te worden gedaan, dus het volgende hoeft alleen te worden gedaan als je nog niet eerder een aangepaste kernel hebt gecompileerd:

mail:/usr/src# cd /usr/include
mail:/usr/include# rm -rf asm linux scsi
mail:/usr/include# ln -s /usr/src/linux/include/asm-i386 asm
mail:/usr/include# ln -s /usr/src/linux/include/linux linux
mail:/usr/include# ln -s /usr/src/linux/include/scsi scsi

Note

Noot: De stap hierboven is voor 2.2.x of hogere kernelversies niet langer nodig.

De volgende stap bestaat uit het configureren van je kernel-instellingen. Dit is de belangrijkste stap bij het bouwen van de aangepaste kernel. Als je de verkeerde instellingen deactiveert, zal er geen ondersteuning zijn voor kenmerken of hardware die je nodig hebt. Als je echter de verkeerde instellingen activeert zal de kernel onnodig groot worden en zal waardevol systeemgeheugen worden verspild (met dat te hebben gezegd, is het waarschijnlijk beter een fout te maken bij het laatstgenoemde dan het eerstgenoemde).

De beste manier om er zeker van te zijn dat je de kernel juist compileert is door bekend te zijn met de mogelijkheden die je zal moeten gebruiken, en welke hardware er in je systeem zit waar je ondersteuning voor nodig zal hebben. Nadat je een paar keer ervaring hebt opgedaan in het aanpassen van je kernel, zal het proces “vanzelfsprekend” worden en niet meer zo intimiderend lijken!

Typ het volgende om het configuratieproces te beginnen:

mail:/usr/include# cd /usr/src/linux
mail:/usr/src/linux# make mrproper
mail:/usr/src/linux# make menuconfig

(Als je het X Window Systeem draaiend hebt, zou je ``make xconfig'' in kunnen tikken in plaats van ``make menuconfig''; zie Chapter 5 voor details over hoe je X werkend krijgt).

Neem voor het configureren van de kernel de diverse instellingen door en selecteer (activeer) die instellingen die je nodig hebt, en deselecteer (deactiveer) die instellingen die niet vereist zijn. Je kunt een keuze maken uit ondersteuning die in de kernel is ingebouwd of dat het als een module wordt gebouwd die wanneer nodig door de kernel kan worden geladen en uit het geheugen kan worden verwijderd wanneer het niet meer nodig is. (Als je een kenmerk, zoals een SCSI-driver, als een module compileert die echt nodig is om je systeem te booten zal je een RAMdisk-image aan moeten maken anders zal je systeem niet kunnen booten. Dit wordt gedaan met het commando ``mkinitrd''; deze procedure wordt even verderop beschreven).

Bij het doornemen van de configuratie-instellingen, kun je <Help> selecteren voor een beschrijving waarvoor een gegeven kernel-optie is.

Typ voor het compileren van je kernel de volgende commando's nadat je de kernel-instellingen hebt geconfigureerd:

mail:/usr/src/linux# make dep ; make clean
mail:/usr/src/linux# make bzImage
mail:/usr/src/linux# make modules

Als je dezelfde kernel als voorheen opnieuw aan het compileren bent (in dit voorbeeld 2.0.36-3), zal je wellicht de bestaande modules naar een backupdirectory willen verplaatsen zoals met het volgende commando:

mail:/usr/src/linux# mv /lib/modules/2.0.36-3 /lib/modules/2.0.36-3-backup

Typ nu het volgende commando om de nieuwe modules daadwerkelijk te installeren:

mail:/usr/src/linux# make modules_install

De volgende stap bestaat uit het kopiëren van de kernel naar de ``/boot/'' directory en met LILO het bootrecord bij te werken zodat de nieuwe kernel wordt herkend. De volgende commando's zullen een backupkopie van je bestaande kernel maken, de nieuwe kernel kopiëren en vervolgens het LILO-bootrecord verversen:

mail:/usr/src/linux# cd /boot
mail:/boot# cp vmlinuz vmlinuz.OLD
mail:/boot# cp /usr/src/linux/arch/i386/boot/bzImage vmlinuz-2.0.36
mail:/boot# /sbin/lilo

Tenslotte zal je het bestand ``/etc/lilo.conf'' moeten wijzigen, en er voor moeten zorgen dat de “image” verwijzing naar de nieuwe kernel verwijst. Je zou ook een sectie toe kunnen voegen die naar de backup van je kernel, wellicht genaamd “OudeLinux” zal verwijzen. Hier is een voorbeeldbestand:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz
	label=Linux
	root=/dev/hdb1
	read-only
image=/boot/vmlinuz.OLD
	label=OudeLinux
        read-only

Door op deze wijze de informatie over je backupkernel toe te voegen, kun je gewoon ``OudeLinux'' intikken om van de oude kernel te booten, mocht het je niet lukken op juiste wijze van de nieuwe kernel te booten, om vervolgens het probleem te kunnen onderzoeken (misschien dat een device niet werd herkend, of een daemon niet startte zoals het dat zou moeten doen).

Note

Noot: Zoals eerder vermeld, zal je een initiële RAM disk-image aan moeten maken om je systeem te booten, als je een feature hebt gecompileerd die vereist je systeem als een module te booten (Vergeet je kernel niet met ondersteuning voor een dergelijke initiële boot-image te compileren).

De procedure voor het aanmaken en gebruiken van een initiële RAM-diskimage is als volgt:

Sluit nu je systeem af en boot de nieuwe kernel!

mail:/boot# /sbin/shutdown -r now

Raak niet in paniek, als je kernel in alle opzichten weigert te booten. Boot van de bootdisk die tijdens de installatie van Linux werd aangemaakt. Als je geen kopieën van deze disks hebt, zou je er één van de Red Hat CD af moeten kunnen maken. Doe de bootdiskette in de drive en reboot de computer. Bij het zien van de “boot:”-prompt, typ je:

mount root=/dev/hda1

Bij dit commando wordt verondersteld dat je “/” (root) partitie op /dev/hda1 is gelokaliseerd.

Linux zou normaal moeten booten (alhoewel niet alle services of devices juist opereren voor deze sessie, aangezien je de kernel vanaf de bootdisk gebruikt), en dan kun je de oude kernel terugzetten en de LILO bootloader informatie herinstalleren (dwz. ``mv /vmlinuz.old /vmlinuz ; /sbin/lilo'') en het systeem afsluiten/herstarten. Vervolgens kun je proberen de kernel opnieuw, ditmaal met andere opties, te compileren en het nogmaals te proberen.