Linux concept: kernel
Elk commando dat je typt, elk bestand dat je opent, elk pakket dat je machine verstuurt begint op dezelfde manier: je programma vraagt een enkel stuk software om toestemming en hulp, en die software praat namens jou met de hardware. Je programma's raken de schijf, de geheugenchips of de netwerkkaart nooit rechtstreeks aan. Een programma staat tussen al die dingen en het kale metaal in, bepaalt wie wat krijgt, en zorgt dat duizenden processen elkaar niet in de weg zitten. Dat programma is de kernel. Het is de kern van het besturingssysteem, het deel dat echt "Linux" is, en de kernel begrijpen is begrijpen wat een Linux-machine eigenlijk is.
1. De basis
De kernel is het centrale programma van het besturingssysteem. Het is de eerste echte software die de machine bij het opstarten laadt, het blijft in het geheugen zolang de computer aanstaat, en het heeft volledige controle over de hardware. Al het andere, van je shell tot je webbrowser tot een databaseserver, is een gewoon programma dat boven op de kernel draait en de kernel om hulp vraagt zodra het iets echts moet doen.
De reden voor dit ontwerp is bescherming. Een moderne CPU kan in twee modi draaien. In kernelmodus mag een programma alles: elk stukje geheugen aanraken, met elk apparaat praten, de processor stilzetten. In gebruikersmodus zit een programma opgesloten: het mag alleen zijn eigen geheugen gebruiken en moet voor al het andere iets vragen. De kernel draait in kernelmodus. Elk ander programma draait in gebruikersmodus. Deze scheiding is wat voorkomt dat een programma met een fout de hele machine laat crashen of de privegegevens van een ander programma leest.
Je begrijpt de kernel daarom het best als een poortwachter en een scheidsrechter. Als je programma een bestand wil lezen, kan het de schijf niet zelf openen; het vraagt het aan de kernel, en de kernel controleert je rechten, leest de juiste blokken, en geeft de data terug. Als twee programma's allebei de CPU willen, bepaalt de kernel wie er draait en hoe lang. Als een programma om geheugen vraagt, zoekt de kernel het en houdt het gescheiden van dat van alle anderen.
Het juiste mentale model: de kernel is het enige programma dat met de hardware mag praten. Elk ander programma op het systeem is een gast die de kernel om alles wat echt is moet vragen, en de kernel beslist ja of nee.
Dit artikel gaat over dat kernprogramma: wat het doet, waar de naam vandaan komt, hoe Linux is ontstaan, hoe je je eigen kernel bekijkt en afstelt, en de verrassende waarheid dat bijna alles wat je computer doet eigenlijk een kort verzoek is dat over de grens de kernel in en weer uit wordt gegeven. De voorbeelden zijn geverifieerd tegen Linux-kernelversie 6.11.
1.1 Zien welke kernel je draait
Je kunt je draaiende kernel zich met een commando laten identificeren: uname (kort voor "unix name"). De handigste vlag is -r (kort voor "release"):
$ uname -r
6.11.0-29-generic
$ cat /proc/version
Linux version 6.11.0-29-generic (buildd@lcy02-amd64-008) (gcc 13.3.0) #29 SMP PREEMPT_DYNAMIC ...
De eerste regel is de kernelversie die je op dit moment draait. De tweede, gelezen uit het speciale bestand /proc/version, voegt toe wie het bouwde, met welke compiler, en wanneer. Merk op dat je de kernel leest door een bestand te openen: die truc komt hieronder keer op keer terug.
1.2 Wat de kernel eigenlijk doet
Het werk van de kernel valt uiteen in een paar grote verantwoordelijkheden. Ze gaan allemaal over het veilig delen van een beperkte resource tussen veel programma's tegelijk:
| Taak | Wat het beheert |
|---|---|
| Procesplanning | Welk programma op welke CPU-kern draait, en hoe lang |
| Geheugenbeheer | Elk proces zijn eigen prive geheugen geven en dat weer terugnemen |
| Bestandssystemen | Ruwe schijfblokken omzetten in bestanden, mappen en rechten |
| Apparaatstuurprogramma's | Praten met hardware: schijven, netwerkkaarten, toetsenborden, GPU's |
| Netwerken | De TCP/IP-stack die data in pakketten omzet en terug |
| Systeemaanroepen | De deur waardoor programma's de kernel om al het bovenstaande vragen |
Geen enkele applicatie kan deze taken voor zichzelf doen zonder elke andere applicatie te kunnen verstoren. Ze centraliseren in een vertrouwd programma is het hele idee van een besturingssysteemkernel.
1.3 Kernelruimte en gebruikersruimte
Je komt twee termen voortdurend tegen: kernelruimte en gebruikersruimte. Ze benoemen de twee werelden die de modusscheiding creeert. Kernelruimte is waar de kernel en zijn stuurprogramma's draaien, met volledige toegang tot de hardware. Gebruikersruimte is waar elk gewoon programma draait, afgeschermd en om hulp vragend. De grens ertussen wordt miljoenen keren per seconde overgestoken, en die oversteken is precies wat een systeemaanroep is:
USER SPACE your shell, editor, browser, servers (limited)
|
| system call (a guarded doorway)
v
KERNEL SPACE scheduler, memory, drivers, filesystems (full power)
|
v
HARDWARE CPU, RAM, disks, network, devices
Houd dit plaatje in gedachten. Bijna alles in de rest van dit artikel is ofwel iets wat in kernelruimte gebeurt, ofwel een manier voor jou, staand in gebruikersruimte, om over de grens te kijken en te zien wat de kernel doet.
1.4 De twee grote illusies: planning en virtueel geheugen
Twee van de taken van de kernel verdienen bijzondere aandacht, want samen creeren ze de illusie dat elk programma de machine voor zichzelf heeft.
De eerste is planning. Je machine draait veel meer programma's dan het CPU-kernen heeft, en toch gedraagt elk zich alsof het zonder onderbreking draait. De kernel bereikt dit met context switching: het laat een proces een paar milliseconden draaien, bewaart zijn exacte toestand, en geeft de kern door aan de volgende, honderden keren per seconde. Een planner bepaalt de volgorde en weegt eerlijkheid af tegen reactiesnelheid, en je kunt het aandeel van een proces bijsturen met zijn nice-waarde, een prioriteit die loopt van -20 (hebberig) tot 19 (vrijgevig):
$ nice -n 10 ./backup.sh # start a job at low priority (short for "niceness")
$ renice -n 5 -p 1234 # lower the priority of a process already running
De tweede is virtueel geheugen. Elk proces krijgt zijn eigen prive, aaneengesloten beeld van het geheugen en denkt dat het de hele machine bezit. De kernel koppelt die virtuele adressen aan echt RAM in kleine stukken die pagina's heten, duwt pagina's die het niet nodig heeft naar swap op schijf, en gebruikt alle overgebleven RAM als een pagecache zodat recent gelezen bestanden meteen terugkomen. Dit is waarom vrij geheugen op een gezonde Linux-machine verontrustend laag lijkt: de kernel geeft het bewust uit als cache.
$ grep -E 'Cached|SwapTotal' /proc/meminfo # page cache and swap size
Cached: 14711040 kB
SwapTotal: 8388604 kB
Geen van beide illusies is iets wat je aanzet; ze draaien allebei altijd, voor elk proces, onderhouden door de kernel miljoenen keren per seconde. De instelling vm.swappiness die je later tegenkomt is een kleine knop op deze tweede illusie.
2. Waar komt de naam vandaan?
Het woord kernel is een gewoon Engels woord dat is geleend voor een technisch idee. Een kernel is de zachte, essentiele pit in het midden van een noot of vruchtpit, de kern binnen de harde buitenste schil. Informatici kozen het precies om dat beeld: de kleine, essentiele kern van het besturingssysteem, die binnen al het andere zit.
Het contrast dat de naam laat kloppen is de shell. In Unix heet het programma waar je commando's in typt de shell, en die naam is bewust gekozen: het is de buitenste laag die je aanraakt, gewikkeld om de kern die je niet aanraakt. De twee woorden zijn een bijpassend paar uit hetzelfde beeld van een noot.
you type here
|
[ SHELL ] the outer layer: bash, zsh, your programs
[ kernel ] the core inside: talks to the hardware
|
hardware
Zo is de indeling van een Unix-systeem in het eigen vocabulaire vastgelegd. Je leeft en werkt in de shell, de buitenste laag. Daaronder, waar het echte werk met de hardware gebeurt, zit de kernel, de kern. Als mensen zeggen dat een programma "de kernel in duikt", bedoelen ze dat je verzoek van de shell-wereld is overgestoken naar die binnenste kern.
De naam Linux zelf is smaller dan mensen denken. Het is alleen de naam van de kernel, gevormd uit de voornaam van de maker, Linus, plus de Unix-achtige uitgang. Strikt genomen is "Linux" alleen dit ene kernprogramma. Het volledige besturingssysteem eromheen, de shell, de compilers, de dagelijkse commando's, komt grotendeels van het GNU-project, en daarom antwoordt uname -o met GNU/Linux en niet alleen "Linux".
3. Een korte geschiedenis
De Linux-kernel begon als het bijproject van een student en groeide uit tot de meest ingezette software ter wereld. Dat verhaal kennen verklaart een aantal van zijn ontwerpkeuzes.
De achtergrond is Unix, geschreven bij AT&T's Bell Labs vanaf 1969, met zijn idee van een kleine kernel plus veel kleine gereedschappen. Unix was niet gratis, dus in de jaren tachtig zetten twee initiatieven zich in om een vrije vervanging te bouwen. Richard Stallman startte het GNU-project in 1983 en bouwde een volledige set Unix-gereedschappen, maar de eigen kernel ervan was niet klaar. Los daarvan schreef Andrew Tanenbaum Minix, een klein leer-besturingssysteem, zodat studenten de broncode van een echte kernel konden bestuderen.
In 1991 begon een Finse student, Linus Torvalds, gefrustreerd door de licentie van Minix, voor de lol zijn eigen kernel te schrijven. Zijn aankondiging op 25 augustus 1991 is beroemd om hoe bescheiden die was:
"I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones." De hobby werd de kernel die nu het grootste deel van het internet, alle 500 supercomputers uit de Top 500 en elke Android-telefoon draait.
Torvalds bracht de kernel uit onder de GNU GPL, zodat iedereen hem kon lezen, wijzigen en delen. Samen met de al voltooide GNU-gereedschappen vormde dat een compleet vrij besturingssysteem. Duizenden ontwikkelaars sloten zich aan, en het groeide uit tot het grootste samenwerkingsproject in software ooit.
Een vroege discussie bepaalde hoe mensen over de kernel denken. In 1992 noemde Tanenbaum het monolithische ontwerp van Linux publiekelijk verouderd en pleitte in plaats daarvan voor een microkernel. In een monolithische kernel draaien stuurprogramma's en bestandssystemen allemaal samen in kernelruimte; in een microkernel draaien de meeste ervan als losse programma's in gebruikersruimte. Linux bleef monolithisch, voor snelheid en eenvoud, maar voegde laadbare modules toe zodat het geen star blok hoefde te zijn. Die keuze, "monolithisch maar modulair", is vandaag nog steeds het ontwerp.
| Jaar | Mijlpaal |
|---|---|
| 1969 | Unix begint bij Bell Labs en zet het patroon van kleine-kernel-plus-gereedschappen |
| 1983 | Het GNU-project begint een vrij Unix te bouwen, maar mist een voltooide kernel |
| 1991 | Linus Torvalds kondigt de Linux-kernel aan; versie 0.01 volgt in september |
| 1994 | Linux 1.0 komt uit, de eerste versie die als productieklaar geldt |
| 2011 | De versie springt naar 3.0 voor het 20-jarig jubileum, niet voor een grote herschrijving |
| Vandaag | De 6.x-reeks draait op servers, telefoons, auto's, routers en supercomputers |
De versienummers verdienen een kanttekening, want ze verrassen mensen. Sinds de sprong naar 3.0 betekent het eerste getal geen grote herschrijving; Torvalds verhoogt het vooral wanneer het tweede getal ongemakkelijk groot wordt. Een nieuwe stabiele kernel komt nu ongeveer elke negen of tien weken uit. De versie die je draait, zoals 6.11, is gewoon een punt op een gestage, doorlopende lijn.
Niet elke uitgave is bedoeld om te houden, en het verschil is belangrijk als je een kernel kiest. De meeste versies zijn stabiele uitgaven, die maar een paar maanden worden onderhouden. Een paar zijn gemarkeerd als Long-Term Support (LTS) en krijgen jarenlang beveiligingsfixes; op die kernels bouwen distributies voort en die draait bijna elke productieserver. Daarboven zit de mainline, waar Torvalds nieuwe ontwikkeling samenvoegt. In de praktijk jaag je bijna nooit op de nieuwste mainline-kernel: je draait de geteste LTS-kernel die je distributie levert en laat die je de beveiligingspatches aanreiken.
Naar boven4. Eenvoudige gebruiksgevallen
Je "gebruikt" de kernel zelden rechtstreeks, want elk commando doet dat al. Maar er zijn een paar alledaagse dingen die je er wel met naam en toenaam over vraagt, en die beginnen allemaal met lezen, niet met wijzigen.
4.1 Je kernelversie volledig lezen
Het commando uname heeft voor elk stukje systeeminformatie een vlag. Degene die alles afdrukt is -a (kort voor "all"):
$ uname -a
Linux xps 6.11.0-29-generic #29~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC ... x86_64 GNU/Linux
Van links naar rechts gelezen is die regel de kernelnaam, de hostnaam, de release, de buildversie, de CPU-architectuur van de machine, en het besturingssysteem. Elk veld heeft ook een eigen vlag als je er maar een wilt:
| Vlag | Kort voor | Toont |
|---|---|---|
-s |
kernelnaam | Linux |
-r |
kernelrelease | 6.11.0-29-generic |
-v |
kernelversie | buildstring, datum en vlaggen |
-m |
machine | x86_64, de CPU-architectuur |
-o |
besturingssysteem | GNU/Linux |
4.2 Het kernelbestand op schijf bekijken
De hele kernel is een enkel bestand in de map /boot, met de naam vmlinuz gevolgd door de versie. Je kunt het als elk ander bestand tonen:
$ ls -lh /boot/vmlinuz*
-rw------- 1 root root 15M Jun 26 2025 /boot/vmlinuz-6.11.0-29-generic
-rw------- 1 root root 15M Jan 10 2025 /boot/vmlinuz-6.8.0-52-generic
Twee dingen vallen op. Ten eerste is de kernel die je hele machine draait een enkel bestand van maar ongeveer vijftien megabyte. Ten tweede is er meer dan een. Je systeem houdt oudere kernels geinstalleerd zodat je een eerdere kunt opstarten als een nieuwe versie zich misdraagt; in het opstartmenu kies je welke.
4.3 De kernels tonen die je hebt geinstalleerd
Elke geinstalleerde kernel heeft ook een map met zijn modules onder /lib/modules, vernoemd naar zijn versie. Die map tonen is de snelste manier om elke kernel te zien die je systeem kan opstarten:
$ ls /lib/modules
6.8.0-52-generic 6.11.0-28-generic 6.11.0-29-generic
Degene die je draait is wat uname -r meldt. De rest staat klaar als terugval, en daarom laat een kernelupdate je nooit in de steek: de vorige, werkende kernel staat nog op schijf en nog in het opstartmenu.
5. Gemiddelde gebruiksgevallen
Zodra je de kernel kunt lezen, is de volgende stap hem aan het werk zien en de onderdelen bekijken die hij op verzoek laadt. Niets hiervan wijzigt iets; het is allemaal inspectie, en het meeste heeft geen speciale rechten nodig.
5.1 Kernelmodules: de onderdelen die op verzoek laden
Een module is een stuk kernelcode, meestal een apparaatstuurprogramma, dat in de draaiende kernel geladen en weer verwijderd kan worden zonder herstart. Zo ondersteunt een klein kernelbestand duizenden verschillende apparaten: het laadt alleen de stuurprogramma's die je hardware echt nodig heeft. Toon de geladen modules met lsmod ("list modules"):
$ lsmod | head -4
Module Size Used by
tls 155648 0
inet_diag 28672 2 tcp_diag,udp_diag
udp_diag 12288 0
Elke regel is een stuurprogramma of functie die op dit moment in je kernel leeft. Om te weten wat er een is, vraag je het modinfo:
$ modinfo tls
filename: /lib/modules/6.11.0-29-generic/kernel/net/tls/tls.ko.zst
license: Dual BSD/GPL
description: Transport Layer Security Support
De .ko in de bestandsnaam staat voor "kernel object", de vorm die een module op schijf heeft. Op moderne systemen is die gecomprimeerd, vandaar de extra .zst. Modules laden en verwijderen vereist root en gaat met modprobe, dat ook alle modules meeneemt waarvan degene die je vraagt afhankelijk is:
$ sudo modprobe -r tls # remove a module (short for "remove")
$ sudo modprobe tls # load it again, with its dependencies
5.2 De kernel lezen via /proc en /sys
Je las hierboven al /proc/version. Dat bestand staat niet echt op een schijf: het maakt deel uit van procfs, een virtueel bestandssysteem dat de kernel in het geheugen verzint om zijn eigen toestand als gewone bestanden te tonen. Zijn tegenhanger, sysfs op /sys, doet hetzelfde voor apparaten en kernelobjecten. Samen zijn ze de reden dat zoveel van Linux wordt geinspecteerd door simpelweg een bestand te lezen:
$ cat /proc/cpuinfo # every CPU core the kernel sees
$ cat /proc/meminfo # memory totals, straight from the kernel
$ cat /proc/uptime # seconds since the kernel started
$ ls /sys/class/net # network interfaces the kernel knows about
Niets hiervan is een echt bestand dat op een schijf wacht. Elke lezing is een live vraag aan de kernel, ter plekke beantwoord. Gereedschappen als free, top en lscpu zijn, onder de motorkap, gewoon vriendelijke lezers van diezelfde virtuele bestanden.
5.3 Het eigen logboek van de kernel: dmesg
De kernel houdt een doorlopend logboek van zijn eigen meldingen bij in een geheugengebied dat de ring buffer heet: hardware die het detecteerde, stuurprogramma's die het laadde, fouten die het tegenkwam. Je leest het met dmesg ("display message"):
$ dmesg | head # earliest boot messages: CPU, memory, devices
$ sudo dmesg -w # follow new kernel messages live (short for "wait")
$ sudo dmesg -T # show human-readable timestamps
Dit is de eerste plek om te kijken als hardware zich misdraagt. Sluit een USB-stick aan en draai dmesg, en je ziet de kernel het apparaat opmerken, een stuurprogramma laden, en de nieuwe schijf benoemen. Op veel distributies heeft dmesg lezen nu sudo nodig, omdat het logboek details kan onthullen die nuttig zijn voor een aanvaller.
5.4 Een interface voor elk bestandssysteem: het VFS
Linux leest een ext4-schijf, een XFS-schijf, een Btrfs-volume, een FAT-USB-stick en een netwerkschijf over NFS met exact dezelfde commando's. Dat is geen geluk. De kernel heeft een laag die het Virtual File System (VFS) heet en die een gemeenschappelijke interface presenteert, zodat cd, ls, cp en de systeemaanroepen open en read zich identiek gedragen ongeacht welk echt bestandssysteem eronder zit. Elk type bestandssysteem klikt gewoon in het VFS. Je kunt elk type dat je kernel op dit moment begrijpt in nog een virtueel bestand opsommen:
$ cat /proc/filesystems # filesystem types this kernel supports
nodev sysfs
nodev proc
ext4
xfs
btrfs
De markering nodev betekent dat het type geen onderliggend apparaat heeft, zoals het virtuele proc-bestandssysteem; de andere zijn echte formaten op schijf. Het VFS is waarom een Linux-gebruiker zelden hoeft na te denken over welk bestandssysteem hij gebruikt: de kernel verbergt de verschillen achter een uniforme set bestanden, mappen en rechten.
6. Gevorderde gebruiksgevallen
De secties hierboven lezen alleen. Hier bekijk je de precieze verzoeken die programma's aan de kernel doen, verander je hoe de kernel zich gedraagt terwijl hij draait, en zie je hoe een kernel bij het opstarten wordt geconfigureerd. Het eerste hiervan is het meest onthullende wat je kunt doen om een Linux-systeem te begrijpen.
6.1 Systeemaanroepen bekijken met strace
Een systeemaanroep (syscall) is het feitelijke verzoek dat een programma over de grens de kernel in geeft: "open dit bestand", "lees deze bytes", "geef me geheugen". Alles echts wat een programma doet is een of meer syscalls. Het gereedschap strace ("system-call trace") toont ze terwijl ze gebeuren, en verandert het abstracte idee van gebruikersruimte die kernelruimte iets vraagt in iets wat je kunt lezen:
$ strace -e trace=openat,read cat /etc/hostname
openat(AT_FDCWD, "/etc/hostname", O_RDONLY) = 3
read(3, "xps\n", 131072) = 4
xps
Kijk naar wat dit laat zien. Om een piepklein bestand af te drukken, raakte cat de schijf niet zelf aan. Het vroeg de kernel om het bestand te openat, kreeg een getal terug (een file descriptor), en vroeg de kernel toen om er read op te doen. De kernel deed het schijfwerk en gaf de bytes terug. Draai strace op een willekeurig programma en je ziet hetzelfde patroon: een stroom kleine verzoeken over de grens. Dit is wat "alles is een systeemaanroep" echt betekent.
6.2 De draaiende kernel afstellen met sysctl
De kernel toont honderden instelbare opties, kernelparameters genaamd, onder /proc/sys. Het commando sysctl leest en schrijft ze, zodat je het gedrag van de draaiende kernel kunt veranderen zonder herstart:
$ sysctl vm.swappiness # read one setting
vm.swappiness = 60
$ sudo sysctl -w vm.swappiness=10 # change it now (short for "write")
$ sudo sysctl net.ipv4.ip_forward=1 # turn the machine into a router
Een op deze manier gemaakte wijziging houdt stand tot de herstart. Om het blijvend te maken, schrijf je dezelfde regel in een bestand onder /etc/sysctl.d/, en de kernel past het bij elke start toe. Deze parameters bepalen echt gedrag: hoe gretig het systeem swapt, of het netwerkpakketten doorstuurt, hoeveel bestanden er tegelijk open mogen zijn. Ze zijn de ondersteunde manier om een kernel af te stellen, veel veiliger dan er een herbouwen.
6.3 De kernel-opdrachtregel
De bootloader geeft de kernel bij het opstarten een regel met opties, en de kernel onthoudt die. Je kunt precies lezen wat je kernel te horen kreeg met nog een virtueel bestand:
$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-6.11.0-29-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro
Hier vertelt root= de kernel welke schijf het echte bestandssysteem bevat, en ro zegt dat die eerst alleen-lezen moet worden aangekoppeld. Op deze regel voeg je opties toe om een kapotte start te repareren, zoals een herstelmodus afdwingen of een stuurprogramma uitschakelen dat de machine laat vastlopen. Je bewerkt hem eenmalig vanuit het opstartmenu voor een enkele start, of blijvend in de configuratie van de bootloader.
6.4 De kernelfuncties achter containers: namespaces en cgroups
Containers voelen als lichtgewicht virtuele machines, maar er is geen virtuele machine bij betrokken. Docker, Podman en Kubernetes zijn bijna volledig gebouwd uit twee kernelfuncties die je rechtstreeks kunt gebruiken. Namespaces geven een proces zijn eigen prive beeld van een deel van het systeem, zijn eigen proceslijst, netwerk, koppelpunten of hostnaam, zodat het de rest van de machine niet kan zien. Control groups (cgroups) doen het tegenovergestelde werk van beperken en meten: ze begrenzen hoeveel CPU, geheugen en I/O een groep processen mag gebruiken. Bij elkaar is dat alles wat een container werkelijk is: een gewoon proces, afgeschermd door namespaces en begrensd door een cgroup.
$ lsns # list the namespaces in use on the system
$ ls /sys/fs/cgroup # the cgroup tree, exposed by the kernel as files
$ sudo unshare --pid --fork --mount-proc bash # a shell in its own PID namespace
Draai dat laatste commando en typ dan ps: je nieuwe shell ziet bijna geen processen, omdat hij in zijn eigen prive proces-namespace leeft. Er was helemaal geen containerruntime bij betrokken. Dit is wat mensen bedoelen als ze zeggen dat containers "een kernelfunctie zijn, geen product": Docker en Kubernetes zijn handig gereedschap boven op primitieven die de kernel al biedt.
6.5 Een kernel bouwen of bijwerken
Bijna niemand hoeft zijn eigen kernel te compileren, want de distributie levert geteste kernels en werkt ze voor je bij. Maar het kan, en de vorm ervan kennen ontrafelt de kernel: het is een programma dat je net als elk ander uit broncode kunt bouwen, alleen een heel groot.
$ make menuconfig # choose which features and drivers to include
$ make -j$(nproc) # compile, using every CPU core
$ sudo make modules_install install # place the new kernel in /boot
De uitvoer is een vers vmlinuz-bestand en een bijpassende modulemap, toegevoegd naast degene die je al hebt. In het dagelijks leven krijg je hetzelfde resultaat veel veiliger door je pakketbeheerder een nieuwere kernel te laten installeren en er dan naar te herstarten, met de oude er nog om op terug te vallen.
7. Wat de meeste gebruikers niet weten
7.1 De hele kernel is een klein bestand
Het is makkelijk om je de kernel als iets enorms en uitgestrekts voor te stellen. Het is een enkel bestand van ongeveer vijftien megabyte in /boot, met de naam vmlinuz. De naam zelf vertelt een verhaal: vm omdat het virtueel geheugen ondersteunt, linu voor Linux, en een afsluitende z omdat het bestand gecomprimeerd is. Bij het opstarten pakt de kernel zichzelf uit in het geheugen, en vanaf dan heeft dat ene bescheiden bestand volledige zeggenschap over een machine met gigabytes RAM en tientallen apparaten. Al het andere op schijf is gewoon programma's en data die dit ene bestand wil draaien.
7.2 Bijna alles wat je doet is een systeemaanroep
Het strace-voorbeeld was een glimp van een diepere waarheid: programma's in gebruikersruimte kunnen niets echts uit zichzelf doen. Tekst afdrukken, een bestand aanmaken, een netwerkverbinding openen, een ander programma starten, de klok lezen, dit zijn allemaal systeemaanroepen, verzoeken aan de kernel. Er zijn er maar een paar honderd, en die korte lijst is het volledige vocabulaire waarin elk programma op het systeem om wat dan ook vraagt. Als je begrijpt dat een programma gewoon een reeks berekeningen is, onderbroken door syscalls, is de hele machine niet langer mysterieus.
7.3 De kernel "draait" niet zoals een programma
Je ziet de kernel nooit in een lijst met processen, want het is geen proces. Het heeft geen plek in de ps-uitvoer zoals een dienst dat heeft. In plaats daarvan zit de kernel stil tot iets hem aanroept: een programma doet een systeemaanroep, of een apparaat werpt een interrupt op, en de CPU schakelt naar kernelmodus, draait de relevante kernelcode, en schakelt terug. De kernel is minder een programma dat draait en meer een lichaam van code dat wordt betreden, zijn werk doet, en weer wordt verlaten, miljoenen keren per seconde. Daarom kan het alles beheren zonder ooit als een draaiende taak te verschijnen.
7.4 Modules zijn kernelcode die laadt terwijl je werkt
Als je een webcam aansluit en die gewoon werkt, heeft de kernel zojuist een stuurprogramma in zichzelf geladen, live, zonder herstart. Dat laadbare stuurprogramma is een module, en het draait met dezelfde volledige macht als de rest van de kernel; er is geen veiligheidshek tussen een module en de kern zodra die is geladen. Dit is de opbrengst van het "monolithisch maar modulair"-ontwerp uit de geschiedenissectie: de kernel blijft klein op schijf door de duizenden stuurprogramma's die het nodig zou kunnen hebben als losse modulebestanden te bewaren, en alleen die binnen te halen waar je feitelijke hardware om vraagt.
7.5 Je hebt vrijwel zeker meerdere kernels klaarstaan
Elke kernelupdate laat de vorige kernel geinstalleerd. Na verloop van tijd verzamel je er een klein stapeltje van in /boot en /lib/modules, en het opstartmenu biedt ze stilletjes allemaal aan. Dit is een bewust vangnet, geen rommel: als een nieuwe kernel niet opstart of een stuurprogramma breekt, herstart je, kies je de vorige uit het menu, en werk je binnen enkele seconden weer. Het is veruit de beste reden dat kernelupgrades op Linux zo weinig risico hebben, en het is waarom je oude kernels voorzichtig moet opruimen, met minstens een bekende, werkende terugval.
7.6 "Linux" is alleen de kernel
Het ding dat dit hele artikel beschrijft, de kernel, is het enige deel dat strikt Linux heet. De shell waar je in typt, de commando's ls en cat en grep, de compiler, de C-bibliotheek: niets daarvan is Linux. Ze komen grotendeels van GNU en andere projecten, en ze zijn hetzelfde op veel besturingssystemen. Linux is de kern waar ze allemaal op rusten. Daarom is de zorgvuldige naam voor het hele systeem GNU/Linux, en daarom antwoordt je kernel, gevraagd naar zijn besturingssysteem met uname -o, met precies dat namenpaar.
8. Beste praktijken
- Houd je kernel bijgewerkt. Beveiligingsfixes voor het meest bevoorrechte programma op de machine komen als kernelupdates. Laat je pakketbeheerder ze installeren en herstart als erom gevraagd wordt; de oude kernel blijft als terugval.
- Kies een LTS-kernel voor servers. Long-Term Support-kernels krijgen jarenlang beveiligingsfixes; op een productiemachine achter de nieuwste mainline-uitgave aanjagen ruilt stabiliteit in voor functies die je zelden nodig hebt.
- Houd altijd minstens een oudere kernel geinstalleerd. Als je
/bootopruimt, verwijder dan nooit elke vorige versie. Een bekende, werkende kernel in het opstartmenu maakt van een mislukte upgrade een herstel van twee minuten. - Stel af met
sysctl, herbouw niet. Bijna alles wat je zou willen veranderen is een kernelparameter onder/proc/sys. Grijp naarsysctlen/etc/sysctl.d/lang voordat je een kernel overweegt te compileren. - Maak kernelinstellingen blijvend in
/etc/sysctl.d/. Een wijziging metsysctl -wgaat verloren bij de herstart. Zet het in een bestand daar zodat de kernel het bij elke start opnieuw toepast. - Lees eerst
dmesgbij hardwareproblemen. Kijk voordat je gokt naar wat de kernel zelf meldde. Nieuw aangesloten apparaten, falende schijven en stuurprogrammafouten verschijnen daar allemaal. - Leer een systeemaanroep-trace lezen. Als een programma zonder duidelijke reden faalt, toont
stracevaak de precieze syscall die een fout teruggaf, wat een mysterie verandert in een specifiek ontbrekend bestand of geweigerde toestemming. - Blijf bij de kernels van je distributie. Die zijn voor jouw systeem gebouwd, ondertekend en getest. Een eigen kernel is een onderhoudslast die je zelf op je neemt, alleen de moeite waard voor speciale hardware of echte expertise.
- Lees de documentatie. De kernel is uitgebreid gedocumenteerd.
man uname,man sysctl,man dmesg, en de eigen documentatie van de kernel op kernel.org/doc zijn de referentie.
$ man uname # reading system and kernel identity
$ man modprobe # loading and removing kernel modules
$ man sysctl # reading and writing kernel parameters
$ man dmesg # the kernel ring buffer
Naar boven9. Veelgemaakte fouten
9.1 Mythe versus werkelijkheid
| Mythe | Werkelijkheid |
|---|---|
| "Linux is een compleet besturingssysteem." | Linux is alleen de kernel. De shell, de commando's en de bibliotheken zijn losse projecten, meestal GNU, vandaar "GNU/Linux". |
"De kernel is een draaiend programma dat ik in ps kan zien." |
Het is geen proces. De CPU betreedt kernelcode bij een systeemaanroep of interrupt en verlaat die weer; het verschijnt nooit als taak. |
| "Programma's lezen zelf de schijf en het geheugen." | Dat kunnen ze niet. Elke echte actie is een systeemaanroep die de kernel iets vraagt, en die doet het werk namens hen. |
| "Om het gedrag van de kernel te veranderen moet je hem hercompileren." | Honderden opties zijn live parameters. sysctl verandert de meeste zonder herstart, laat staan een herbouw. |
| "De kernel bijwerken vervangt de oude." | De vorige kernel blijft met opzet geinstalleerd en opstartbaar, zodat een slechte update makkelijk vanuit het opstartmenu ongedaan te maken is. |
| "Een hoger eerste versienummer betekent een grote herschrijving." | Sinds 3.0 wordt het hoofdnummer vooral verhoogd om het subnummer klein te houden, niet om een herschrijving aan te geven. |
| "Containers zijn een functie van Docker." | Containers zijn gebouwd uit kernel-namespaces en cgroups. Docker en Kubernetes orkestreren alleen functies die de kernel al biedt. |
9.2 Andere valkuilen om te vermijden
- Alle oude kernels verwijderen om ruimte vrij te maken. Verwijder oude versies voorzichtig en houd altijd minstens een vorige kernel, anders kan een mislukte upgrade je zonder manier om op te starten achterlaten.
- Een
sysctl-wijziging maken en verwachten dat die een herstart overleeft. Een live wijziging met-wis tijdelijk. Schrijf hem in/etc/sysctl.d/om hem blijvend te maken. - Kernelversie verwarren met distributieversie. Ubuntu 24.04 en de kernel
6.11zijn twee verschillende dingen.uname -rgeeft de kernel;/etc/os-releasegeeft de distributie. - Een eigen kernel compileren zonder terugval. Laat de werkende distributiekernel altijd geinstalleerd en in het opstartmenu, zodat een kapotte eigen build geen dode machine is.
- Aannemen dat de kernel alleen naar
/var/loglogt. De eigen live buffer van de kernel isdmesg. Tekstlogboeken worden er achteraf uit weggeschreven; de buffer is de bron. - Een module laden die voor een andere kernel is gebouwd. Modules zijn gebonden aan de exacte kernelversie waarvoor ze zijn gebouwd, en daarom heeft elke kernel zijn eigen
/lib/modules-map.
10. Samenvatting
De kernel is de kern van een Linux-systeem: het enige programma dat de hardware mag aanraken, de scheidsrechter die de CPU, het geheugen, de schijven en het netwerk veilig deelt onder al het andere, en het deel dat echt Linux heet. Alles wat je draait is een gast die deze kern om hulp vraagt, een systeemaanroep tegelijk. Zie het zo en de hele machine wordt iets waarover je kunt redeneren.
- De kernel is het centrale programma van het besturingssysteem, dat draait in de bevoorrechte kernelmodus terwijl elk ander programma afgeschermd in gebruikersmodus draait.
- Zijn taken zijn processen plannen, geheugen beheren, bestandssystemen en apparaatstuurprogramma's draaien, netwerken afhandelen, en systeemaanroepen beantwoorden.
- De naam betekent de kern binnen de shell; Linux is alleen de kernel, en daarom heet het volledige systeem GNU/Linux.
- Het begon als de hobby van Linus Torvalds in 1991, is monolithisch maar modulair, en draait nu op vrijwel alles, met elke paar weken een nieuwe stabiele uitgave.
- Je leest hem met
uname,/proc/version, en het enkelevmlinuz-bestand in/boot, en je houdt meerdere kernels geinstalleerd als terugval. - Modules zijn stuurprogramma's die op verzoek in de draaiende kernel worden geladen; bekijk ze met
lsmodenmodinfo, beheer ze metmodprobe. - procfs (
/proc) en sysfs (/sys) tonen de toestand van de kernel als virtuele bestanden, endmesgtoont zijn eigen meldingenbuffer. straceonthult de systeemaanroepen die een programma doet;sysctlstelt de draaiende kernel af;/proc/cmdlinetoont hoe hij is opgestart.- Het houdt twee constante illusies draaiende: planning geeft elk proces een eerlijk deel van de CPU via context switching, en virtueel geheugen geeft elk zijn eigen prive adresruimte, met paging en caching achter de schermen.
- Het VFS biedt een interface over elk bestandssysteem, en namespaces plus cgroups zijn de kernelfuncties waaruit containers zoals Docker zijn gebouwd.
- Kernels komen uit als kortlevende stabiele uitgaven en meerjarige LTS-uitgaven; productiesystemen draaien de LTS-kernel die hun distributie levert.
- De kernel is geen proces dat je kunt zien; de CPU betreedt hem bij een syscall of interrupt en verlaat hem weer, miljoenen keren per seconde.
Dit is de handige naslag om te bewaren:
uname -r the kernel version you are running
uname -a kernel, host, release, arch, and OS in one line
cat /proc/version who built the kernel, and with what
ls /boot/vmlinuz* the kernel image files on disk
ls /lib/modules every installed kernel, by version
lsmod modules loaded in the kernel right now
modinfo NAME what one module is and where it lives
sudo modprobe NAME load a module and its dependencies
cat /proc/cpuinfo CPUs the kernel sees
cat /proc/meminfo memory, straight from the kernel
dmesg -T the kernel's own log, with timestamps
strace -e trace=openat CMD watch a program's system calls
sysctl NAME read a kernel parameter
sudo sysctl -w NAME=VAL change the live kernel
cat /proc/cmdline the options the kernel was booted with
nice -n 10 CMD run a command at low CPU priority
cat /proc/filesystems filesystem types the kernel supports
lsns list the kernel namespaces in use
ls /sys/fs/cgroup the cgroup resource-control tree
Een machine waarvan de kernel actueel wordt gehouden, wordt afgesteld met de ondersteunde parameters in plaats van riskante herbouws, en goed genoeg wordt begrepen om zijn eigen logboeken en systeemaanroepen te lezen, is een machine die zich voorspelbaar gedraagt en snel herstelt als er iets misgaat. Als je servers kernels draaien die niemand in jaren heeft bijgewerkt, in paniek raken bij een slechte upgrade omdat er geen terugval is bewaard, of hardwarefouten opwerpen die niemand kan lezen, dan is het de moeite waard om de kern van het systeem goed op te zetten en te begrijpen, zodat het fundament waarop al het andere staat solide is.
Naar boven

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.


