Linux-Praxisbuch/ Was ist der Kernel?

< Linux-Praxisbuch

Der Kernel als Vermittler

Bearbeiten

Der Kernel verwaltet alle Betriebsmittel eines Computers. Er ist der erste Schritt von der Hardware zum Benutzer. Nach innen, zur Hardware hin, ist der Kernel ein Organisator. Er teilt den unterschiedlichen Geräten mit, was sie wann zu tun haben und sorgt für möglichst reibungslose, effiziente Abläufe. Nach außen, zum Benutzer hin, ist er ein Dienstleister: Er bietet Funktionen an, die von Programmen verwendet werden können. Programme verlangen Prozessorzeit, Speicherplatz, möchten von Geräten lesen oder auf sie schreiben, sie wollen andere Programme starten oder sich selbst beenden. Für all diese Aktionen müssen sie eine Anfrage an den Kernel richten, die von diesem an die Hardware weitergegeben oder auch verweigert werden kann.

Der Kernel selbst ist ein Programm. Er liegt im Hauptspeicher, erhält dann und wann Prozessorzeit und kontrolliert in diesen Intervallen, welches Programm außer ihm etwas tun darf. Mit dem Systemstart muss der Kernel also in den Speicher geladen werden. Dies geschieht üblicherweise mittels eines Bootloaders wie Lilo oder Grub von der lokalen Festplatte. Es gibt jedoch auch andere Möglichkeiten. Booten von Diskette oder CD ist ebenso möglich wie das Booten über ein Netzwerk.

Um mit der Hardware kommunizieren zu können, benötigt ein Kernel spezielle Treiber. Des Weiteren bestehen meist sehr konkrete Anforderungen an ein Rechnersystem - und diese Anforderungen können sich von System zu System stark unterscheiden. Benötigte Treiber und die konkreten Anforderungen an das System verlangen nach ganz unterschiedlichen Kernelfunktionen. Daher ist nicht Kernel gleich Kernel. Es wäre unsinnig, einen einzigen großen Kernel zu erstellen, der gewissermaßen alles kann. Ein enormer Speicherbedarf wäre die Folge. Es ist also eine Auswahl der Treiber und Funktionen notwendig.

Diese Auswahl geschieht unter Linux auf zweierlei Weise. Zum einen kann bereits vor dem Kompilieren des Kernels angegeben werden, welche Komponenten überhaupt Bestandteil des Kernels werden sollen. Zweitens bietet Linux die Möglichkeit, einzelne Komponenten als Module zu kompilieren. Module können dann zur Laufzeit geladen und wieder aus dem Speicher entfernt werden.

Was der Kernel nicht ist

Bearbeiten

Als Kernel bezeichnet man das Betriebssystem im engeren Sinne, ohne zugehörige Systemsoftware, Bibliotheken oder Anwendungssoftware. Die Linux-Entwickler haben in den meisten Fällen großen Wert darauf gelegt, die Funktionalität des Kernels nicht allzu weit über diese Vermittlerrolle hinauswachsen zu lassen. Die strikte Beschränkung auf die wesentlichen Funktionen eines Betriebssystems spiegelt sich beispielsweise darin, dass die grafische Oberfläche unter Linux, das X Window System, völlig unabhängig vom Linux-Kernel entwickelt wird - etwa im Unterschied zu Microsoft Windows, in dem Betriebssystem und grafische Oberfläche sehr eng miteinander gekoppelt sind. Auch wenn der Linux-Kernel im Laufe der Jahre im Umfang sehr gewachsen ist, sind diese Zuwächse doch meist auf die Unterstützung zusätzlicher Hardware, neuer Plattformen und die Ausnutzung weiterer Hardwarefunktionen zurückzuführen.



Die Kernelversionen

Bearbeiten

Einem Kernel ist eine Version zugeordnet, über die man in Erfahrung bringen kann, welchen Entwicklungsstand das aktuell installierte System entspricht. Diese Version kann über das uname-Kommando erfragt werden:

  $uname -a
  Linux dhcppc3 2.6.5-7.108-smp #1 SMP Wed Aug 25 13:34:40 UTC 2004 i686 i686 i386 GNU/Linux

In diesem Fall handelt es sich um den Kernel 2.6.5. Die Vergabe von Kernelversionen folgt einem bestimmten Schema. Die erste Ziffer, in diesem Fall die 2, ist bereits seit vielen Jahren unverändert geblieben. Darin drückt sich aus, dass es keine architektonischen Änderungen gegeben hat, die den Kernel insgesamt betreffen. Die zweite Ziffer, hier die 6, beinhaltet eine wichtige Information. Wenn diese Ziffer gerade ist, so handelt es sich um einen sogenannten stabilen Kernel. Die Entwickler setzen alles daran, dass solche Kernelversionen möglichst frei von Fehlern sind. Beim Einsatz eines produktiven Systems sollte darauf geachtet werden, einen solchen stabilen Kernel einzusetzen. In der Regel erscheint im Abstand von 2-3 Jahren eine neue stabile Kernelserie. Die sogenannten Entwicklerkernel tragen hier eine ungerade Versionsziffer. Sie dienen der Vorbereitung der nächsten stabilen Serie, werden aber meist nur von den Entwicklern und Testern selbst verwendet, um neue Funktionen zu integrieren. Die letzte Ziffer schließlich, hier die 5, ist eine laufende Nummer, die bei Fehlerkorrekturen oder kleinen Verbesserungen hochgezählt wird. Umfangreiche neue Funktionalitäten werden hier in der Regel nicht integriert.

Gelegentlich kann es sinnvoll oder notwendig sein, einen aktuelleren Kernel zu installieren - etwa aus Sicherheitsgründen, zum Zwecke der Einbindung aktueller Hardware oder aus Performancegründen. Viele Distributoren bieten mittlerweile kompilierte Kernelpakete der jeweils aktuellen Kernelversion zum Download an. Die Installationsmethoden können sich dabei unterscheiden, und die Installationsanweisungen sollten gut beachtet werden. Es ist aber auch möglich, den aktuellen Quellcode des Kernels herunterzuladen und den Kernel selbst zu konfigurieren und zu kompilieren. Dieser Prozess erfordert einige Kenntnisse über die vorhandene Hardware und den Vorgang der Kernel-Konfiguration. Liegt kein besonderer Grund vor, so ist ein Upgrade des Kernels normalerweise unnötig. Dennoch soll im Folgenden die Konfiguration eines Kernel in ihren Grundzügen beschrieben werden.

Erzeugen eines eigenen Kernels

Bearbeiten

Voraussetzungen

Bearbeiten

Um einen eigenen Kernel zu übersetzen, brauchen Sie einen C-Compiler, der die Quelltexte ins Binärformat übersetzt. Ob der C-Compiler installiert ist, erfahren Sie mit dem folgenden Befehl:

 root@linux # gcc --version 

oder

 root@linux # cc --version 

Nach Eingabe dieses Befehls sollte die Versionsnummer auf dem Schirm erscheinen.

Holen der Kernel-Quellen

Bearbeiten

Nun brauchen Sie noch die aktuellen Kernel-Quellen. Die Quellen des unveränderten Original-Kernels finden Sie auf http://www.kernel.org. Schauen Sie auch auf der Downloadseite ihres Distributors, der oft eigene (angepaßte) Versionen des Kernels im RPM- oder DEB-Format bereitstellt.

Die Quelltexte des Kernels sollten Sie in /usr/src entpacken (bei der Installation eines Paketes wird das bereits oft automatisch erledigt).

Wechseln Sie in das Verzeichnis /usr/src, um zu schauen, ob ein Verzeichnis linux-<kernelversion> existiert. Wenn ja, kann es auch schon los gehen.

Wenn Sie die aktuelle Version des Originalkernels von www.kernel.org heruntergeladen haben, kopieren Sie die Datei linux-2.x.xx.tar.bz2 in das Verzeichnis /usr/src und entpacken Sie das Archiv mit dem folgenden Befehl:

 root@linux /usr/src# tar jvxf linux-2.x.xx.tar.bz2 

Nach dem Entpacken ist das Verzeichnis /usr/src/linux-<kernelversion> entstanden.

Beachten Sie beim Download, daß es stable als auch Entwickler Kernel gibt. Siehe Kapitel Die Kernelversionen.

Konfiguration des Kernels

Bearbeiten

Sie haben im Wesentlichen drei Möglichkeiten, einen neuen Kernel zu konfigurieren. make config ist die einfachste aber nicht die beste von allen: Innerhalb des Konsolenfensters werden dem Benutzer Fragen gestellt, die er einzeln beantworten muss. Da dies mit der Zeit sehr umfangreich und unübersichtlich geworden ist, ist diese Methode nicht zu empfehlen. make menuconfig stellt ein grafisches Menü in einer Konsole bereit. In diesem Menü kann man Konfigurationsoptionen auswählen. Meistens werden die Möglichkeiten [X] [ ] [M] (aktiviert, deaktiviert und als Kernelmodul kompiliert) angeboten. Um diesen Weg zu nutzen, benötigt Ihr System die ncurses-Bibliothek, die jedoch von den meisten Distributionen von ganz allein installiert wird. make xconfig bietet ebenfalls ein Auswahlmenü an, aber unter der X-Window-Oberfläche. Hierzu müssen Sie Tcl/Tk installiert haben.

 

make menuconfig in Aktion

Schauen Sie sich zunächst genau die Auswahloptionen an und vergleichen Sie, welche Hardware Sie in ihrem Computer haben (eventuell schauen Sie auch einmal in die Ausgaben der Befehle lspci und dmesg). Schauen Sie ggf. auf der Homepage des Herstellers nach, ob Sie eine Dokumentation zu Ihrer Hardware finden.

Nachdem Sie die Auswahlentscheidungen getroffen haben, können Sie Ihre Konfiguration speichern. Die Konfiguration wird dann in die Datei

 /usr/src/linux-<kernelversion>/.config 

geschrieben.

Übersetzung des Kernels

Bearbeiten

(Dies funktioniert nicht mit SuSE Linux 9.3) Nach der Konfiguration erfolgt die Übersetzung mit den Befehlen:

 root@linux # make dep 
 root@linux # make clean 
 root@linux # make bzImage 
 root@linux # make modules 
 root@linux # make modules_install 

Beim Kernel 2.6 hat sich dies jedoch geändert:

 root@linux # make 
 root@linux # make modules_install

Installation des Kernels

Bearbeiten

Nach dem Kompilieren (die Kompilierungszeit ist abhängig von der Rechenleistung und kann mehrere Stunden oder auch nur einige Minuten dauern) kopieren Sie den Kernel in Ihre Boot-Partition bzw. Ihr /boot-Verzeichnis. Sichern Sie bitte vorher den funktionierenden Kernel! Eine Befehlsfolge könnte etwa wie folgt aussehen:

 root@linux # cp /boot/vmlinuz /boot/vmlinuz.old 
 root@linux # cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz 
 root@linux # cp /usr/src/linux/System.map /boot/System.map-<kernelversion> 

Die exakte Versionsbezeichnung Ihres neu kompilierten Kernels teilt Ihnen die Datei /usr/src/linux/include/linux/version.h unter der Definition der UTS-RELEASE mit. Dies ist insbesondere dann wichtig, wenn Ihr Kernel eine besondere Namensgebung wie z.B. 2.6.0-64GB-SMP aufweist. Programme, welche die Datei System.map benötigen, suchen nach einer Datei mit dem Namen System.map-<kernelversion> und verwenden dabei exakt den in der version.h Datei definierten Namen. Für Ihr laufendes System können Sie die richtige Versionsbezeichung mittels

 root@linux # uname -r 

in Erfahrung bringen.

Um den neuen Kernel booten zu können, müssen Sie dem Bootloader noch mitteilen, wo er den neuen Kernel findet.

Öffnen Sie bei Verwendung von LILO die Datei /etc/lilo.conf mit einem Texteditor und fügen Sie Einträge der Form /etc/lilo.conf

 ...
 # Neuer Kernel:
 image = /boot/vmlinuz
 label = kernel_new
 
 # Backup-Kernel:
 image = /boot/vmlinuz.old
 label = kernel_old
 ...
    

hinzu. Nun führen Sie noch als root /sbin/lilo aus. Öffnen Sie bei Verwendung von GRUB die Datei /boot/grub/grub.conf mit einem Texteditor und fügen Sie Einträge der Form

 ...
 title           Neuer Kernel
 root            (hd0,0)
 kernel          /boot/vmlinuz
 title           Alter Kernel
 root            (hd0,0)
 kernel          /boot/vmlinuz.old
 ...

hinzu - und fertig. Noch einfacher geht es auf Debian-Systemen. Führen sie dort einfach update-grub aus.

Starten des neuen Kernels

Bearbeiten

Nun können Sie ihren neuen Kernel booten. Geben Sie dazu als root

 root@linux # reboot 

oder

 root@linux # shutdown -r now 

ein. Beim Erscheinen des Bootmenüs wählen Sie den Eintrag mit dem neuen Kernel aus. Damit bootet der Computer mit Ihrem neuen Kernel.

Sollte der Computer aus irgendwelchen Gründen nicht booten, so schauen Sie sich die Fehlermeldungen genau an, sie geben Aufschluß über die Ursachen. Starten Sie in diesem Fall Ihren Computer neu und booten Sie ihn dann mit dem alten Kernel. Sie finden die Fehlermeldungen, falls sie nicht ohnehin auf der Konsole ausgegeben wurden, in der Datei /var/log/messages.

Literatur

Bearbeiten