Kernel

Uit Linuxdocs.nl
Ga naar: navigatie, zoeken

Een eigen kernel maken:


Door: Michaell Bakker
Versie: 24-03-2010 / How2 volledig herschreven.
Website: http://www.linuxdocs.nl
Moeilijkheidsgraad: 5/5

Inleiding:

Nadat je Linux hebt geinstalleerd, beschik je over een kernel die door de fabrikant is samengesteld. Hier komen tevens wat kleine aanpassingen bij die door het setup programma meegeinstalleerd zijn, zoals drivers.
Hoewel de standaard kernel in veel gevallen voldoende is voor de gemiddelde gebruiker, zullen de tweakers en gamers onder ons maar wat graag een eigen kernel willen maken.

Dit is, omdat een standaard kernel van de fabrikant gebouwd is om op veel hardware te kunnen draaien. Een voordeel hiervan is, dan deze kernel meestal out-of-the-box werkt op jouw pc.
Een nadeel wat hieraan hangt is dat veel drivers voor hardware die nu worden meegeladen niet eens op jouw pc aanwezig zijn. Dit is een verspilling van geheugen en hardeschijf ruimte.
Hier word ook nog eens aan toegevoegd, dat de kernel groter is dan nodig. Dit zorgt ervoor dat de prestaties van jouw systeem minder worden.

Wat is een kernel?

Een kernel is om het maar even simpel te zeggen de tussenliggende laag tussen het besturingssysteem (Linux) en de onderliggende hardware.
De kernel is de code die ervoor zorgt, dat de computer kan communiceren met de onderliggende hardware, zoals o.a. je geluids en videokaart, maar ook je hardeschijven en cd-rom speler.

De kernel is tevens de plaats waar alle drivers worden geladen. Dankzij een driver weet de kernel b.v. wat voor geluidskaart je hebt. Als de kernel weet wat voor geluidskaart je hebt, kunnen programma's, zoals een spel geluid produceren.
Als de kernel deze driver niet had geladen, kan je spel geen geluid produceren of welk ander programma dan ook.

Maar de kernel doet nog veel meer dan dat. Het zorgt er ook voor dat gebruikers toegang hebben tot o.a. het geheugen.

Ik zal niet alle details proberen uit te leggen, want die weet ik ook niet allemaal.
Voor wie wel alles wil weten, raad ik aan even een bezoekje te plegen aan: www.Wikipedia.com, www.howstuffworks.com en natuurlijk: www.google.com.

Waarom een eigen kernel maken?

Zoals ik al in de inleiding heb verteld, is de standaard kernel vrij log. Het werkt, maar niet optimaal.
Tevens is een eigengebakken kernel handig, omdat je ook gelijk de broncodes bij de hand hebt. De broncode is belangrijk bij het installeren van drivers die je van je hardware fabrikant krijgt en niet in de kernel zitten.
Tevens kan het gebeuren dat de standaard kernel b.v. geen support geeft voor een apparaat die je wel hebt.

Dus wat voordelen op een rijtje:

  1. Sneller: Een custom kernel kun je zo klein maken als je zelf wilt.
  2. Flexibeler: Jij bepaalt wat je wel en niet wilt hebben.
  3. Broncode is aanwezig: Hoewel je dit ook achteraf kunt installeren van de kernel die bij jouw Linux zat.
  4. Volledige hardware support: Kies zelf je drivers uit. i.p.v. ze achteraf te downloaden en te installeren.
  5. CPU optimalisatie: Een standaard kernel gebruikt meestal een oude Pentium driver voor jouw super deluxe Core Quatro of AMD X4 Processor. Geef de processor op die jij hebt voor een snelheidsboost.

Voorbereiding:

Tenzij je al volledig uit je hoofd weet wat voor hardware je hebt en hoe de bijbehorende driver heet, raad ik aan eerst op te vragen welke hardware de huidige kernel heeft gevonden.
De hardware die tevens al werkt, zal voorzien zijn met een module (Dit is je driver naam).

Om al deze informatie weer te geven, geven we de opdracht:

[root@client /]# lspci -v

De output van de auteur op een oude Fujitsu siemens laptop met 256MB RAM en een Pentium III 600Mhz CPU op Debian Linux Lenny ziet er als volgt uit:

00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 03)
        Subsystem: Fujitsu Limited. Device 1039
        Flags: bus master, medium devsel, latency 64
        Memory at f8000000 (32-bit, prefetchable) [size=64M]
        Capabilities: [a0] AGP version 1.0
        Kernel driver in use: agpgart-intel
        Kernel modules: intel-agp

00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 03) (prog-if 00 [Normal decode])
        Flags: bus master, 66MHz, medium devsel, latency 128
        Bus: primary=00, secondary=01, subordinate=01, sec-latency=64
        I/O behind bridge: 00002000-00002fff
        Memory behind bridge: f4000000-f5ffffff
        Prefetchable memory behind bridge: 30000000-300fffff

00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 02)
        Flags: bus master, medium devsel, latency 0

00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01) (prog-if 80 [Master])
        Flags: bus master, medium devsel, latency 64
        [virtual] Memory at 000001f0 (32-bit, non-prefetchable) [disabled] [size=8]
        [virtual] Memory at 000003f0 (type 3, non-prefetchable) [disabled] [size=1]
        [virtual] Memory at 00000170 (32-bit, non-prefetchable) [disabled] [size=8]
        [virtual] Memory at 00000370 (type 3, non-prefetchable) [disabled] [size=1]
        I/O ports at 1420 [size=16]
        Kernel driver in use: PIIX_IDE

00:07.2 USB Controller: Intel Corporation 82371AB/EB/MB PIIX4 USB (rev 01) (prog-if 00 [UHCI])
        Flags: bus master, medium devsel, latency 64, IRQ 9
        I/O ports at 1400 [size=32]
        Kernel driver in use: uhci_hcd
        Kernel modules: uhci-hcd

00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
        Flags: medium devsel, IRQ 9
        Kernel driver in use: piix4_smbus
        Kernel modules: i2c-piix4

00:0d.0 Multimedia audio controller: ESS Technology ES1978 Maestro 2E (rev 10)
        Subsystem: Fujitsu Limited. Device 1053
        Flags: bus master, medium devsel, latency 64, IRQ 9
        I/O ports at 1000 [size=256]
        Capabilities: [c0] Power Management version 2
        Kernel driver in use: ES1968 (ESS Maestro)
        Kernel modules: radio-maestro

00:0f.0 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev 80)
        Subsystem: Fujitsu Limited. Device 109a
        Flags: bus master, medium devsel, latency 168, IRQ 9
        Memory at 30100000 (32-bit, non-prefetchable) [size=4K]
        Bus: primary=00, secondary=02, subordinate=05, sec-latency=176
        Memory window 0: 20000000-23fff000 (prefetchable)
        Memory window 1: 24000000-27fff000
        I/O window 0: 00001800-000018ff
        I/O window 1: 00001c00-00001cff
        16-bit legacy interface ports at 0001
        Kernel driver in use: yenta_cardbus

00:0f.1 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev 80)
        Subsystem: Fujitsu Limited. Device 109a
        Flags: bus master, medium devsel, latency 168, IRQ 9
        Memory at 30101000 (32-bit, non-prefetchable) [size=4K]
        Bus: primary=00, secondary=06, subordinate=09, sec-latency=176
        Memory window 0: 28000000-2bfff000 (prefetchable)
        Memory window 1: 2c000000-2ffff000
        I/O window 0: 00003000-000030ff
        I/O window 1: 00003400-000034ff
        16-bit legacy interface ports at 0001
        Kernel driver in use: yenta_cardbus

01:00.0 VGA compatible controller: ATI Technologies Inc Rage Mobility P/M AGP 2x (rev 64) (prog-if 00 [VGA controller])
        Subsystem: Fujitsu Limited. Device 1074
        Flags: bus master, stepping, medium devsel, latency 66, IRQ 9
        Memory at f5000000 (32-bit, non-prefetchable) [size=16M]
        I/O ports at 2000 [size=256]
        Memory at f4000000 (32-bit, non-prefetchable) [size=4K]
        [virtual] Expansion ROM at 30000000 [disabled] [size=128K]
        Capabilities: [50] AGP version 1.0
        Capabilities: [5c] Power Management version 1
        Kernel modules: atyfb

Het is aan te bevelen om de lijst even naar de printer te sturen. Zo hoef je niet continue tussen de tabs in je console scherm te schakelen tussen de kernel config en je hardware lijst.

Ik schijf hiervoor de output naar een ASCII tekst bestandje en druk deze af met OpenOffice.

[root@client /]# lspci -v >> hardware.txt

Bovenstaande opdracht zal deze lijst naar een tekst bestandje hardware.txt sturen in de huidige map

Je kan dit natuurlijk ook direct afdrukken als je de printer poort uit je hoofd weet met:

[root@client /]# lspci -v >> /dev/lp1 #<-- waar /dev/lp1 je printerpoort is. Hier is dat je tweede paralelle poort

Bij bovenstaande output van lspci geld het volgende:

Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 03) #<-- Soort hardware & Chipset (Noteren)
        Subsystem: Fujitsu Limited. Device 1039 #<- De volgende data is info afkomstig van het BIOS van de pc of van de hardware zelf.
        Flags: bus master, medium devsel, latency 64
        Memory at f8000000 (32-bit, prefetchable) [size=64M]
        Capabilities: [a0] AGP version 1.0 #<-- Hier verteld de hardware ons, dat het gaat om een AGP bus.
        Kernel driver in use: agpgart-intel #<-- De driver die momenteel gebruikt word (Noteren)
        Kernel modules: intel-agp #<-- Overige drivers die ook met dit apparaat werken.

Het apparaat hierboven geeft aan dat we hiervoor moeten activeren in de kernel:

  1. AGP ondersteuning.
  2. De Intel AGP driver: "agpgart-intel"
  3. En de Intel AGP driver: "intel-agp"

Nog een laatste voorbeeld:

00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01) (prog-if 80 [Master])
        Flags: bus master, medium devsel, latency 64
        [virtual] Memory at 000001f0 (32-bit, non-prefetchable) [disabled] [size=8]
        [virtual] Memory at 000003f0 (type 3, non-prefetchable) [disabled] [size=1]
        [virtual] Memory at 00000170 (32-bit, non-prefetchable) [disabled] [size=8]
        [virtual] Memory at 00000370 (type 3, non-prefetchable) [disabled] [size=1]
        I/O ports at 1420 [size=16]
        Kernel driver in use: PIIX_IDE

Hier hebben we nodig:

  1. IDE Support moet aanwezig zijn.
  2. IDE Chipset driver "PIIX_IDE" Moet aanwezig zijn.
  3. Bus driver "PIIX" Moet aanwezig zijn.

Als je niet exact weet wat voor CPU jouw pc heeft, geef je de volgende opdracht:

[root@client /]# cat /proc/cpuinfo

In mijn geval krijg ik de volgende gegevens terug op mijn scherm:

processor       : 0 #<-- De eerste CPU of CPU-core (Ik heb er maar 1)
vendor_id       : GenuineIntel #<-- Merk CPU
cpu family      : 6
model           : 8
model name      : Pentium III (Coppermine) #<-- Type CPU
stepping        : 3
cpu MHz         : 598.419 #<-- Aantal Mhz waarop de CPU momenteel draait (Enegrie beheer kan dit aantal tijdelijk laten dalen)
cache size      : 256 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr sse
bogomips        : 1196.83
clflush size    : 32
power management:

SCSI ondersteuning:

Voor dat we gaan beginnen met de kernel, is het van belang dat ik je even op de hoogte breng van een klein feitje dat het verschil kan betekenen tussen een werkende kernel en een kernel die niet wil starten.
Indien je namelijk gebruik maakt van een S-ATA hardeschijf of cd-rom speler, maar dit geld ook voor alle USB apparaten, dan moet je weten dat de Linux kernel deze apparaten ziet en behandelt als SCSI apparaten.

Dus: Maak je gebruik van S-ATA en USB opslagmedia, schakel dan ook SCSI ondersteuning in en selecteer daarbij ondersteuning voor SCSI hardeschijven, cd-rom spelers en eventuele andere SCSI drivers.
De ondersteuning van echte SCSI kaarten, zoals die van Adaptec kun je gerust uit zetten als je geen echte SCSI hardware hebt.
Dit is te doen onder: SCSI low-level drivers.

Voor de S-ATA controller is er tevens ook een aparte sectie in de kernel aanwezig. Vergeet deze niet in te schakelen, anders zal de computer de S-ATA poorten niet kunnen gebruiken.

Kernel downloaden + alle afhankelijkheden

Download de meest recente kernel broncode van de website: http://www.kernel.org

Plaats het bestand in de map: "/usr/src/"

Zorg ervoor dat je de volgende software hebt, en installeer deze eventueel met b.v. apt-get

  1. gcc: Dit is de Linux C Compiler.
  2. g++: Dit is de Linux C++ Compiler.
  3. bzip2: Dit is een programma om gecomprimeerde .bz2 bestanden uit te pakken.
  4. tar: Dit programma is om .tar bestanden uit te kunnen pakken.
  5. make: Een hulpmiddel dat de compiler vertelt wat deze precies moet doen, zodat jij dit niet hoeft te doen.

Ga naar /usr/src/ en pak de kernel broncode uit:

[root@client /]# cd /usr/src
[root@client /]# bunzip2 linux-2.6.xx.tar.bz2
[root@client /]# tar -xf linux-2.6.xx.tar
[root@client /]# cd linux-2.6.xx

De kernel configureren:

Ga als je dat nog niet gedaan hebt de map van de kernel broncode binnen.
Zodra je dat gedaan hebt, geef je de opdracht:

[root@client linux]# make menuconfig
<b>OF</b>
[root@client linux]# make xconfig

Gebruik menuconfig als je de kernel wilt configureren zonder grafische interface en gebruik xconfig als je wel gebruik wilt maken van de grafische interface van b.v. KDE.

In dit menu kun je alles inschakelen als [ ], [*] en [M].
Voor xconfig kun je kiezen uit: [ ], [V] en [.]. Deze tekens betekenen het volgende:

Voor make menuconfig:

Menuconfig.png

  • [ ]: Schakelt het betreffende onderdeel volledig uit.
  • [*]: Schakelt het onderdeel volledig in.
  • [M]: Dit onderdeel zal als een module worden gebouwd.

Voor make xconfig:

  • [ ]: Schakelt het betreffende onderdeel volledig uit.
  • [V]: Schakelt het onderdeel volledig in.
  • [.]: Dit onderdeel zal als een module worden opgebouwd.

Verschillen tussen module en inschakelen:

Je hebt de keuze om een onderdeel volledig uit te schakelen, in te schakelen of als een module in de kernel te compilen. De impact die dit zal hebben is als volgt:

  • Uit schakelen: Zoals de naam dit al aangeeft zal deze optie niet aanwezig zijn in de kernel. Als je b.v. USB support uitschakelt in de kernel terwijl je wel USB poorten hebt, zul je deze niet meer kunnen gebruiken.
  • Inschakelen: De driver zal als een vast onderdeel van de kernel direct tijdens het booten in het geheugen worden geladen, of je dit apparaat nou hebt ja of nee. Dit is essentieel voor sommige hardware, zoals je IDE, SCSI of S-ATA controller en type HDD.
  • Module: De betreffende driver zal als een module worden gecompileerd en niet direct tijdens het booten geladen worden.

Opmerking over modules:

Als de kernel je hardware ziet, zal hij kijken of de driver is ingebakken ja/nee. Als de driver niet is ingebakken, zal er naar een module gezocht worden.
Modules worden in de regel pas in het geheugen geladen als ze nodig zijn, maar niet tijden het booten van het systeem! Als je dus je IDE, SCSI of S-ATA chipset als module hebt gemaakt, zal het systeem tijdens het booten gaan klagen, dat er geen HDD aanwezig is.
De modules zijn pas beschikbaar NA het booten van de kernel, en de computer kan pas booten nadat er een b.v. een HDD gevonden is

Modules zijn wel handiger voor o.a.: Geluidskaarten en video kaarten. Modules kunnen tevens verwijderd worden of geladen worden in de kernel wanneer jij dat wilt.
Als je tevens niet 100% zeker bent van de hardware die je hebt, installeer dan de drivers die jij denkt nodig te hebben als een module. Doe dit echter niet voor je moederbord chipset en IDE, SCSI of S-ATA controller. Deze moeten namelijk gelijk beschikbaar zijn voor het boot proces.

Modules kun je wel laden tijdens het boot proces, maar dan moet je ze in een zogenaamde ramdisk laden tijden het boot proces. Dit gebeurd niet standaard. Hiervoor moet je ramdisk support inschakelen in de kernel, een grootte opgeven en zelf een bestand maken met modules en tevens aan de bootloader opgeven wat het pad is naar de module bestanden die in de ramdisk komen.

Generice drivers:

Een grote PAS OP!: Is het gebruik van de zogenaamde generice drivers.
Dit zijn drivers, die op nagenoeg elke chipset werken, maar zeer beperkte functionaliteit en snelheid bieden. Staat jouw driver absoluut niet in de lijst, dan kun je deze tijdelijk gebruiken, zodat je een driver van de fabrikant kan ophalen.

Echter er zit een gemeen addertje onder het gras: Generice drivers, worden geladen VOORDAT je echter driver geladen kan worden. De generice driver hecht zich aan de hardware en claimt I/O en IRQ adressen VOORDAT jouw driver dat kan doen.
Oftewel: Gebruik je een generice driver, dan kun je de echte driver niet gebruiken. Tenzij je de generice driver van te voren uit het geheugen verwijderd.
Wees dus terughoudend in het gebruik ervan.

De kernel compilen en installeren:

Als je ALLE opties hebt doorlopen van het kernel configuratie menu sla je de instellingen op. De instellingen worden in een bestand met de naam: .config opgeslagen.
Nu rest ons alleen maar het compilen van de broncode en het installeren van de kernel. Dit gaat als volgt:

[root@client linux]# make
[root@client linux]# make bzImage
[root@client linux]# make modules modules_install

Er zullen nu veel regels over je scherm vliegen. Dit is de debug output. Waarschuwingen mag je over het algemeen negeren.

Je kernel is nu gecompileerd in een uitvoerbaar bestand. Waar dit bestand staat is afhankelijk van of je een 32 of een 64bits kernel hebt gemaakt.
Deze keuze word automatisch voor jou gemaakt afhankelijk van de Linux versie die je momenteel gebruikt.
De naam is echter wel hetzelfde. We zoeken het kernel bestand: bzImage. Je kan dit vinden op de volgende lokatie:

32bits kernel:

Te vinden in de map: /usr/src/linux-2.6.xx/arch/i386/boot/bzImage

64bits kernel:

Te vinden in de map: /usr/src/linux-2.6.xx/arch/x86_64/boot/bzImage

Zet dit bestand op de juiste plek. De juiste plek voor kernel bestanden is: /boot

[root@client linux]# cp arch/boot/i386/bzImage /boot

De boot manager grub klaarmaken:

Nu moeten we de nieuwe kernel gaan opstarten. Dit kan alleen via de boot manager. In mijn geval is dat grub. Als je een andere gebruikt, moet je de instructies zelf even opzoeken.

Ik gebruik zelf Debian Lenny. Als je een andere Linux gebruikt, zoals Fedora kan het zijn dat jouw bestand een andere naam heeft.
Gezien ik vroeger een Fedora gebruiker was is het grub configuratie bestand uit mijn hoofd te vinden in: /etc/grub.conf

Edit voor Debian het bestand: /boot/grub/menu.lst

[root@client linux]# vim /etc/grub/menu.lst

Zoek het scherm dat je herkend van het boot menu (Debian heeft dat meestal onderaan). In mijn geval ziet dat er als volgt uit.

title           Debian GNU/Linux, kernel 2.6.26-2-686
root            (hd0,3)
kernel          /boot/vmlinuz-2.6.26-2-686 root=/dev/hda4 ro quiet
initrd          /boot/initrd.img-2.6.26-2-686

title           Debian GNU/Linux, kernel 2.6.26-2-686 (single-user mode)
root            (hd0,3)
kernel          /boot/vmlinuz-2.6.26-2-686 root=/dev/hda4 ro single
initrd          /boot/initrd.img-2.6.26-2-686

Voeg hier de volgende regels aan toe:

title           Debian GNU/Linux, kernel 2.6.xx
root            (hd0,3)
kernel          /boot/bzImage root=/dev/hda4 ro quiet

De regels hebben de volgende betekenis:

  • title: Een zelf te verzinnen naam. Deze zal weergegeven worden in het boot menu als je de pc herstart.
  • root: De hardeschijf waar Linux op geinstalleerd is. (hd0,3) betekend hier: 1e schijf 4e partitie. Linux begint altijd met 0 ipv bij 1. Neem dit gewoon over van de oude kernel parameters.
  • kernel: Het volledige pad naar je kernel bestand, locatie op welke hardeschijf en eventuele boot parameters.

tip: Laat de boot parameter quiet de eerste keer weg. Dit onderdrukt kernel meldingen die van belang zijn mocht er iets mis gaan tijdens de eerste keer booten. Plaats deze terug als alles goed werkt voor een "schoner" scherm tijdens het booten.

De nieuwe kernel booten:

Herstart nu je pc en selecteer de nieuwe kernel in het grub bootmenu.

Probleem oplossing:

Omdat er teveel mogelijke meldingen zijn om op te noemen, is je beste vriend: http://www.google.com

Een van de meest voorkomende errors is dat de kernel je root partitie niet kan vinden.
Dit betekend dat je de moederbord chipset driver, IDE, SCSI of S-ATA driver niet hebt geinstalleerd, of het type hardeschijf niet hebt aangegeven (SCSI, IDE, S-ATA enz) of als een module hebt opgegeven.

Boot in het geval van een error, je oude kernel weer en her-configureer de kernel opnieuw. Vergeet niet dat je opnieuw de kernel en modules moet compilen en het nieuwe bzImage bestand het oude laat vervangen.



How-TO's | Hoofdpagina | Linux Nieuws | Externe links | Help