Wiki

Kernel

Dies ist eine statische Version des ubuntuusers-Wikis. Es kann nicht editiert werden.

Kernel

Ein Betriebssystemkern oder Systemkern (engl. kernel) ist der zentrale Bestandteil eines Betriebssystems. In ihm ist die Prozess- und Datenorganisation festgelegt, auf der alle weiteren Softwarebestandteile des Betriebssystems aufbauen. Gängige Anforderungen an einen Systemkern sind Parallelverarbeitung verschiedener Aufgaben (Multitasking), Einhaltung zeitkritischer Grenzen, Offenheit für unterschiedlichste Anwendungen und Erweiterungen. (aus der Wikipedia {de} )

Kernel installieren

Bei der Installation von Ubuntu wird selbstverständlich automatisch ein Kernel installiert. Ohne diesen wäre das ganze System nicht lauffähig. Unter Ubuntu werden Kernels wie normale Software auch über die Paketverwaltung installiert [1]. Die entsprechenden Paketnamen heissen immer

  • linux-image-VERSION-SUBVERSION-ARCHITEKTUR

bzw. als konkretes Beispiel

  • linux-image-2.6.15-25-386

Aber Achtung. Einen Kernel sollte man immer über die Metapakete wie

  • linux-386

installieren, so wird gewährleistet, dass bei einem Update immer die passenden Module und Kernel Header Dateien installiert werden. Bei der Installation eines Kernels wird dieser auch automatisch in den Bootmanager Grub eingetragen, so dass beim nächsten Start automatisch die neuste Kernel-Version gebootet wird. Weitere Informationen zu den Metapaketen und Infos zu den unterschiedlichen Architekturen findet man hier.

Kernel deinstallieren

Durch automatische Updates werden neue Versionen des Kernels auf dem System installiert. Dies erkennt man, wenn man beim Booten des System in Grub mehrere Einträge zum Booten des Systems sieht, also z.B.

Ubuntu, kernel 2.6.15-26-386
Ubuntu, kernel 2.6.15-26-386 (recovery mode)
Ubuntu, kernel 2.6.15-25-386
Ubuntu, kernel 2.6.15-25-386 (recovery mode)

Hier erkennt man, dass zwei Kernels im System vorhanden sind. Einmal ein Kernel "2.6.15-25-386" und einmal ein Kernel mit der Versionsnummer "2.6.15-26-386". Nach einem Update des Kernels über die automatischen Updates wird der alte Kernel nie gelöscht. Falls es zu Problemen mit dem neuen Kernel kommen sollte, ist es dadurch möglich noch den alten Kernel zu Booten.

Betreibt man ein Ubuntu-System über einen längeren Zeitraum, so häufen sich die verschiedenen Kernel-Versionen an. Da ein Kernel zusammen mit Headerdateien und Modulen einiges an Platz auf der Festplatte belegen kann, sollte man bei Gelegenheit ältere Kernelversionen, die man nicht mehr nutzt von Hand deinstallieren. Ganz besonders gilt dies, wenn man für /boot eine eigene Partition erstellt hat.

Will man also im obigen Beispiel den älteren Kernel "2.6.15-25-386" deinstallieren. So sucht man in der Paketverwaltung nach dem Paket

  • linux-image-2.6.15-25-386

und deinstalliert [1] es. Dabei werden auch automatisch alle dazugehörigen Kernelmodule und Header entfernt. Ebenso der Eintrag in Grub, um diesen Kernel zu booten.

Hyper-Threading aktivieren

Hyper-Threading {de} wird bei der Installation von Ubuntu Linux nicht immer aktiviert. Dies kann man jedoch mit ein paar Handgriffen schnell ändern. Zuerst muss sichergestellt sein, daß ein passender Kernel mit SMP-Unterstützung installiert ist. Ab Ubuntu Edgy Eft 6.10 ist das das der generic-Kernel, unter Dapper Drake 6.06 die 686-, k7- oder amd64-k8-Kernel.

Um zu prüfen, ob die Installation den Prozessor doch erkannt hat, gibt man im Terminal [3] folgenden Befehl ein:

cat /proc/cpuinfo

Werden hier zwei Prozessoren angezeigt, ist der nächste Schritt nicht nötig.

Um die Funktion manuell zu aktivieren, muss man "ht=on" oder "acpi=ht" als Boot-Parameter für den Kernel hinzufügen. Wie das geht, ist im Artikel Booten beschrieben. Nachdem man die Änderungen gespeichert hat, ist Hyper-Threading nach einem Neustart des Rechners aktiv.

Kernel aus den Quellen bauen

Manchmal benötigt man einen angepassten Kernel mit zusätzlichen Features, oder ein normalerweise dynamisch zu ladender Treiber soll fest eingebaut werden. Dann muß man sich seinen eigenen Kernel aus den Quellen kompilieren. Die folgende Anleitung beschreibt einen auf Debian-artige Systeme wie Ubuntu abgestimmten Weg für Kernel 2.6.x.

Compiler und Tools installieren

Es müssen folgende Pakete installiert sein [1]:

  • build-essential

  • kernel-package

  • xmlto

Und danach entweder

  • libncurses5-dev

für eine ncurses-basierte Oberfläche zur Konfiguration oder

  • libgtk2.0-dev

  • libglib2.0-dev

  • libglade2-dev

für die GTK-Oberfläche oder

  • libqt3-mt-dev

für die QT-Oberfläche.

Eins davon sollte man nehmen, sonst wird es später arg langwierig. Wer ohnehin gelegentlich GTK-Programme kompiliert, hat mit der zweiten Möglichkeit eine komfortable Oberfläche, ansonsten ist ncurses eine sparsame aber benutzbare Möglichkeit.

Kernelquellen installieren

Die Quellen des Ubuntu-Kernels, der bereits einige Patches enthält, können als Paket

  • linux-source (ab Dapper)

  • linux-headers-generic (der Architektur entsprechend, [5])

installiert werden [1], wobei ein

uname -r

im Terminal [3] die aktuelle Kernelversion ausgibt.

Experten-Info:

Wer genau weiß, was er tut, kann auch einen sogenannten "Vanilla"-Kernel von kernel.org {en} als Basis nehmen. Versionen vor 2.6.8 sind nicht zu empfehlen, da sie udev nicht unterstützen. Außerdem fehlen den Versionen bis mindestens 2.6.10 die Patches evms und möglicherweise weitere Features.

Optional: Kernelpatches herunterladen

Wer den Kernel patchen will, weiß vermutlich, was er tut und welchen Patch er benötigt. Besonders komfortabel ist es, wenn der benötigte Patch in einem Paketrepository zu haben ist. Einige Patches finden sich beispielsweise in universe, das man gegebenenfalls erst freischalten muß [2]. Bei diesen ist wie bei allen Patches auf die richtige Versionsnummer zu achten, die meist erkennen läßt, für welche Kernelversion der Patch gedacht ist. Oft funktionieren aber auch ähnliche Versionen.

Kernelquellen auspacken

Die Kernelquellen befinden sich nun als tar.bz2-Archiv im Verzeichnis /usr/src. Alle nun folgenden Schritte müssen in einem Terminal [3] ausgeführt werden.

Kernelquellen auspacken, Symlink erstellen und ins Quellverzeichnis wechseln:

sudo tar -xjvf linux-source-<Versionsnummer>.tar.bz2
sudo ln -s linux-source-<Versionsnummer> linux
cd linux

Optional: Kernel patchen

Patches, die über das Paketmanagement installiert wurden, befinden sich in einem Unterverzeichnis von /usr/src/kernel-patches/diffs. Sie liegen üblicherweise als gz- oder bz2-komprimierte Diff-Datei vor (.diff.gz oder .diff.bz2). Sie lassen sich mit folgendem Befehl einbauen:

zcat /usr/src/kernel-patches/diffs/<Patchverzeichnis>/<Patchdatei> | sudo patch -p1

Bei bz2-Kompression ist zcat durch bzcat zu ersetzen.

Kernel konfigurieren

Die Konfiguration des Kernels wird in der Datei .config gespeichert. Eine gute Vorlage hierfür bietet die Konfiguration des bereits installierten Kernels. Sie wird ins aktuelle Verzeichnis kopiert:

sudo cp /boot/config-<Kernelversion> .config

Hinweis:

Alternativ kann die Konfiguration des laufenden Kernels meist auch aus einer komprimierten Datei in /proc gelesen werden. Dies ist im Standard Kernel von Ubuntu nicht aktiviert, bei einem selbstkompilierten kann man dieses Feature aber aktivieren:

zcat /proc/config.gz | sudo dd of=.config  

Falls die config-Datei von einer älteren Kernelversion stammt kann mit dem Befehl

sudo make oldconfig

die Konfiguration auf die aktuelle Version "updaten". Dabei wird nach den Einstellungen für die neuen Kerneloptionen gefragt.

Alternativ kann man mit

sudo make defconfig

eine (fast) minimale Standardkonfiguration erzeugen. Danach muss man nur noch sehr wenig ändern.

Achtung!

Es wird nur Unterstützung für ext2 und ext3 konfiguriert, also unter File Systems korrigieren, falls man ein anderes Dateisystem verwendet.

Auf Basis dieser Konfiguration kann man nun eigene Einstellungen vornehmen. Je nach anfangs installierten Bibliotheken geht das mit

sudo make menuconfig

(ncurses),

sudo make gconfig

(GTK), oder

sudo make xconfig

(Qt).

Unter general Setup - LOCALVERSION kann dabei eine Bezeichnung angegeben werden, die die Zuordnung des Kernels später erleichtert. Im Makefile kann auch eine EXTRAVERSION eingestellt werden: sie erscheint an die Versionsnummer angehängt (z.B. 2.6.10-noscsi).

Beim Wechsel auf eine neue Kernelversion kann die Datei .config aus dem alten Kernel-Verzeichniss in das neue kopiert werden. Nach dem Wechsel in dieses, kann dann

sudo make oldconfig

aufgerufen werden, wobei (auf der Konsole) nur die Einstellungen für die neuen Kernel-Features abgefragt werden.

Kernel kompilieren

Nach Abschluß der Konfiguration kann der Kernel kompiliert werden. Der folgende Befehl erzeugt auch gleich einfach installierbare .deb-Pakete für kernel-image, kernel-headers, kernel-doc und kernel-source:

sudo make-kpkg --initrd --revision=i686ver1 binary

Die Bezeichnung "i686ver1" kann beliebig gewählt werden, sollte aber nicht mit den bereits vorhandenen Kerneln im System kollidieren. Weitere Informationen finden Sie im Debian-Anwenderhandbuch.

Der Parameter binary sorgt für die Erstellung der genannten .deb-Pakete. Wenn man nur ein kernel-image-Paket benötigt, kann man binary durch kernel_image ersetzen. Weitere Möglichkeiten sind in der Manpage von make-kpkg aufgeführt.

Hinweis:

Wenn eine Fehlermeldung kommt, dass die Datei arch/i386/boot/bzImage fehlt, hilft der Aufruf

sudo make clean bzImage && sudo make-kpkg --initrd kernel_image && sudo make && sudo make-kpkg --initrd binary  

Alternativ: Allerdings ist eine initrd nicht zwingend notwendig, wenn man seine Hardware kennt (das tut man meist wenn man seinen eigenen Kernel kompiliert) und keine LVM/Raid/dm_crypt/USB/NFS/SMB/LDAP/etc. Unterstützung braucht, um das root Dateisystem zu mounten. In diesem Falle deaktiviert man in der Konfigurationsphase die Unterstützung für initrd und bindet die Treiber für das root-Laufwerk ( meist die ATAPI / IDE Treiber für die Festplatte ) fest und nicht als Modul ein. Hilfreich ist auch das feste einbinden von USB wenn man eine USB Tastatur und/oder Maus benutzt. Will man eine externe Firewire Festplatte schon beim booten einbinden müssen auch die Firewire Treiber fest in den Kernel kompiliert werden. Danach startet man das Kompilieren mit

sudo make-kpkg --revision=i686ver1 binary

Nach einer Änderung der Konfiguration kann es nötig sein, vor einem erneuten make-kpkg einmal

sudo make

auszuführen.

Wird der Kernel nochmals gepatcht, so sollten bereits übersetzte Teile aufgeräumt werden; dann wird beim nächsten Mal alles neu kompiliert:

sudo make clean

Wurde der Kernel mittels make-kpkg kompiliert, ist es auch empfehlenswert alle Teile mit

sudo make-kpkg clean

aufzuräumen. So werden zum Beispiel auch die Stamp Dateien gelöscht.

Kernel installieren

Das erzeugte Kernelpaket nun mit dem folgenden Befehl installiert werden:

sudo dpkg -i ../kernel-image-<xxx>.deb

Mit dem Befehl

sudo dpkg -r kernel-image-<xxx>

entfernt man einen vorher installierten Kernel.

Achtung!

Diesen Befehl nur ausführen, wenn für den Notfall noch ein anderer Kernel zum Booten zur Verfügung steht!

Neustart und Test des neuen Kernels

Nach einem Neustart des Systems läßt sich der neue Kernel im Bootmenü auswählen.

Mögliche Probleme

Wer die Unterstützung für symmetrischem Multiprocessing (SMP) abschaltet, weil er nur einen Prozessor besitzt, kann beim Kompilieren folgende Fehlermeldung erhalten (Ubuntu 7.10, Kernel linux-source-2.6.17):

drivers/built-in.o: In function `ide_wait_not_busy':
(.text+0x3de9b): undefined reference to `touch_nmi_watchdog'
make[1]: *** [.tmp_vmlinux1] Fehler 1

Eine Diskussion über das Problem findet sich hier hier {en} . Das Problem ist lösbar, indem "Local APIC support on uniprocessors" oder die SMP-Unterstützung wieder aktiviert wird.

Kernelgröße anschauen

Um zu überprüfen ob der selbstgebackene Kernel größer oder kleiner als der alte ist, kann man die /boot/vmlinuz im Terminal [3] vergleichen.

ls -lh /boot/vmlinuz-2.6.12   # neuer Kernel

-rw-r--r--  1 root root 1,1M 2005-12-29 12:14 /boot/vmlinuz-2.6.12

ls -lh /boot/vmlinuz-2.6.12-10-386  # alter Kernel

-rw-r--r--  1 root root 1,2M 2005-12-22 14:14 /boot/vmlinuz-2.6.12-10-386

Wie man sieht, ist der neue Kernel um 0,1 MB kleiner...

Links


last modified 07.09.2007 14:31:52