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
)
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
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:
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
im Terminal [3] die aktuelle Kernelversion ausgibt.
Wer genau weiß, was er tut, kann auch einen sogenannten "Vanilla"-Kernel von kernel.org
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:
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:
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:
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
die Konfiguration auf die aktuelle Version "updaten". Dabei wird nach den Einstellungen für die neuen Kerneloptionen gefragt.
Alternativ kann man mit
eine (fast) minimale Standardkonfiguration erzeugen. Danach muss man nur noch sehr wenig ändern.
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
(ncurses),
(GTK), oder
(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
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:
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.
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
Nach einer Änderung der Konfiguration kann es nötig sein, vor einem erneuten make-kpkg einmal
auszuführen.
Wird der Kernel nochmals gepatcht, so sollten bereits übersetzte Teile aufgeräumt werden; dann wird beim nächsten Mal alles neu kompiliert:
Wurde der Kernel mittels make-kpkg kompiliert, ist es auch empfehlenswert alle Teile mit
aufzuräumen. So werden zum Beispiel auch die Stamp Dateien gelöscht.
Kernel installieren
Das erzeugte Kernelpaket nun mit dem folgenden Befehl installiert werden:
Mit dem Befehl
entfernt man einen vorher installierten Kernel.
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
. 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.
-rw-r--r-- 1 root root 1,1M 2005-12-29 12:14 /boot/vmlinuz-2.6.12
-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
Echtzeitkernel - ein auf Echtzeitanwendungen optimierter Kernel


2005–2007 ubuntuusers.de · Einige Rechte vorbehalten
