Verder Terug Inhoud

2. Snelle stappen - Kernelcompilatie

Deze sectie is geschreven door Al Dev (alavoor@yahoo.com)

De laatste versie van deze sectie is te vinden op http://www.aldev.8m.com en klik op "Quick Steps to recompile linux kernel". Mirror sites zijn te vinden op - http://aldev.webjump.com, angelfire, geocities, virtualave, 50megs, theglobe, NBCi, Terrashare, Fortunecity, Freewebsites, Tripod, Spree, Escalix, Httpcity, Freeservers.

Deze sites bieden heel veel linux fraais en tips.

Een kopie van de bovenstaande website is hier gereproduceerd -

Het opnieuw compileren van de kernel is nodig om de kernel zo klein mogelijk te maken, wat zal resulteren in een SNELLER besturingssysteem. Het moet ook gebeuren als je ondersteuning wilt voor enige nieuwe devices. Noot: Hieronder duidt 'bash#' op de bash-prompt, je typt de opdrachten die na de 'bash#' prompt staan. De hieronderstaande opdrachten zijn onder RedHat Linux getest, maar ze zouden tevens met minimale wijzigingen onder andere distributies moeten werken.

  1. Noot: Er kunnen meerdere kernelimages op je systeem voorkomen. Door de hieronder staande stappen op te volgen, overschrijf je of beschadig je geen bestaande kernel. Deze stappen zijn zeer veilig en je huidige kernel blijft intact en zal niet worden aangeroerd.
  2. Log bij al deze stappen in als 'root'. Mount de Redhat linux cdrom en installeer de linux kernelsource rpm
    bash$ su - root
    bash# cd /mnt/cdrom/RedHat/RPMS 
    bash# rpm -i    kernel-headers*.rpm 
    bash# rpm -i    kernel-source*.rpm 
    bash# rpm -i dev86*.rpm   
    bash# rpm -i bin86*.rpm   
    

    (De bin86*.rpm en 'as86' is alleen nodig voor OUDERE Linux systemen zoals redhat 5.x. Neem de Intel assembler 'as86' opdracht uit dev86*.rpm op de cdrom of vanaf http://rpmfind.net/linux/RPM/mandrake/7.1/Mandrake/RPMS/bin86-0.4-12mdk.i586.html , http://rpmfind.net/linux/RPM/kondara/jirai/i586/bin86-0.4-8k.i586.html ).
  3. Start X-window op met 'startx'.
    bash# man startx
    bash# startx
    bash# cd /usr/src/linux 
    bash# make xconfig 
    

    De "make xconfig" komt met een gebruikersvriendelijke GUI interface! Maak GEEN gebruik van 'make config' want dit is een opdrachtregel optie (gebruik dit ALLEEN als je X-window niet kunt uitvoeren). Een beter alternatief op de opdracht 'make config' is 'make menuconfig' waarmee je een gebruikersvriendelijke op tekst gebaseerde ncurses interface krijgt. Een aantal mensen geven de voorkeur aan 'make menuconfig' boven 'make xconfig'. Mijn persoonlijke voorkeur - wanneer ik X-window niet uit kan voeren, gebruik ik 'make menuconfig'. Je kunt het configuratiebestand laden van /usr/src/linux/.config (punt config file. Let op de punt voor config).
  4. Binnen 'make xconfig' moet je het volgende doen om problemen te voorkomen -
  5. Save en Exit "make xconfig". Alle opties die je hebt geselecteerd zullen nu worden opgeslagen in het configuratiebestand /usr/src/linux/.config (punt config file). En voer nu uit:
    bash# make dep
    bash# make clean
    

  6. Lees het volgende bestand (om kennis op te doen over het bouwen van een kernel. Tip: gebruik de kleureneditor gvim voor een betere leesbaarheid.
    bash# gvim -R   /usr/src/linux/arch/i386/config.in 
    bash# man less 
    bash# less   /usr/src/linux/arch/i386/config.in 
    Typ 'h' voor hulp en druk voor het navigeren op i, j, k, l, h of 
    de pijltjestoets, page up/down toetsen.
    

  7. Geef nu de opdracht make:
            bash# cd /usr/src/linux
            bash# man nohup
            bash# nohup make bzImage &  
            bash# tail -f nohup.out     (.... to monitor the progress) 
    Hiermee zal de kernel worden neergezet in 
    /usr/src/linux/arch/i386/boot/bzImage 
            bash# man tail 
    

  8. Na een succesvolle bzImage, kopieer je de kernelimage naar de /boot directory. Je moet de nieuwe kernelimage naar de /boot directory kopiëren, anders zal de nieuwe kernel NIET booten. En lees dan de manual page over lilo (zie ook http://www.linuxdoc.org/HOWTO/LILO-crash-rescue-HOWTO.html) en zie het voorbeeldbestand lilo.conf. Geef altijd een datumextensie aan de bestandsnaam, omdat het je vertelt wanneer je de kernel bouwde. Dit wordt hieronder aangegeven:
    bash# cp /usr/src/linux/arch/i386/boot/bzImage     /boot/bzImage.myker.26mar2001
    bash# man lilo
    bash# man lilo.conf
    Wijzig het bestand /etc/lilo.conf en plaats daar de volgende regels in:
            image=/boot/bzImage.myker.26mar2001 
            label=myker
            root=/dev/hda1 
            read-only 
    Je kunt de devicenaam voro 'root=' controleren met de opdracht:
            bash# df   / 
     
    

  9. Start nu
     bash# lilo 
     bash# lilo -q 
     
    

    Je moet lilo iedere keer dat je een nieuwe bzImage aanmaakt, opnieuw opstarten, zelfs als zou het record 'myker' reeds bestaan.
  10. Start de machine opnieuw op en achter lilo druk je de tab toets in en typt 'myker'. Als het boot dan heb je goed werk verricht! Selecteer anders achter de lilo je oude kernel, boot en begin helemaal opnieuw. Je oude kernel is nog steeds INTACT en VEILIG gesteld in stel /boot/vmlinuz-2.0.34-0.6
  11. Laadbare modules: Zoek naar de insmod opdracht die zeer frequent wordt gebruikt voor het laden van de modules.
     bash# man insmod
     bash# insmod 
     bash# rpm -i /mnt/cdrom/Redhat/RPMS/modutils*.rpm
     
    

    De stap hieronder is wellicht niet nodig, maar slechts nodig voor NOODGEVALLEN wanneer je /lib/modules bestanden zijn beschadigd. Wanneer je reeds een /lib/modules directory hebt en in het geval je de bestanden wilt vervangen, gebruik dan de --force om het package te vervangen en selecteer de van toepassing zijnde cpu architectuur. Voor nieuwe versies van linux redhat linux 6.0 en latere versies zijn de kernelmodules opgenomen in kernel-2.2*.rpm. Installeer de laadbare modules en de kernel met
    Hiermee krijg je een reeds geïnstalleerd package te zien.
     bash# rpm -qa | grep -i kernel
            
     bash# rpm -U --force  /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i686.rpm
     (or)
     bash# rpm -U --force  /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i586.rpm
     (or)
     bash# rpm -U --force  /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i386.rpm
     
    

    Dit geldt alleen voor oude versies van redhat linux 5.2 en eerdere versies. Boot de nieuwe kernel en installeer de laadbare modules vanaf de RedHat Linux "contrib" cdrom
    bash# rpm -i /mnt/cdrom/contrib/kernel-modules*.rpm 
    ....(Voor oude linux systemen waarop insmod niet is voorgeïnstalleerd)
     
    

  12. Deze stap is ALLEEN nodig als je een nieuwe versie van de kernelsource hebt gedownload. Laadbare modules zijn te vinden in /lib/modules.
    bash# cd /usr/src/linux
    bash# make modules
    bash# make modules_install
    

  13. Als je nieuwe kernel 'myker' boot en correct functioneert, dan kun je de bootdisk aanmaken. Doe een lege diskette in het diskettestation en:
    bash# cd /usr/src/linux
    bash# make bzdisk
    Zie tevens mkbootdisk -
    bash# rpm -i mkbootdisk*.rpm
    bash# man mkbootdisk
    

2.1 Oplossen van veelvoorkomende fouten

De volgende fouten worden zeer frequent door nieuwe gebruikers gemaakt:

Als je nieuwe kernel niet boot en je krijgt:


 Warning: unable to open an initial console
 Kernel panic: no init found. Try passing init= option to kernel

Het probleem is hier dat je de "root=" parameter NIET juist opgaf in /etc/lilo.conf. In mijn geval maakte ik gebruik van root=/dev/hda1 met daarop de root partitie "/". Je moet naar het juiste rootdevice verwijzen in lilo.conf. Dit kan bv iets als /dev/hdb2 of /dev/hda7 zijn.

De kernel zoekt naar de init opdracht welke is te vinden in /sbin/init. En de directory /sbin komt voor op de rootpartitie. Zie voor details:


 bash# man init
 

2.2 Voorbeeld lilo.conf

Hieronder wordt een voorbeeldbestand van /etc/lilo.conf gegeven. Volg de naamconventies zoals ker2217 (voor kernel 2.2.17), ker2214 (voor kernel 2.2.14). Er kunnen meerdere kernelimages op hetzelfde /boot systeem voorkomen. Op mijn machine heb ik iets als:


 boot=/dev/hda
 map=/boot/map
 install=/boot/boot.b
 prompt
 timeout=50
 default=firewall
 
 image=/boot/vmlinuz-2.2.14-5.0
        label=ker2214
        read-only
        root=/dev/hda9
 
 image=/boot/vmlinuz-2.2.17-14
        label=ker2217
        read-only
        root=/dev/hda9
 
 #image=/usr/src/linux/arch/i386/boot/bzImage 
 #      label=myker 
 #      root=/dev/hda7
 #      read-only 
 
 image=/boot/bzImage.myker.11feb2001
        label=myker11feb 
        root=/dev/hda9
        read-only 
 
 image=/boot/bzImage.myker.01jan2001
        label=myker01jan 
        root=/dev/hda9
        read-only 
 
 image=/boot/bzImage.myker-firewall.16mar2001
        label=firewall 
        root=/dev/hda9
        read-only 
 


Verder Terug Inhoud