De Linux-kernel: De grootste gemene deler
- November 15, 2017
- 0
Veel Linux-distributies verschillen uiterlijk erg van elkaar en ook onderliggend zijn er soms grote verschillen. Dat begint al bij de kernel: elke distributie gebruikt wel een andere versie en zelfs binnen dezelfde versie wijken ze van elkaar af. In dit artikel gaan we dieper in op de rol van de kernel binnen verschillende distributies.
De Engelse term “kernel” betekent letterlijk “kern” en dat is meteen de meeste accurate beschrijving ervan. De kernel is immers de eerste component die wordt geladen bij het booten en hij vervult een centrale rol in elke Linux-distributie. De kernel draait in een afgescheiden gedeelte van het geheugen, kernel space genaamd. Alle andere software draait in de zogenaamde user space. Dit onderscheid is erg belangrijk en zorgt ervoor dat de kernel onder alle omstandigheden stabiel blijft draaien. User space processen kunnen immers niet rechtstreeks bij het geheugen van de kernel space. De communicatie tussen beiden verloopt steeds via zogenaamde system calls. De kernel voorziet immers heel wat services aan het besturingssysteem, zoals het beheer van het geheugen en de processen en de communicatie met alle randapparatuur (opslag, netwerk, beeldscherm, enzovoorts).
In de praktijk wordt het onderscheid tussen kernel space en user space erg duidelijk wanneer zich een crash voordoet. Crasht een programma in user space, dan reageert enkel dat programma niet meer. De rest van het systeem blijft draaien, ook al moet je soms even geduld hebben voordat het systeem weer reageert. Vaak helpt het om via een virtuele terminal (Alt-Ctrl-F1) of via ssh op je machine in te loggen en het crashende proces geforceerd af te sluiten met het kill-commando. Crasht de kernel -wat gelukkig zelden het geval is!- dan heb je minder geluk. Het systeem bevriest volledig en kan enkel via een hard reset (de power-knop van je computer 5 seconden ingedrukt houden) uitgeschakeld worden. Naast een cryptische foutmelding op het scherm beginnen de LED’s op het toetsenbord ook te flikkeren om aan te geven dat de kernel gecrasht is.
Installatie
Uiteraard is de kernel reeds geïnstalleerd bij initiële installatie van je distributie. Toch loont het om even in je package manager te kijken naar de beschikbare kernel packages. De meeste distributies leveren immers meer dan één kernel mee. In bepaalde gevallen ben je beter af met een andere kernel, al is dit tegenwoordig minder het geval dan vroeger. In Ubuntu en Linux Mint beginnen de namen van de kernel packages met “linux-image-” en in Fedora met “kernel-“. Zo is er bijvoorbeeld een “linux-image-lowlatency” voor als je aan professionele audiobewerking doet en was er in het verleden een “linux-image-pae” om meer dan 4GB RAM te gebruiken op 32-bits-systemen. (Tegenwoordig is die optie standaard geactiveerd in de 32-bitskernel: je hebt dus geen speciale kernel meer nodig in dat geval.) Daarnaast zijn er ook packages met de zogenaamde kernel header files, beginnend met “kernel-headers-” in Ubuntu en “kernel-devel-” in Fedora. Die packages heb je enkel nodig als je de kernel wilt hercompileren of een extra kernel module (zoals een driver) wilt compileren.
Tot slot tonen we nog even hoe je de huidige kernel-versie controleert. Dat kan zowel via het uname-commando als in het bestand /proc/cmdline (zie afbeelding 1). “uname -a” geeft daarbij de meeste informatie: het toont je zelfs het tijdstip waarop de huidige kernel gecompileerd is. /proc/cmdline is dan weer vooral handig om te kijken met welke commandline-opties de kernel geladen is. Soms moet je die commandline immers tweaken om bepaalde driverproblemen op te lossen. Je boot de kernel dan éénmalig met bepaalde opties door die interactief toe te voegen in het Grub-menu. Lost dit jouw probleem op, dan voeg je de opties toe aan de Grub-configuratie (de precieze procedure hangt af van jouw distributie). Een volledig overzicht van ondersteunde commandline-opties vind je steeds op de kernel.org-website: bit.ly/1MfyPqM.
Afbeelding 1: Zo controleer je de huidige kernel-versie en commandline-opties.
Release cycle
Het systeem van versienummers is verschillende keren gewijzigd in de geschiedenis van de kernel. Tussen versie 1.0 en 2.6 bestond het versienummer uit 3 getallen: kernel version, major revision en minor revision. De major revision was steeds even voor stabiele versies en oneven voor onstabiele versies. Zo bestond ten tijde van de 2.4-kernel een 2.5-ontwikkelingsversie, die uiteindelijk uitmondde in de stabiele 2.6-kernel. Een nieuwe minor revision werd gebruikt voor elke release met nieuwe features, bugfixes of security patches. In de loop van de release cycle van de 2.6-kernel werd een vierde cijfer toegevoegd. Dat werd uitsluitend gebruikt voor bugfixes of security patches. Zo bevatte de 2.6.8.1-kernel geen nieuwe features, maar enkel een fix voor een bug in versie 2.6.8. In 2011 besliste Linus Torvalds echter dat de kernel 2.6.39 opgevolgd zou worden door kernel 3.0. De kernel zat immers al zeven jaar in de 2.6-release, waardoor de eerste twee cijfers niet echt betekenisvol meer waren. Vanaf kernel 3.0 gebruikt men dus weer een systeem met 3 cijfers, waarbij het tweede wordt verhoogd voor nieuwe features en het derde voor bugfixes en security patches.
Niet elke versie wordt even lang voorzien van security fixes. Ook voor de kernel zijn een aantal Long Term Support-versies, net zoals dat voor Ubuntu het geval is. Dergelijke LTS kernel-releases worden tussen de twee en zeven jaar ondersteund, tegenover slechts enkele maanden voor andere kernel-versies. Om die reden zal je in distributies zoals Debian Stable of Red Hat Enterprise Linux enkel LTS-kernels terugvinden, zoals bijvoorbeeld 2.6.32, 3.2 of 3.10. Overigens ondersteunen distributies dergelijke kernels vaak nóg langer dan kernel-ontwikkelaars. Zo wordt kernel 2.6.32 momenteel niet meer ondersteund, maar Red Hat gebruikt die in Enterprise Linux 6 en belooft security fixes tot 2020. Daarom voegen distributies vaak nog een eigen versienummer toe. Ze stellen immers meerdere kernelupdates beschikbaar die gebaseerd zijn op dezelfde officiële versie. In ons voorbeeld uit afbeelding 1 zag je kernelversie 3.19.0-32 in Linux Mint 17.3.
Upgrades
Alle distributies voorzien geregeld updates voor de kernel, maar de manier waarop ze dat doen verschilt wel eens. Grofweg kunnen we Linux-distributies in twee categorieën onderverdelen: fixed release en rolling release. Onder die eerste categorie vallen de meest grote distributies, zoals Ubuntu, Linux of Mint of Fedora. De bekendste voorbeelden van de tweede categorie zijn Arch Linux en Gentoo Linux. Fixed release distributies brengen op regelmatige tijdstippen een nieuwe release uit met daarin een nieuwe kernel-versie. Elke release wordt gedurende een vooraf bepaalde periode ondersteund. Bij Ubuntu is dat bijvoorbeeld negen maanden voor gewone releases en vijf jaar voor de LTS-releases. Gedurende die periode blijft het kernel-package van de distributie in principe binnen dezelfde major/minor revision. (Dit klopt trouwens niet altijd voor de LTS-releases van Ubuntu.) Er worden dus enkel bugfixes en security patches beschikbaar gesteld voor de huidige kernelversie. Wil je om wat voor reden ook een nieuwere kernelversie? Dan moet je wachten tot de volgende release of je toevlucht nemen tot extra repositories met nieuwere kernelversies (indien beschikbaar).
Bij rolling releases zien we een volledig andere upgradecyclus. Distributies zoals Arch Linux testen voortdurend de laatste kernelversies en maken die ook zeer snel beschikbaar. Dat lijkt op het eerste gezicht misschien interessant, maar het kan wel tot problemen leiden. Het spreekt voor zich dat de nieuwste kernel in Arch Linux minder uitvoerig getest is dan de (iets oudere) kernel in de laatste Ubuntu-release. Nieuwe kernels bevatten soms bugs die zich alleen op bepaalde hardware manifesteren en dus niet onmiddellijk worden gevonden. Installeer je steeds de allerlaatste kernel, dan kan er dus af en toe iets mislopen. Op zich is dat niet zo erg, want je hoeft je computer maar te rebooten en de vorige kernel te selecteren in Grub om het probleem op te lossen. In Linux Mint vind je de entries voor de verschillende kernelversies onder “Geavanceerde opties voor Linux Mint 17.3” (zie afbeelding 2).
Afbeelding 2: Tijdens het booten kan je steeds terugvallen op de vorige kernel
Rolling of fixed release?
Wil je zo min mogelijk verrassingen -denk bijvoorbeeld aan je primaire werkcomputer- dan raden we je aan om bij fixed release distributies te blijven. Een goed voorbeeld uit die categorie is Debian Stable. De laatste versie daarvan -versie 8- kwam uit in april 2015. Die bevatte kernelversie 3.16, die uit augustus 2014 stamt. Als je weet dat er slechts om de twee jaar een nieuwe release komt van Debian Stable, zit je dus steeds met een kernel van ongeveer één tot drie jaar oud in Debian Stable! Stabiel is die kernel uiteraard wel, al hebben we de afgelopen vijf jaar ook één keer meegemaakt dat een kernel update in Debian Stable ervoor zorgde dat we geen wireless verbinding meer konden opzetten. Hoewel erg zeldzaam, kan een bugfix of security patch dus ook een nieuwe bug introduceren. Aan de andere kant hebben gebruikers van Debian Testing of Unstable (met regelmatige updates naar nieuwere kernelversies) veel vaker last van dergelijke issues.
Toch kleeft één groot nadeel aan een oudere, stabiele kernelversie: splinternieuwe hardware wordt vaak niet (volledig) ondersteund. Heb je net een nieuwe laptop aangeschaft met de allerlaatste cpu, chipset en grafische kaart? Dan is de kans erg groot dat een kernel van twee jaar oud niet over de juiste drivers beschikt. Wil je persé een distributie, zoals Debian Stable of Ubuntu LTS, gebruiken? Dan moet je je toevlucht nemen tot recentere kernels uit bijvoorbeeld een backport-repository. Backports zijn pakketten uit een nieuwere distributie die specifiek gehercompileerd zijn om ook in een oudere versie van die distributie te werken.
Mint kernelbeheer
Normaal gezien moet je extra repositories inschakelen om een nieuwere kernel te installeren. Linux Mint maakt het je echter een stuk eenvoudiger door verschillende kernels aan te bieden. Standaard blijf je bij de kernel die bij jouw release hoort, bijvoorbeeld 3.13 voor 17 en 17.1, 3.16 voor 17.2 en 3.19 voor 17.3. Nieuwere (of oudere) kernels installeer je via de Updatebeheer-applicatie. In het menu “Tonen” klik je op “Linuxkernels” voor een overzicht van beschikbare versies.
In onze Linux Mint 17.3-installatie konden we kiezen uit talloze versies tussen 3.13.0-24 en 4.2.0-30. Bij enkele versies vind je meer informatie over reparaties (welke bugfixes bevat deze versie?) of regressiefouten (welke bugs bevat deze versie?). Helaas ontbreekt dergelijke informatie voor het merendeel van de beschikbare kernels. Hoe dan ook, we raden je aan om deze tool alleen te gebruiken indien je specifieke driverproblemen tegenkomt. Een zoektocht op het internet (bijvoorbeeld op het forum van Ubuntu of Linux Mint) brengt je dan vaak tot een bepaalde minimale kernelversie die je moet installeren. Voor die situaties is dit een prima tool die het installeren van nieuwere kernels voor iedereen toegankelijk maakt.
Afbeelding 3: Zo installeer je een andere kernel in Linux Mint
Keuze
Linux-gebruikers staan zelden stil bij de kernel-versie in hun distributie. Toch is het interessant om te weten wat de versienummers nu precies betekenen of wat de implicaties zijn van de keuze voor een rolling of fixed release distributie. Met de kennis uit dit artikel maak je een bewuste keuze en weet je meteen waar je moet beginnen met zoeken om problemen met drivers of nieuwe hardware op te lossen.