De Linux Kernel HOWTO

v1.0, 5 juni 1999

Dit is een gedetailleerde gids voor het configureren, compileren en upgraden van de kernel, en het oplossen van problemen voor op ix86 gebaseerde systemen.

IntroductieZou je dit document moeten lezen? Wel als je één van de volgende symptomen herkent: ``Ai! Dit wizzo-46.5.6 package zegt dat het kernel release 2.8.193 nodig heeft en ik heb nog steeds slechts release 1.0.9!'' Er is een devicedriver in één van de nieuwere kernels die je gewoon moet hebben Je hebt werkelijk geen idee hoe je een kernel compileert ``Is datgene wat er in de README staat, echt het hele verhaal?'' Je kwam, je probeerde het, het werkte niet Je hebt iets nodig om aan mensen te geven die erop blijven hameren dat je hun kernels voor ze installeert

Lees dit eerst! (Ik meen het)Bij een aantal van de voorbeelden in dit document wordt ervan uitgegaan dat je GNU tar, find, en xargs hebt. Dit zijn standaards; dit zou geen problemen mogen veroorzaken. Er wordt ook vanuit gegaan dat je bekend bent met de structuur van het bestandssysteem op je systeem; als dit niet zo is, is het van groot belang dat je een geschreven kopie van de uitvoer van het commando mount tijdens de normale systeembewerking bij de hand houdt (of een listing van /etc/fstab, als je het kunt lezen). Deze informatie is belangrijk, en wijzigt niet, tenzij je je disk opnieuw partitioneert, een nieuwe disk toevoegt, je systeem opnieuw installeert of iets dergelijks.De laatste ``productie'' kernelversie op moment van dit schrijven was 2.2.9, wat betekent dat de verwijzingen en voorbeelden corresponderen met die release. Zelfs al probeer ik dit document zo versie-onafhankelijk mogelijk te maken, de kernel is voortdurend onder ontwikkeling, dus als je een nieuwere release krijgt, zullen er onontkoombaar wat verschillen zijn. Nogmaals, dit zou geen belangrijke problemen moeten geven, maar het kan wat verwarring geven.Er zijn twee versies van de linux kernel source, ``productie'' en ``development.'' Productie releases zijn de even-minor-genummerde releases; 1.2.x was productie, 2.0.x is productie, als ook 2.2.x. Deze kernels worden aangemerkt als de meest stabiele kernels, foutvrije versies die ten tijde van de release beschikbaar zijn. De development kernels (2.1.x, 2.3.x, enz) zijn bedoeld als kernels om te testen, voor mensen die bereid zijn om ze uit te testen en het kunnen kernels zijn die veel fouten bevatten. Je bent gewaarschuwd.
Belangrijke vragen en de antwoorden daarop

Wat doet de kernel, eigenlijk?De Unix kernel gedraagt zich als een bemiddelaar voor je programma's en je hardware. Als eerste doet het (of regelt het) voor alle draaiende programma's het geheugenbeheer (processen), en zorgt het ervoor dat ze allen een eerlijk (of oneerlijk, als je dat wenst) deel van de processor cycli krijgen. Bovendien voorziet het in een tamelijk fraaie overdraagbare interface voor programma's om met je hardware te communiceren.De werking van de kernel beslaat beslist meer dan dat, maar dit zijn de belangrijkste basisfuncties.
Hoe de kernel feitelijk te configureren

Verkrijgen van de sourceJe kunt de source via anonieme ftp verkrijgen vanaf ftp.kernel.org in /pub/linux/kernel/vx.y, waar x.y voor de versie staat (bv 2.2), en zoals eerder genoemd, die met een oneven nummer eindigen, zijn development releases en kunnen onstabiel zijn. Ze zijn vaak gelabeld als linux-x.y.z.tar.gz, waarbij x.y.z voor het versienummer staat. Op de sites staan vaak ook bestanden met het toevoegsel .bz2, deze zijn met bzip2 gecomprimeerd (ze zullen kleiner zijn en nemen bij het transporteren minder tijd in beslag).Je kunt het beste ftp.xx.kernel.org gebruiken, waar xx je landcode voorstelt; voorbeelden zijn ftp.at.kernel.org voor Australië, en ftp.us.kernel.org voor de United States.
Compileren van de kernel

Opschonen en afhankelijkhedenAls het configuratiescript eindigt, geeft het ook aan een `make dep' en (mogelijk) `clean' uit te voeren. Dus, doe de `make dep'. Dit verzekert je dat alle afhankelijkheden, zoals de include bestanden, op hun plaats staan. Het duurt niet lang, tenzij je computer om te beginnen nogal langzaam is. Je zou voor oudere versies van de kernel een `make clean moeten doen, als je klaar bent. Hiermee worden alle object-bestanden en wat andere zaken verwijderd die door een oude versie achter worden gelaten. Vergeet deze stap in ieder geval niet voordat je een poging gaat ondernemen om een kernel te hercompileren.
Patchen van de kernel

Toepassen van een patchPeriodieke upgrades van de kernel worden als patches gedistribueerd. Als je bijvoorbeeld versie 1.1.45 hebt, en je merkt dat er een `patch46.gz' voor is, betekent het dat je naar versie 1.1.46 kunt upgraden door toepassing van de patch. Misschien wil je eerst een backup van de sourcetree maken (`make clean' en vervolgens `cd /usr/src; tar zcvf old-tree.tar.gz linux' zal een gecomprimeerd tar-archief voor je maken).Dus, verdergaand met het voorbeeld van hierboven, laten we ervan uitgaan dat je `patch46.gz' in /usr/src hebt. cd naar /usr/src en doe een `zcat patch46.gz | patch -p0' (of `patch -p0 < patch46' als de patch niet is gecomprimeerd). Je zult van alles voorbij zien vliegen (of fladderen als je systeem zo langzaam is) om je te laten weten dat het aan het proberen is om brokken toe te passen en of het daarin slaagt of niet. Meestal gaan deze acties te snel voorbij om ze te kunnen lezen, en ben je er niet helemaal zeker van of het wel of niet werkte, dus misschien wil je de -s flag aan patch opgeven, welke patch aangeeft alleen de foutmeldingen te rapporteren (je krijgt niet zoveel als bij het ``hé, mijn computer doet eindelijk eens wat voor de verandering!'' gevoel, maar het kan zijn dat je hier de voorkeur aan geeft ..). Om die onderdelen te bekijken die misschien niet zo soepel zijn verlopen, cd je naar /usr/src/linux en zoek je naar bestanden met een .rej extensie. Een aantal versies van patch (oudere versies welke kunnen zijn gecompileerd met een inferieur bestandssysteem) laat de verwerpingen met een # extensie achter. Je kunt `find' gebruiken om ze voor je op te sporen; find . -name '*.rej' -print drukt alle bestanden in de huidige directory of elke subdirectory met de .rej extensie naar standaarduitvoer af.Als alles goed ging, doe je een `make clean', `config', en `dep' zoals in sectie 3 en 4 werd beschreven.Er zijn heel wat opties voor het patch commando. Zoals hierboven genoemd, zal patch -s alle berichten behalve de foutmeldingen onderdrukken. Als je je kernelsource op een andere plaats dan /usr/src/linux bewaart, zal er met patch -p1 (in die directory) een zuivere patch worden uitgevoerd. Andere patch opties zijn goed gedocumenteerd in de manual page.
Aanvullende packagesJe linuxkernel heeft vele faciliteiten die niet in de kernelsource zelf zijn uitgelegd; deze faciliteiten worden kenmerkend door externe packages gebruikt. Een aantal van de meest gebruikelijke faciliteiten wordt hier opgesomd.

kbdDe linux console heeft waarschijnlijk meer faciliteiten dan het toekomt. Hiertussen bevindt zich de mogelijkheid om van lettertypen te verwisselen, je toetsenbord opnieuw in te delen, tussen video-modes te schakelen (in nieuwere kernels), enz. Het kbd package bestaat uit programma's die de gebruiker in staat stellen om dit allemaal te doen, plus nog vele lettertypen en toetsenbordindelingen voor bijna ieder toetsenbord, en het is vanaf dezelfde sites beschikbaar waar de kernelsource te vinden is.
Een aantal valkuilen

make clean Als je nieuwe kernel echt vreemde dingen doet na een routine kernel-upgrade, bestaat de kans dan je vergat make clean uit te voeren voordat je de nieuwe kernel compileerde. De symptomen kunnen van alles zijn, van je systeem dat ineens crasht, vreemde I/O problemen, te lage performance. Wees er zeker van dat je ook een make dep doet.
Opmerking voor upgrade naar versie 2.0.x, 2.2.xKernel versies 2.0.x en 2.2.x introduceerde heel wat wijzigingen voor de kernel-installatie. Het bestand Documentation/Changes in de 2.0.x source tree bevat informatie waarmee je bekend zou moeten zijn als je naar één van deze versies gaat upgraden. Je zult zeer waarschijnlijk verscheidene packages moeten upgraden, zoals gcc, libc, en SysVInit, en misschien een aantal systeembestanden moeten wijzigen, dus wees hier op voorbereid. Echter, geen paniek.ModulesLaadbare kernelmodules kunnen geheugen besparen en de configuratie vergemakkelijken. De strekking van modules is gegroeid dat het bestandssystemen, ethernetkaartdrivers, tapedrivers, printer drivers, en meer bevat.

Installeren van de module-utility'sDe module utilities zijn beschikbaar vanwaar je je kernelsource vandaan hebt gehaald als modutils-x.y.z.tar.gz; kies het hoogste patchlevel x.y.z dat gelijk is of lager dan dat van je huidige kernel. Pak het uit met `tar zxvf modutils-x.y.z.tar.gz', cd naar de directory, het maakt (modutils-x.y.z) aan, bekijk de README, en voer de installatie-instructies ervan uit (die meestal erg eenvoudig zijn, zoals make install). Je zou nu de programma's insmod, rmmod, ksyms, lsmod, genksyms, modprobe, en depmod in /sbin moeten hebben. Test de utilities met de ``hw'' voorbeelddriver in insmod, als je dat wilt; bekijk het bestand INSTALL in die subdirectory voor details.insmod voegt een module in, in de draaiende kernel. Modules hebben meestal een .o extensie; de voorbeelddriver die hierboven werd genoemd, heeft de naam drv_hello.o, dus om dit in te voegen, zou men intikken `insmod drv_hello.o'. Om te modules te zien die de kernel op dit moment gebruikt, gebruik je lsmod. De uitvoer ziet er ongeveer zo uit: blah# lsmod Module: #pages: Used by: drv_hello 1`drv_hello' is de naam van de module, het gebruikt één pagina (4k) van het geheugen, en er zijn op dit moment geen andere kernelmodules afhankelijk van. Om deze module te verwijderen, gebruik je `rmmod drv_hello'. Merk op dat rmmod de naam van een module verlangt, geen bestandsnaam; je krijgt dit van de uitvoer van lsmod. De strekking van de andere utilities voor de modules staan in hun manual pages gedocumenteerd.
Tips en trucs

Doorsturen van uitvoer van de make of patch commando's Als je logs van wat die `make' of `patch' commando's deden, zou willen hebben, kun je de uitvoer naar een bestand doorsturen. Zoek als eerste uit onder welke shell je draait: `grep root /etc/passwd' en zoek naar iets als `/bin/csh'.Als je sh of bash gebruikt, zal (commando) 2>&1 | tee (uitvoerbestand) een kopie van de uitvoer van (commando) in het bestand `(uitvoerbestand)' plaatsen.Gebruik voor csh of tcsh, (command) |& tee (uitvoerbestand)Voor rc (Opmerking: je gebruikt rc waarschijnlijk niet) is het (command) >[2=1] | tee (uitvoerbestand)
Andere relevante HOWTO's die nuttig kunnen zijn Sound-HOWTO: geluidskaarten en utilities SCSI-HOWTO: alles over SCSI-controllers en -devices NET-2-HOWTO: netwerk PPP-HOWTO: PPP-netwerken in het bijzonder PCMCIA-HOWTO: over de drivers voor je notebook ELF-HOWTO: ELF: wat het is, het converteren.. Hardware-HOWTO: overzicht van ondersteunde hardware Module mini-HOWTO: meer over kernelmodules Kerneld mini-HOWTO: over kerneld BogoMips mini-HOWTO: voor 't geval je 't je af mocht vragenDiversen

AuteurDe auteur en beheerder van de Linux Kernel-HOWTO is Brian Ward (bri@cs.uchicago.edu). Stuur me alsjeblieft je opmerkingen, aanvullingen, correcties (Correcties zijn voor mij in het bijzonder het belangrijkst).Je kunt een kijkje nemen op mijn `home page' op één van deze URL's: http://www.math.psu.edu/bri/ http://blah.math.tu-graz.ac.at/~bri/Ook al probeer ik zo attent mogelijk te zijn met mail, denk er alsjeblieft aan dat ik er iedere dag heel veel van krijg, dus het kan even duren voor ik je antwoord. Vooral als je me mailt met een vraag, probeer dan alsjeblieft extra je best te doen in je bericht duidelijk en gedetailleerd te zijn. Als je me schrijft over niet werkende hardware (of iets dergelijks) moet ik weten wat je hardwareconfiguratie is. Als je een fout rapporteert, zeg dan niet slechts ``Ik heb dit geprobeerd, maar het gaf een foutmelding;'' Ik moet weten wat de foutmelding was. Ik zou ook willen weten welke versie van de kernel, gcc, en libc je gebruikt. Als je me slechts vertelt dat je één of andere versie van een bepaalde distributie gebruikt, zal me dat niet veel zeggen. Het maakt me niet uit als je eenvoudige vragen stelt; denk eraan, als je niets vraagt, kun je ook nooit een antwoord krijgen! Ik zou graag iedereen willen bedanken die me feedback heeft gegeven.Als je vraag niets met de kernel te maken heeft, of in een taal staat die ik niet begrijp, kan het zijn dat ik niet antwoord.Als je me een mail hebt gestuurd en binnen redelijke tijd (drie weken of meer) geen antwoord hebt gekregen, dan bestaat de kans dat ik je bericht per ongeluk heb verwijderd of iets van die strekking (sorry). Probeer het alsjeblieft opnieuw.Ik krijg erg veel mail over zaken die eigenlijk te maken hebben met hardware of hardwareproblemen. Dat is prima, maar probeer er alsjeblieft aan te denken dat ik niet bekend ben met alle in de wereld te krijgen hardware. Ik gebruik AMD processors, Adaptec en Sybios SCSI-controllers, en IBM SCSI-disks.Versie -0.1 werd geschreven op 3 oktober 1994. Dit document is beschikbaar in SGML, PostScript, TeX, roff, en plain-text formaten.