01 maart 2006

Custom kernel met Ubuntu

Een beetje pietluttig zeurdertje dat elke Hz uit z'n processor en Byte in z'n geheugen nuttig wil gebruiken wordt al snel verleid tot het maken van een custom Linux kernel. De standaard met Ubuntu (en de meeste andere Linux distro's) meegeleverde kernel bevat namelijk een enorme bult aan functies en drivers die op jou computer waarschijnlijk nooit gebruikt worden. Dit is natuurlijk handig als je geen idee hebt van wat je in je computer hebt zitten; met alle drivers ingeschakeld heb je grote kans dat het meeste wel werkt. Als je echter zin hebt er wat meer tijd in te steken kun je al deze troep eruit gooien door zelf je kernel opnieuw op te bouwen met een configuratie die specifiek voor jou computer geschikt is.

Vandaag heb ik hier dus zin in. Ik ga het deze keer echter op de Ubuntu manier aanpakken. Als je namelijk gewoon de allernieuwste kernel van de Linux Kernel Archives haalt heb je het probleem dat sommige pakketten in apt-get die gebouwd zijn om te werken met een bepaalde kernel (namelijk de kernel met versie van degene die je standaard bij Ubuntu krijgt) niet werken. Ndiswrapper is een voorbeeld van zo'n programma; deze zou je in het geval van een niet-Ubuntu kernel ook zelf weer moeten gaan compilen om met je nieuwe kernel te kunnen werken.

Maar wat is dan deze Ubuntu manier? Nou ja, apt-getten natuurlijk!

$ sudo apt-get install linux-source-2.6.12

Dit kan natuurlijk ook met een ander versienummer; check om erachter te komen welk versienummer je nu draait uname -r. Ga nu de source map /usr/src en maak hier een link aan naar de map van de zojuist geinstalleerde map:

$ sudo ln -s linux-source-2.6.12 linux

Ga nu via deze link de map binnen. Als je ooit al eerder een zelfgemaakte kernel configuratie had dan is nu je kans aangebroken om het .config bestand dat je daarvoor had gebruikt te kopiëren naar deze map om het hier al aanwezige .config te overschrijven. Heb je dit echter nog niet eerder gedaan dan kun je dit negeren.

Voor we nu gaan beginnen met configureren halen we eerst nog even een handig pakketje genaamd kernel-package op met apt-get. Hiermee is het namelijk mogelijk een mooi .deb bestand van je eigen kernel te maken. Doe dus

$ sudo apt-get install kernel-package

Dan dus over tot de configuratie. Je kunt dit op een aantal manieren doen, waaronder xconfig, gconfig en menuconfig. Voor de eerste heb je echter extra pakketten nodig (qt3) en de tweede werkte bij mij niet helemaal (hij wilde sommige onderdelen niet binnen gaan) dus heb ik gekozen de grafisch niet erg indrukwekkende, maar in elk geval prima werkende menuconfig gekozen. Start dit met

kernel-image-2.6.12.lappum-1_10.00.Custom_i386.deb

$ sudo make menuconfig

Het configureren van de kernelopties is een heel vak op zich dat prima een paar uur in beslag kan nemen, wil je alles bij langs gaan. Ik kan hier verder dus niet veel zinnigs over zeggen; iedereen zal hier afhankelijk van zijn of haar hardware of gewenste functies andere keuzes maken. Als je hiermee ergens niet uitkomt kun je het beste naar die specifieke optie gaan Googlen. Een misschien handige tip: als je niet weet of je iets wat als module staat aangegeven moet toevoegen of weglaten kun je even kijken met lsmod | grep modulenaam waarbij je modulenaam meestal kunt vinden bij de Help van de optie of de module op dat moment op je computer gebruikt wordt. Is dit niet het geval dan kun je hem dus waarschijnlijk wel weggooien (tenzij je denkt dat je het later nog nodig gaat hebben). Een paar hoogtepuntjes in mijn Acer Aspire 1501LMi specifieke configuratie waren:

  • Het toevoegen van IrDA support, in plaats van er modules van te maken. Ook alle IR drivers en protocols die ik nodig ben heb ik er standaard in gestopt.
  • Het toevoegen van Ndiswrapper! Jawel, onder Device Drivers -> Networking Support is deze optie nu ook te vinden. Eens kijken hoe dat uitpakt dus, hoewel ik laatst had vernomen dat er gewerkt wordt aan een echte Linux driver voor de Broadcom kaart die ik heb, maar tot die tijd moet dit maar even volstaan.
    Na het bouwen (zie later) kwam ik er echter achter dat het als je dit er bij inbouwt het niet goed gaat. Deze dus maar weer eruit gehaald.
  • Het toevoegen van Mouse interface onder Device Drivers -> Input device support. Dit als module te compileren is natuurlijk idioot voor gebruik in een desktopomgeving.
  • Toevoegen van Acer Hot Keys Support bij Device Drivers -> Input device support -> Miscellaneous devices
  • De hele ALSA (Advanced Linux Sound Architecture) hap er gewoon bij in gedaan (bij Device Drivers -> Sound); om daar nou een 20-tal modules voor te gebruiken...
  • Bij Device Drivers -> MMC/SD Card Support alles behalve MMC debugging erbij ein gestopt.

Een paar uur (verspreid over een aantal dagen) later en we zijn alweer klaar met configureren! Op naar het bouwdeel dus; dit is waar ons mooie geïnstalleerde pakketje van pas komt. We doen dit namelijk met het volgende simpele commando's:

$ sudo make-kpkg clean $ sudo make-kpkg --append-to-version=.lappum-1 kernel_image

Voor .lappum-1 kun je natuurlijk iets persoonlijks invullen; dit is het "versie aanhangsel" waarmee je je kernel een eigen naam geeft om hem te onderscheiden van de standaard kernel van Ubuntu. Het uitvoeren van de laatste opdracht gaat wel even duren (tenzij je zo'n nieuwerwetse Pentium VII 3,3 THz hebt staan), dus pak d'r gerust een krantje bij terwijl je je computer even flink laat kraken om z'n nieuwe bestuurder tot leven te brengen.

Hierna is in de onderliggende map een spiksplinternieuw kernel pakketje te vinden. Installeer het met

$ sudo dpkg -i kernel-image-2.6.12.lappum-1_10.00.Custom_i386.deb

Bij de volgende boot is nu in je Grub menu deze kernel uit te kiezen! Nu eens kijken wat me dit aan snelheid heeft opgeleverd...

Conclusie na boot:

Qua opstartsnelheid scheelt het best een goed stuk. Een aantal stappen die je normaal langs ziet komen worden gewoon helemaal overgeslagen, maar ook gaat bijvoorbeeld het modules laden en Calculating module dependencies stukken sneller. Wat echter een beetje raar is is dat sommige modules waar ik vrij zeker van ben dat ik ze niet als module maar gewoon in de kernel had geconfigureerd toch in lsmod tevoorschijn komen.

Helemaal vervelend is het dat de driver voor de infrarood poort die ik in de kernel had gebakken blijkbaar niet werkt, aangezien er nog steeds gevraagd wordt naar een module nsc_ircc en de infrarood dus ook niet werkt. Misschien ligt dit aan het feit dat ik nog wel in /etc/modules een infrarood module heb staan, dus die gooi ik er even uit en ik reboot nog weer even.

Nu werkt dat helaas ook niet, maar goed. De procedure om een nieuwe kernel aan te maken zoals hier beschreven werkt in elk geval prima en je boekt er zeker een kleine snelheidswinst mee. Ik ga echter nog maar wel even aan de tweak voor ik hem ga gebruiken. Kleine opmerking nog: je bent wel je mooie Ubuntu opstartschermpje kwijt na deze procedure, maar misschien dat een extra make-kpkg optie รก la --initrd dit kan fixen.

Bron: NewbieDOC