Einleitung
Der Betriebssystem-Kernel ist das Herzstück eines jeden Computersystems. Er sorgt dafür, dass Programme und Hardware reibungslos zusammenarbeiten. Anwendungen wie Browser oder Textverarbeitungsprogramme sprechen nicht direkt mit Prozessor, Speicher oder Festplatte, sondern über den Kernel. Er übernimmt zentrale Aufgaben wie die Verwaltung von Prozessen (Start, Steuerung und Beendigung von Programmen), die Organisation des Arbeitsspeichers und die Kommunikation mit Geräten über Treiber. Dadurch ist es möglich, dass mehrere Programme gleichzeitig sicher und effizient laufen. Der Kernel bildet somit die Basis, auf der alles andere im System aufbaut – ohne ihn wäre ein Computer nicht arbeitsfähig.
Besonders interessant wird der Kernel, wenn man ihn nicht nur benutzen, sondern auch verändern kann. Beim Windows-Kernel ist das nicht möglich, beim Linux-Kernel hingegen schon: Der Quellcode ist frei verfügbar und man kann den Kernel selbst kompilieren, also neu bauen, und dabei Funktionen gezielt hinzufügen, entfernen oder anpassen. Dadurch wird erlebbar, wie flexibel ein Kernel sein kann und wie stark er die Funktionalität eines Computers bestimmt.
Um diese Flexibilität nachvollziehbar zu machen, eignet sich das Beispiel der Dateisysteme. Immer wenn ein USB-Stick, eine Festplatte oder eine SD-Karte eingebunden wird, muss der Kernel wissen, wie die darauf gespeicherten Daten organisiert sind. Dafür sind Dateisystemtreiber zuständig. Anhand dieses Beispiels kann man sehr anschaulich erkennen, wie der Kernel Funktionen bereitstellt und wie er sich durch Konfiguration und Kompilierung beeinflussen lässt, um bestimmte Dinge zu ermöglichen oder zu verhindern.
Treiber für Dateisysteme im Linux-Kernel
Damit ein Betriebssystem auf Daten zugreifen kann, muss es deren Organisation auf dem Speichermedium kennen. Genau hier kommen die Dateisysteme ins Spiel: Sie legen fest, wie Dateien benannt, gespeichert, gesucht und wiedergefunden werden. Bekannte Beispiele sind FAT
, exFAT
, NTFS
oder ext4
.
Der Kernel selbst versteht diese Dateisysteme jedoch nicht automatisch. Stattdessen benötigt er Treiber, die wie Dolmetscher zwischen der abstrakten Dateiverwaltung des Betriebssystems und der konkreten Struktur auf dem Datenträger vermitteln. In Linux sind solche Treiber meistens modular aufgebaut, das heißt, sie können entweder fest in den Kernel kompiliert oder bei Bedarf als Kernelmodul nachgeladen werden.
Beispiel: USB-Stick im System
Wenn ein neues Gerät angeschlossen wird, erkennt das System zwar dessen Vorhandensein, doch kann das Gerät erst mit einem passenden Gerätetreiber aktiv genutzt werden.
lsblk - list block devices
Mit dem Befehl lsblk
können alle erkannten Blockgeräte samt ihrer Struktur (Partitionen, Dateisysteme, Mountpoints) angezeigt werden.
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
└─sda1 exfat 1.0 STICK 9635-F212
sr0
nvme0n1
├─nvme0n1p1
├─nvme0n1p2 vfat FAT16 FB2D-C04A 967,4M 1% /boot/efi
├─nvme0n1p3 ext4 1.0 f50927f8-9bd6-4128-b698-73bc1f1071c2 19,9G 5% /
└─nvme0n1p4 swap 1 2f775c77-df25-4053-9511-1198775874dc [SWAP]
Die Ausgabe von lsblk -f
besteht aus den folgenden Spalten:
- NAME → Gerätename im System (z. B.
sda1
für die erste Partition auf dem Gerätsda
). - FSTYPE → Typ des Dateisystems (z. B.
exfat
,ext4
,vfat
). - FSVER → Versionsinformation des Dateisystems (falls verfügbar).
- LABEL → Vom Nutzer vergebener Name des Dateisystems oder Mediums (z. B.
STICK
). - UUID → Eindeutige Kennung des Dateisystems, wird oft in
/etc/fstab
verwendet. - FSAVAIL → Freier Speicherplatz auf dem Dateisystem.
- FSUSE% → Belegter Speicherplatz in Prozent.
- MOUNTPOINTS → Verzeichnisse, an denen das Dateisystem gerade eingebunden ist (oder leer, wenn nicht gemountet).
lsmod - list (kernel) modules
Mit dem Befehl lsmod
lässt sich anzeigen, welche Kernelmodule aktuell geladen sind. Ein Kernelmodul ist ein Stück Code, das den Kernel um bestimmte Funktionen, wie etwa die Unterstützung für ein Dateisystem oder ein Gerät, erweitert:
$ /sbin/lsmod | grep fat
vfat 24576 1
fat 90112 1 vfat
Die Ausgabe von lsmod
besteht aus drei Spalten:
- Module → Name des Moduls (z. B.
exfat
,vfat
,fat
) - Size → Speicherbedarf des Moduls (für die Praxis weniger wichtig)
- Used by → Wie oft das Modul verwendet wird und ggf. von welchen anderen Modulen
mount - Dateisystem einhängen
Der Befehl mount
stammt vom englischen Verb "to mount" und bedeutet "einbinden, befestigen". Er verbindet ein Dateisystem mit einem Verzeichnis im System, das als Mountpoint
bezeichnet wird.
Zunächst muss der Mountpoint im Verzeichnisbaum erstellt werden:
# mkdir /mnt/usb
Anschließend kann der USB-Stick im Mountpoint /mnt/usb
gemountet werden:
# mount /dev/sda1 /mnt/usb/
Mit dem Befehl lsmod
wird nun das geladene Kernel-Modul exfat
angezeigt. Der Used by
Zähler (1) zeigt an, dass das Modul aktuell eingebunden und in Verwendung ist:
# lsmod | grep fat
exfat 90112 1
vfat 24576 1
fat 90112 1 vfat
Ein erneut ausgeführtes lsblk -f
bestätigt das Einhängen der Partition sda1
am Mountpoint /mnt/usb
:
# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
└─sda1 exfat 1.0 STICK 9635-F212 114,6G 0% /mnt/usb
umount - Dateisystem aushängen
Mit dem Befehl umount /mnt/usb/
wird der USB-Stick wieder aus dem System ausgehängt:
# umount /mnt/usb/
Nachdem der USB-Stick wieder ausgehängt wurde, ist das Modul exfat
zwar noch geladen, wird aber nicht mehr verwendet. Das ist in der Spalte Used by
an dem Wert 0 zu erkennen. Die Module vfat
und fat
bleiben dagegen weiterhin in Benutzung:
# lsmod | grep fat
exfat 90112 0
vfat 24576 1
fat 90112 1 vfat
modprobe - Laden und Entladen von Kernel-Modulen
Der Befehl modprobe
setzt sich aus "module" und "probe" zusammen. Er lädt oder entfernt Kernelmodule und berücksichtigt dabei automatisch Abhängigkeiten.
Der Parameter -r
(remove) entfernt Kernel-Module, sofern sie nicht mehr in Verwendung sind:
# /sbin/modprobe -r exfat
Damit sind wir wieder am Ausgangszustand angekommen, was ein erneutes lsmod
bestätigt:
$ lsmod | grep fat
vfat 24576 1
fat 90112 1 vfat
Dynamisch geladen oder fest integriert?
In dem obigen Beispiel wurde ein modularer Treiber besprochen, der dynamisch zur Laufzeit von udev
automatisch in den Kernel eingebunden oder auch wieder entfernt werden kann. Die meisten Treiber in Linux sind so aufgebaut. Es gibt jedoch auch eine Fülle elementarer Treiber, die fest in den Kernel "eingebacken" sind. Sie werden immer geladen, sobald der Kernel startet. Dazu gehören beispielsweise das Root-Dateisystem oder grundlegende Controller, ohne die der Rechner gar nicht starten würde. Diese Treiber können nicht entfernt werden, ohne dass der Kernel neu kompiliert wird.
udev - Userspace /dev
udev
ist ein Gerätemanager für den Linux-Kernel. Er erstellt und verwaltet die Gerätedateien im Verzeichnis /dev
. Gleichzeitig verarbeitet udev
alle Ereignisse im Userspace
, die beim Hinzufügen oder Entfernen von Hardwaregeräten auftreten. Er reagiert auf Kernel-Ereignisse (z. B. wenn ein neues Gerät eingesteckt wird) und lädt über modprobe
automatisch die passenden Kernelmodule. Wenn beispielsweise ein USB-Stick angeschlossen wird, fordert der Kernel das Modul usb_storage
an und udev
erzeugt die Gerätedatei /dev/sda
.