04.09.2013 Views

Een kernel bouwen.pdf - GM Club

Een kernel bouwen.pdf - GM Club

Een kernel bouwen.pdf - GM Club

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Een</strong> <strong>kernel</strong> <strong>bouwen</strong><br />

Waarom is het nuttig om zelf een <strong>kernel</strong> te <strong>bouwen</strong> ?<br />

Hoewel iedereen begrijpt waar je het over hebt als je PC zegt, is het niet zo dat elke PC gelijk is aan elke<br />

andere PC. Integendeel, er zijn vele leveranciers van moederborden, processoren, harde schijven,<br />

videokaarten, enzovoort, en al die leveranciers hebben in de loop van de tijd al vele verschillende varianten<br />

van hun produkten uitgebracht. Met andere woorden: als je nauwkeurig kijkt naar alle onderdelen, is elke PC<br />

anders dan alle andere PC's.<br />

Elke type produkt van elke leverancier werkt op zijn eigen manier, en het <strong>kernel</strong> moet dus weten hoe het moet<br />

communiceren met al die onderdelen.<br />

Uitgevers van Linux CD-ROMs hebben het probleem dat ze een CD willen maken die op elke PC te<br />

gebruiken is, maar ze kunnen niet alle mogelijke varianten van het Linux <strong>kernel</strong> maken, want dat zou niet op<br />

een CD-ROM passen (waarschijnlijk niet eens op enkele tientallen CD-ROMs). Wat ze doen is een klein<br />

aantal <strong>kernel</strong>s op de CD-ROM zetten met `typische' PC-configuraties. Elke PC-gebruiker pakt het <strong>kernel</strong> wat<br />

het best bij zijn computer past, en gebruikt dat om Linux mee te draaien.<br />

Het probleem van deze aanpak is dat het <strong>kernel</strong> wat op de CD-ROM staat weliswaar wel werkt, maar ook veel<br />

meer kan dan wat er in de computer zit (en dus nodig is). <strong>Een</strong> voorbeeld is het <strong>kernel</strong> `net' van Slackware. Dit<br />

<strong>kernel</strong> kent alle netwerkkaarten, en tenzij de hele computer vol zit met die dingen, heb je aan genoeg aan een<br />

<strong>kernel</strong> die alleen het type kaart kent wat ook echt in de computer zit.<br />

Alle programmatuur die in het <strong>kernel</strong> zit om onderdelen aan te sturen die niet in de computer zitten vormt<br />

alleen maar ballast, en houdt een stuk geheugen vast wat nuttiger ergens anders voor gebruikt kan worden. In<br />

sommige (extreme) gevallen zijn ze zelfs oorzaak van het niet goed werken van het <strong>kernel</strong>.<br />

De oplossing voor dit alles is het maken van een <strong>kernel</strong> specifiek voor de eigen computer. Op die manier<br />

wordt gezorgd dat Linux optimaal functioneert.<br />

Hoe bouw je een <strong>kernel</strong> ?<br />

Het <strong>bouwen</strong> van een <strong>kernel</strong> bestaat uit vijf stappen:<br />

1. Zorg dat de broncode van een recente versie van het <strong>kernel</strong> beschikbaar is op het systeem.<br />

2. Configureer het <strong>kernel</strong>.<br />

3. Maak een executeerbare <strong>kernel</strong>image.<br />

4. Installeer de <strong>kernel</strong>image zodanig dat de computer ermee opstart als de computer wordt aangezet.<br />

5. Start de machine opnieuw, zodat het nieuwe geladen wordt (en daarmee in gebruik wordt genomen).<br />

Het lijkt de eerste keer allemaal erg veel en erg moeilijk, maar met wat geduld, wat nadenken, en het nemen<br />

van wat veiligheidsmaatregelen kan er weinig misgaan.<br />

De broncode van een recent <strong>kernel</strong><br />

Versienummers van <strong>kernel</strong>s<br />

Omdat Linux (en het Linux <strong>kernel</strong>) constant in ontwikkeling is, en het testen door een grote groep<br />

vrijwilligers gedaan wordt over de hele wereld, komen er constant nieuwe versies uit. Om wat orde te houden<br />

in alle versies bestaat er een nummerings-systeem om elke versie een uniek nummer te geven.


<strong>Een</strong> versienummer van een <strong>kernel</strong> is niet één getal, maar bestaat uit 3 getallen, gescheiden door een punt.<br />

Opvragen van dit nummer kan gedaan worden met het commando `uname -a'. Mijn computer meldt:<br />

Linux rataplan 2.0.27 #6 Fri Mar 8 00:31:26 MET 1996 i586<br />

`Linux' is de naam van het besturingssysteem (dit zou bij iedereen hetzelfde moeten zijn), `rataplan' is de<br />

naam van mijn computer, `2.0.27' is de versie van het <strong>kernel</strong> wat ik gebruik, `#6 Fri Mar 8 00:31:26 MET<br />

1996' is het tijdstip waarop ik mijn <strong>kernel</strong> heb gemaakt, en `i586' is het type van de processor wat in mijn<br />

computer zit.<br />

Het eerste nummer (nummer `2') is het hoofdversie nummer. De eerste (test)<strong>kernel</strong>s hadden nummer 0 (deze<br />

<strong>kernel</strong>s waren overigens vaak stabieler dan Windows 3.11), bij de vrijgave van de eerste `stabiele' versie in<br />

Maart 1994 is versie 1 uitgekomen, en ondertussen zijn we overgegaan op versie 2 met de integratie van<br />

modules in het <strong>kernel</strong> (modules worden verderop nog uitgelegd).<br />

Het tweede nummer in het <strong>kernel</strong>nummer heeft een dubbele functie. Het fungeert als een subversie nummer<br />

(dus <strong>kernel</strong>s die beginnen met 1.2 zijn nieuwer dan <strong>kernel</strong>s die beginnen met nummer 1.0), maar ook om<br />

onderscheid te maken tussen stabiele en experimentele <strong>kernel</strong>s. De regel is dat even nummers gebruikt<br />

worden voor de stabiele <strong>kernel</strong>s, en oneven nummers voor de experimentele. Op dit moment bestaan er dus<br />

naast 2.0 <strong>kernel</strong>s ook 2.1 <strong>kernel</strong>s. Als de 2.1 versie uitontwikkeld is (wat in de toekomst wel eens zal<br />

gebeuren), gaat die versie over naar 2.2 (of 3.0), en vanaf dat moment worden nieuwe ontwikkelingen gedaan<br />

in <strong>kernel</strong> versies 2.3 (of 3.1).<br />

Het laatste nummer is een volgnummer (nummer `27') binnen de serie 2.0 <strong>kernel</strong>s. Deze nummers worden<br />

gewoon steeds één opgehoogd met elke nieuwe release. Volgnummers in de ene serie hebben geen betekenis<br />

in de andere serie (dus <strong>kernel</strong> 2.0.27 heeft geen speciale binding met <strong>kernel</strong> 2.1.27).<br />

Welk <strong>kernel</strong> handig is om te gebruiken is moeilijk te beantwoorden in zijn algemeenheid. Het hangt af van<br />

waar de computer gebruikt voor gebruikt wordt, en hoe heet-van-de-naald het <strong>kernel</strong> moet zijn. Het voordeel<br />

van stabiele <strong>kernel</strong>s is dat ze stabiel zijn, er zitten geen experimentele stukken code waar nog aan gesleuteld<br />

wordt. Aan de andere kant, dat betekent wel vaak dat ze niet het nieuwste van het nieuwste bevatten.<br />

Bij het maken van een <strong>kernel</strong> voor de eerste keer is het handig om een stabiel <strong>kernel</strong> te nemen. Als er dan<br />

problemen optreden weet je in ieder geval zeker dat het niet aan de onstabiele code in het <strong>kernel</strong> ligt. Als dat<br />

allemaal goed gaat, en je krijgt wat vertrouwen in het proces, dan kun je daarna altijd nog een experimentele<br />

versie proberen (ontwikkeling van het Linux <strong>kernel</strong> zal waarschijnlijk wel door blijven gaan, zolang er<br />

computers zijn).<br />

Bij het schrijven van deze tekst is het laatste stabiele <strong>kernel</strong> nummer 2.0.29, maar alle <strong>kernel</strong>s vanaf versie<br />

2.0.0 zijn bruikbaar.<br />

Plaats van de broncode van het <strong>kernel</strong> in het Linux systeem<br />

De broncode van het huidige <strong>kernel</strong> staat altjd in /usr/src/linux. Het lijkt logisch om de oude versie van<br />

weg te gooien, en dan de nieuwe versie er neer te zetten. Op zich mag dat (en kan dat ook), maar daarmee<br />

maak je het wel onmogelijk om terug te gaan naar een oudere versie, in het geval dat er iets ernstig mis gaat.<br />

<strong>Een</strong> veiligere oplossing is om de oude broncode te bewaren naast de nieuwe.<br />

Verhaal over het maken van een softlink met de naam `linux' in /usr/src naar verschillende <strong>kernel</strong> versies.<br />

Configureren van het <strong>kernel</strong><br />

make menuconfig, en uitleggen wat al die opties doen.


Maak een <strong>kernel</strong>image<br />

Dit klinkt erg ingewikkeld, maar is erg eenvoudig. <strong>Een</strong> <strong>kernel</strong>image maak je met drie commando's:<br />

1. make dep<br />

Met dit commando berekent de computer in welke volgorde alle files gecompileerd moeten worden.<br />

2. make clean<br />

Dit commando zorgt ervoor dat alle oude files verdwijnen, waardoor echt alle files opnieuw<br />

aangemaakt worden.<br />

Bij het compileren voor de eerste keer is het niet echt nodig, maar uitvoeren van het commando duurt<br />

niet lang, en het commando doen terwijl het niet nodig is kan geen kwaad.<br />

3. make zImage<br />

Dit commando zorgt ervoor dat alle files één voor één gecompileerd worden, en dat ze allemaal aan<br />

elkaar gekoppeld worden. Afhankelijk van de hoeveel geheugen, kan dit kort of lang duren (op een<br />

oude machine met 4MB heeft het bij mij wel eens ruim 2 uur geduurd, en op een Pentium met 32MB<br />

duurt het ongeveer 10 minuten).<br />

Na de laatste stap moet er een <strong>kernel</strong>image gemaakt zijn. Deze staat in de directory<br />

/usr/src/linux/arch/i386/boot, en heet zImage.<br />

Installeer het nieuwe <strong>kernel</strong>image<br />

Installeren van het nieuwe <strong>kernel</strong> komt ruwweg neer op het overschrijven het oude <strong>kernel</strong> (waarmee de<br />

machine op dit moment draait). Dat is echter een niet zo slimme oplossing, omdat er dan geen weg terug is als<br />

het nieuwe <strong>kernel</strong> niet blijkt te werken (het oude <strong>kernel</strong> is weg, en je kunt niet bij de broncode om een nieuw<br />

(beter) <strong>kernel</strong> te maken, omdat de machine niet opstart met het nieuwe <strong>kernel</strong>).<br />

<strong>Een</strong> veiligere oplossing is om het nieuwe <strong>kernel</strong> naast het oude te zetten, en dan bij het opstarten van de<br />

machine expliciet te kiezen voor het nieuwe <strong>kernel</strong>. Als het niet werkt, dan kun je door een reset weer booten<br />

met het oude (werkende) <strong>kernel</strong> (en een nieuwe poging wagen met een andere configuratie van het <strong>kernel</strong>).<br />

Werkt het wel, dan kun je dan het oude <strong>kernel</strong> weggooien, of het nieuwe als standaard <strong>kernel</strong> om mee op te<br />

starten aanwijzen (waarbij het oude <strong>kernel</strong> als terugval mogelijkheid aanwezig blijft).<br />

Start de computer opnieuw

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!