14.9 Kernel und Module
Der wichtigste Baustein eines Betriebssystems ist der Kernel. Er heißt Linux, die meisten anderen Bestandteile des Betriebssystems stammen aus GNU-Projekten. Deswegen ist die Bezeichnung »Linux« für dieses Betriebssystem streng genommen falsch; man müsste korrekterweise von einem »GNU/Linux-System« sprechen.
14.9.1 Kernel
Der Kernel eines Betriebssystems ist sein grundlegender Kern. Er steuert elementare Aufgaben wie die Speicher- und Prozessverwaltung. Eine andere grundlegende Aufgabe, die dem Kernel obliegt, ist die Steuerung der Hardware. Für einige spezielle Hardwarekomponenten kann es nötig sein, sich seinen eigenen Kernel zu »bauen« (kompilieren). Der Linux-Kernel hat mittlerweile einen Umfang von mehreren Millionen Zeilen Code erreicht.
GNU und Linux
Linux, also der Kernel, stellt dementsprechend für sich allein kein funktionierendes Betriebssystem dar. Erst die Kombination mit den Programmen aus der GNU-Welt macht dieses System zu einem runden Ganzen. Den Kernel von Linux können Sie sich kostenlos von der Website www.kernel.org herunterladen. Auch Microsoft Windows hat einen Kernel. Im Gegensatz zu Linux ist dieser aber nicht frei, geschweige denn offen. Der Windows-Kernel wird, wie der gesamte Quellcode von Windows, gehütet wie ein Staatsgeheimnis. Im Gegensatz zu Linux, wo jeder Benutzer eingeladen ist, Sicherheitslücken zu suchen, werden solche Lücken bei Windows versteckt. Diese Offenheit von Linux führt prinzipbedingt zu einem sichereren System.
Die Hauptaufgaben des Kernels sind:
- Schnittstelle
Der Kernel bildet die Schnittstelle zur Hardware, zum Beispiel zu Geräten, zum Speichern und zu(m) Prozessor(en). - Prozessverwaltung
Sie gewährleistet das problemlose (unter anderem auch parallele) Laufen verschiedener Applikationen. Im Rahmen der Prozessverwaltung eines Betriebssystems dient der »Dispatcher« dazu, bei einem Prozesswechsel dem derzeit aktiven Prozess die CPU zu entziehen und anschließend dem Prozessor den nächsten Prozess zuzuteilen. Die Entscheidung, welcher Prozess der nächste ist, wird vom »Scheduler« im Rahmen der Warteschlangenorganisation getroffen.Werden auf einem Computer mehrere Prozesse gleichzeitig ausgeführt, so muss das Betriebssystem durch den »Scheduler« die vorhandenen Ressourcen auf die verschiedenen Prozesse aufteilen. Dieses Verhalten ist typisch für ein Multitasking-System.
- Hauptspeicherverwaltung
Die Speicherverwaltung ist derjenige Teil des Kernels, der einen effizienten und komfortablen Zugriff auf den physischen Arbeitsspeicher eines Computers ermöglicht. Je nach Einsatzbereich des Computers werden unterschiedliche Speicherverwaltungsmechanismen verwendet.Bei UNIX-artigen Systemen wird der Speicher in zwei getrennten Bereichen verwaltet. Anwendungen benutzen den User-Space, während der Kernel selbst und einige Treiber den Kernel-Space nutzen. Diese Trennung hat sicherheitsrelevante Gründe, damit potentielle Fehler in Anwendungen oder auch Viren keinen Zugriff auf den Kernel-Space haben und damit die Stabilität des Grundsystems nicht gefährden können. Der Kernel steuert nicht nur den Zugriff auf den physischen Teil des Speichers, denn dies hätte den Nachteil, dass die aktiven Prozesse selbst niemals mehr Speicherplatz belegen dürften, als physisch zur Verfügung steht. Um dieses durch immer komplexere Programme entstandene Problem zu lösen, wurde das Prinzip der virtuellen Speicherverwaltung entwickelt. Dabei verwenden Prozesse nur noch virtuelle und keine physischen Adressen mehr. Die Umsetzung der virtuellen Adresse in eine physische Adresse übernimmt die Memory Management Unit. Die virtuelle Speicherverwaltung ist heute in beinahe jedem modernen Betriebssystem (u. a. in UNIX) verwirklicht.
- Dateiverwaltung
Im Dateisystem sind die externen Daten eines Computers in Form von Dateien gespeichert. Das Dateisystem selbst ist ein Ordnungs- und Zugriffssystem für diese Daten. Zugriffsroutinen für Dateisysteme sind ebenfalls Bestandteil des Kernels, was mit dem Begriff »Dateiverwaltung« beschrieben werden soll.
Die Leistungsfähigkeit von UNIX hängt im Wesentlichen von der Implementierung dieser grundlegenden Funktionen ab. An diesem Beispiel erkennen Sie, wie wichtig es manchmal sein kann, sich einen eigenen Kernel zu kompilieren. Stets außerhalb des Kernels laufen die Anwenderprozesse, die sich der vom Kernel angebotenen Funktionen bedienen, um mit der Maschine zu kommunizieren.
Monolithischer Kernel: Wenn alle diese eben beschriebenen Funktionen im Kernel selbst vorhanden sind, spricht man von einem monolithischen Kernel. Bei einem Mikro-Kernel finden wesentliche Teile in getrennten Prozessen statt. Daneben bzw. zwischen den beiden liegend gibt es noch den sogenannten Makro-Kernel. Er stellt einen Kompromiss zwischen den beiden anderen Kernel-Arten dar und vereint deren Vorteile. Ein Makro-Kernel ist nicht so fehleranfällig wie ein monolithischer Kernel und schneller als ein Mikro-Kernel.
Kernel für Entwickler
Wenn Sie sich detaillierter mit Kerneln beschäftigen, dann stolpern Sie zuerst über die Bezeichnung durch Versionsnummern. Wie allgemein in der Programmiererwelt üblich, bezeichnen ungerade Versionsnummern (2.1.x, 2.3.x ...) die teilweise noch instabilen Entwicklerversionen. Mit geraden Versionsnummern hingegen werden die stabilen Anwender-Kernel bezeichnet (2.2.x, 2.4.x ...). Normalerweise haben Sie als Einsteiger auf diesem Gebiet nichts mit den ungeraden Kerneln zu tun. Lassen Sie sich zu Beginn bitte nicht von dem Zahlenspiel verwirren; unter Linux hat fast jedes Programm eine Versionsnummer. Es ist hierbei meistens nicht nötig, den aktuellsten Updates hinterherzulaufen, wenn diese nicht gerade Sicherheits-Updates implementieren.
Tipp 231: Welchen Kernel verwende ich? |
Mit Hilfe des Werkzeugs uname können Sie eine Menge über den verwendeten Linux-Kernel herausfinden. Sie können beispielsweise die aktuelle Versionsnummer erfahren, wenn Sie in der Konsole uname -r eintippen: |
3.2.0-26-generic |
Eine vollständige Übersicht aller Informationen erfahren Sie mit Hilfe der -a. |
Kernel-Historie
Wie bereits herausgearbeitet wurde, bezeichnet man als »Linux« eigentlich nur den Kern des Betriebssystems. Wenn jemand davon spricht, dass er Linux 2.6 benutzt, dann meint er, dass er ein Betriebssystem mit dem (Linux-)Kernel 2.6 verwendet. Man findet auch oft Aussagen wie »Ich benutze Linux 10.1«. Hier verwechselt der Betreffende die Versionsnummer von Linux mit der von SUSE und outet sich somit als SUSE-Nutzer. Solche Aussagen begegnen einem oft im deutschsprachigen Raum, da hier SUSE die meistverbreitete Distribution ist. Ich möchte im Folgenden kurz die Geschichte von Linux anhand der Kernel-Veröffentlichungen beschreiben:
- 1991
Erstmalig findet das neue Betriebssystem am 3. Juli 1991 Erwähnung. Linus Torvalds implementiert einige Gerätetreiber sowie den Festplattentreiber und eine Reihe von User-Level-Funktionen. Linus veröffentlicht am 17. September 1991 die Version 0.01 des Kernels mit einem bescheidenen Umfang von 10.239 Zeilen Code für Interessenten aus dem Usenet. Dieses Datum wird oftmals als die Geburtsstunde von Linux angesehen. 2011 wird Linux somit 20 Jahre alt. Herzlichen Glückwunsch!Die erste »offizielle« Version des Linux-Kernels (0.02) erscheint am 05. Oktober 1991. Mit dieser Version laufen bereits die Bash, gcc, gnu-make, gnu-sed und compress. Am 19. Dezember 1991 läuft die erste Version (0.11), die ohne die Hilfe eines anderen Betriebssystems lauffähig ist, allerdings ohne grafische Oberfläche. Es gibt keinen SCSI-Support, so dass eine AT-Bus-Festplatte Voraussetzung ist.
- 1992
Bereits am 5. Januar kommt die erste Version (0.12) heraus, die mehr Funktionen hat, als unbedingt benötigt werden. Mit dieser Version wird der Kernel unter die GPL gestellt. Die ältere Lizenz, unter der der Kernel steht, ist in vielen Punkten deutlich strenger.Linus Torvalds verteilt diese Version per Anonymous FTP im Internet, was zu einem sprunghaften Anstieg der Testerzahl führt. Der Anstieg wird so groß, dass die nötige Kommunikation nicht mehr per E-Mail zu bewältigen ist, und im Usenet wird die Gruppe alt.os.linux geschaffen. Das Interesse an Linux wächst stetig und wird von Linus Torvalds koordiniert.
Um die Entwicklung voranzutreiben, erhöht Linus Torvalds im März 1992 die Entwicklungsnummer auf Version 0.95. Die im April folgende Version 0.96 ist die erste Version, mit der es möglich ist, das X-Window-System zu betreiben. Man schätzt die Zahl der Anwender auf circa 1.000.
- 1993
Die Zahl aller Programmierer steigt auf circa 100. Fünf von ihnen arbeiten mit Torvalds zusammen. Die Anwenderzahl beläuft sich auf etwa 20.000. Durch Anpassung des Linux-Kernels an die GNU-Umgebung der Free Software Foundation (FSF) wachsen die Möglichkeiten von Linux erneut stark an, da man nun auf eine große Sammlung an vorhandener Software und Tools zurückgreifen kann. - 1994
Mit der ersten stabilen Linux-Version (1.00) im März 1994 wird der Kernel netzwerkfähig, und die Zahl der Anwender steigt auf 100.000 an. Gleichzeitig wächst der Kernel auf eine Größe von 176.250 Zeilen Code. Linus Torvalds stellt nun den Quelltext des Linux-Kernels offiziell unter die GPL. Ein weiterer wichtiger Schritt ist die Adaption eines Graphical User Interfaces (GUI), des X-Window-Systems. Dieses wird von nun an von dem Xfree86-Projekt beigesteuert. - 1995
Im März 1995 wird das sogenannte Modulkonzept eingeführt. Hiermit werden Treiber und Ähnliches als Module realisiert, die einzeln in den Kernel integriert werden können. Linux läuft nun auch auf DEC- und Sun-Sparc-Prozessoren. Schätzungen belaufen sich auf rund eine halbe Million Anwender. - 1996
Mit der neuen Version 2.0 des Linux-Kernels können mehrere Prozessoren gleichzeitig angesteuert werden. Linux verliert langsam seinen Bastlerstatus und wird zu einer ernstzunehmenden Alternative für Firmen. Das K Desktop Environment (KDE) wird veröffentlicht. Die Anwenderzahl erhöht sich auf rund 1,5 Millionen. - 1997
Neue Linux-Versionen erscheinen fast wöchentlich. In verschiedenen Ländern existieren bereits Linux-Magazine. Die Anwenderzahl ist auf 3,5 Millionen gestiegen. Verschiedene namhafte Firmen beginnen, ihre Software auf Linux zu portieren: Netscape seinen Webbrowser, Applixware seine Office-Anwendung und die Software AG ihre Datenbank Adabas D. Damit gibt es auch professionelle Software für Linux. GNOME wird als Antwort auf KDE initiiert. - 1998
Man schätzt die Anzahl der Programmierer von Linux auf 10.000 und die Anzahl der Anwender auf 7,5 Millionen. - 1999
Man tippt auf ungefähr 10 Millionen Anwender. Linus Torvalds kündigt den »Angriff« auf Windows an. Der Kernel 2.2 wird freigegeben. Er besitzt einen Umfang von 1.800.847 Zeilen Code. - 2001
Im Januar 2001 wird der Kernel 2.4 veröffentlicht. Seine Größe wächst auf 3.377.902 Zeilen Code. - 2003
Im Dezember 2003 erscheint der Kernel 2.6 mit einem Umfang von 5.929.913 Zeilen Code. Das Soundsystem ALSA löst das veraltete OSS ab (siehe Abschnitt 11.3, »Audio«). - 2011
Da Linux inzwischen 20 Jahre alt ist, beginnt 2011 die dritte Dekade. Aus diesem Grund und weil die Versionsnummern immer unübersichtlicher werden, hat sich Linux Torvalds entschieden, dass nach der Version 2.6.39 die Version 3.0 folgt. Der Code-Umfang steigt auf über 9 Millionen Zeilen.
Linux heute
Linus Torvalds koordiniert nach wie vor die Arbeit am Linux-Kernel. Inzwischen ist Linux über 20 Jahre alt. Aus dem anfangs sehr rudimentären System, das nur von eingefleischten UNIX-Anhängern verstanden und geschätzt wurde, hat sich eine ganze Kultur rund um Linux entwickelt. So listet die Internetseite distrowatch.com zurzeit mehr als 350 Linux-Distributionen auf. Manche dieser Distributionen entstanden schon Anfang der 1990er Jahre und blicken somit auf eine lange Geschichte zurück. Ubuntu gehört, wie bereits erwähnt, zu den jüngsten Distributionen. Umso erstaunlicher ist der überwältigende Erfolg von Ubuntu.
Es gibt heute circa 30 Millionen Linux-Benutzer weltweit. Die Zahlen schwanken sehr, eine Vorstellung von der Größenordnung gewinnen Sie aber anhand der Website LinuxCounter (http://counter.li.org/). Dort können Sie sich ebenfalls als Linux-Benutzer registrieren.
14.9.2 Module
Ein Betriebssystem ist also die Basis, damit alle anderen Programme überhaupt auf Ihrem Computer funktionieren können. Zu der Kernaufgabe eines Betriebssystems gehört zweifellos die Kommunikation zwischen Ihnen und der Hardware, die mittels Software erfolgt. Damit ein Betriebssystem sich mit der Hardware »versteht«, braucht es gute Kontakte. Diese Kontakte werden mit Hilfe von sogenannten Treibern aufgebaut.
Treiber sind also die Schnittstellen zwischen Hardware und Betriebssystem. Sie sorgen dafür, dass das Betriebssystem die Hardware korrekt erkennt und im Folgenden der Software, die Sie installieren, sämtliche Funktionalitäten der Hardware zur Verfügung stellt.
Die Arbeit an Treibern für Linux wird oft von Freiwilligen vorangetrieben, da viele Hardwarehersteller nur eine sehr mangelhafte Unterstützung für Linux anbieten. Dies ist der Grund, warum es oftmals mehrere Monate dauert, bis ein Treiber für die neueste Hardware entwickelt wird. Die Entwickler sind hierbei auf Ihr Feedback angewiesen, da der Umfang an verfügbarer Hardware unüberschaubar ist.
Mangelhafte Unterstützung
Unter Linux haben Sie oftmals mit dem Problem zu kämpfen, dass viele der kommerziell ausgerichteten Firmen keine Treiber für Linux anbieten. Die Gründe hierfür sind vielfältig – zum einen ist die Anzahl der Linux-Benutzer und damit die Nachfrage noch zu gering, andererseits lässt sich mit diesen Treibern in der Welt von Freiheit und Open Source nur sehr schwer Geld verdienen. Zum Glück gibt es aber in der weltumspannenden Gemeinde der Linux-Anwender jede Menge gescheite Entwickler, die für fast jede Hardware unentgeltlich Treiber entwickeln.
Aufgrund der Zeitverzögerung bei einer solchen freiwilligen Leistung kommt es aber teilweise zu mehrmonatigen Verspätungen, bis ein Treiber entwickelt ist. Daher lautet mein Rat an Sie: Kaufen Sie niemals die allerneueste Hardware, wenn Sie Linux als Betriebssystem einsetzen möchten. Warten Sie ruhig ein paar Monate ab, und üben Sie sich ein wenig in Geduld. So vermeiden Sie überflüssigen Ärger.
Wenn Sie »auf Nummer sicher gehen« wollen, dann informieren Sie sich vor dem Kauf Ihrer Hardware, ob die Geräte auch anstandslos ihren Dienst unter Linux verrichten. Für Ubuntu befinden sich gute Anlaufstellen im englischen Wiki auf www.ubuntu.com und in der Hardwaredatenbank der Ubuntu-Anwender unter wiki.ubuntuusers.de.
Zweck von Modulen
Im März 1995 erschien der Kernel in der Version 1.2. Der Umfang stieg nicht nur auf rund 300.000 Zeilen Quellcode, erstmals ließ sich Linux nun auch auf den Architekturen Alpha und Sparc installieren und nutzen. Die PCI-Erweiterungen erreichten die Marktreife, und ganz nebenbei wurde für die Nutzer ein System im Kernel eingeführt, das vorher nur in kommerziellen UNIX-Systemen zum Einsatz gekommen war: die Module.
Unter Linux ist die überwiegende Anzahl der Treiber in Modulen realisiert. Früher mussten zum Beispiel sämtliche Treiber fest in den Kernel kompiliert werden, ob man sie nun brauchte oder nicht. Denn dieser Kernel sollte ja auf sehr vielen verschiedenen Hardwareplattformen laufen und sämtliche Eventualitäten abdecken. Allerdings wurde der Kernel wegen des erhöhten Speicherbedarfs sehr groß und langsam. Es war und ist nahezu unmöglich, einen Universal-Kernel zu generieren, der alle Möglichkeiten an verschiedener Hardware abdeckt und für jedes noch so seltene Gerät einen Treiber integriert hat. Dies führte dazu, dass eine Installation von Linux fast immer mit einer anschließenden Kernel-Kompilation endete. Dies erzeugte insbesondere bei Anfängern den Eindruck, Linux sei ein schwer zu konfigurierendes System.
Hinzufügen während der Laufzeit
Mit dem Erscheinen der Kernel-Version 1.2 wurde das Konzept der Module eingeführt. Es wurde nun möglich, Treiber (aber auch andere Komponenten), die während des Bootens nicht zwingend notwendig sind, in separate Einheiten – die Module – auszulagern. Module lassen sich zur Laufzeit, d. h., wenn der Kernel eine bestimmte Eigenschaft benötigt, zu diesem hinzufügen. Umgekehrt können Sie aber auch, wenn ein Treiber temporär oder dauerhaft nicht mehr benötigt wird, diesen wieder aus der aktuellen Kernel-Konfiguration entfernen.
Die ersten Module mussten allerdings noch per Hand ge- oder entladen werden. Dieser Prozess wurde später automatisiert. Der Kernel konnte durch dieses Prinzip der Modularisierung relativ klein und schnell bleiben. Das modulare Design erlaubt nun ein automatisches Erkennen von Hardware und ein dynamisches Hinzufügen von benötigten Treibern. Die Treiber werden hierfür separat als ein Modul kompiliert: Ein langwieriges Kompilieren des gesamten Kernels entfällt somit.
Sicherheitsrisiken
Sie werden sich vielleicht fragen, warum nicht gleich alle Treiber im Kernel integriert sind. Das liegt zum einen daran, dass zusätzliche Treiber auch immer Sicherheitsrisiken für das gesamte System darstellen, wenn sie fest in den Kernel integriert sind. Zum anderen würde eine komplette Integration sämtlicher Treiber den Kernel riesig werden lassen – er würde in der Folge immer mehr Platz beanspruchen, und seine Arbeitsweise würde sich erheblich verlangsamen.
Restricted Modules
Nun brauchen Sie keine Angst zu haben, dass Sie Ihre Hardware nur zum Funktionieren bringen, wenn Sie eigenständig und manuell Module in den Kernel kompilieren. Normalerweise erledigt das Betriebssystem diese Aufgabe von allein. Es erkennt bei der Installation die zur Verfügung stehende Hardware und bindet die nötigen Module ein. Oftmals fällt das Integrieren zusätzlicher Module aber auch sehr einfach aus, wenn Sie zum Beispiel die 3D-beschleunigten Treiber von NVIDIA für Ihre Grafikkarte nutzen wollen oder ein ISDN-Modem von AVM Ihr Eigen nennen.
Inzwischen ist die Installation der 3D-beschleunigten Treiber sehr viel einfacher geworden. Ubuntu bietet hierfür einen einfachen Dialog an. Der Umgang mit den Modulen ist deutlich einfacher, als der erste Eindruck vermuten lässt. Ich werde im folgenden Abschnitt detailliert das Kompilieren eines eigenen Kernels beschreiben. Dort finden Sie auch weitere Informationen über die Verwendung von Modulen.
14.9.3 Einen eigenen Kernel bauen
Manchmal benötigt man einen angepassten Kernel mit zusätzlichen Features, oder ein bestimmter Treiber soll fest eingebaut werden. In diesen Fällen müssen Sie sich einen eigenen Kernel aus den Quellen kompilieren. Wir werden im Folgenden den typischen Weg zum Kernel-Bauen unter Ubuntu für den Kernel 2.6.x beschreiten. Hierzu sind mehrere Schritte nötig, die wir nachfolgend einzeln abhaken werden.
Die Anleitung richtet sich an fortgeschrittene Anwender. Dies bedeutet, dass Sie im Normalfall schon über einige Erfahrung verfügen sollten, bevor Sie sich an das Bauen eines eigenen Kernels heranwagen. Sie machen hierbei eine Operation »am offenen Herzen« Ihres Systems. Zuerst sollten Sie ein paar grundsätzliche Dinge beachten:
- Behalten Sie stets eine Sicherungskopie Ihres alten und funktionierenden Kernels. Falls etwas schiefgeht, können Sie das System immer noch benutzen und müssen nicht mit einer Rettungs-CD arbeiten. Also seien Sie grundsätzlich vorsichtig, wenn es um das Thema Löschen geht.
- Sie sollten, bevor Sie überhaupt an das Selbstbauen des Kernels herangehen, herausfinden, welche Hardware im Rechner verbaut ist.
- Lesen Sie bitte die Hilfebeschreibungen zu den Kernel-Optionen durch. Wenn Sie bei irgendeiner Option unsicher sind, was Sie tun sollten, dann geben Sie dies auch offen zu, und tippen Sie bei der entsprechenden Abfrage Yes.
- Alle Module und Optionen, die Sie nicht unbedingt benötigen, können Sie abwählen. Wenn Sie zum Beispiel keinen SCSI-Adapter haben, brauchen Sie auch keine Module dafür einzubinden.
- Alles, was Sie nicht oft benötigen werden, sollte als Modul eingebunden werden, zum Beispiel USB-Geräte. Möchten Sie allerdings das System später von einem USB-Stick booten, so kann hier das feste Einbinden in den Kernel notwendig sein.
- Das Dateisystem für die Root-Partition ist fest in den Kernel einzubinden. Alle anderen Dateisysteme, die Sie sonst noch benötigen, können als Modul eingebunden werden. Das erspart Ihnen das Erstellen einer »Initial Ramdisk«. Die zugehörige Option können Sie dann getrost abwählen.
- Wer eine USB-Tastatur und/oder -Maus besitzt, der sollte den Treiber für das USB-Subsystem, den Treiber für seinen USB-Baustein und die Treiber für HID-Geräte fest einbinden. Eventuell können Sie dann die Treiber für den PS/2-Anschluss weglassen. Dies hätte den Vorteil, dass ein so getunter Kernel viel weniger Platz benötigt und das Hotplug viel weniger Zeit beim Starten braucht.
Vorbereitungen
Kontrollieren Sie bitte zuerst, ob folgende Pakete installiert sind:
- build-essential
- kernel-package
Je nachdem, in welcher Umgebung Sie die Kernel-Konfiguration vornehmen möchten, sollten die folgenden Pakete installiert werden:
- libncurses5-dev – für eine ncurses-basierte Oberfläche zur Konfiguration innerhalb einer Konsole
- libgtk2.0-dev, libglib2.0-dev und libglade2-dev – falls Sie eine GTK-Oberfläche zur Kernel-Konfiguration bevorzugen
Wenn Ihnen eines der obigen Pakete fehlen sollte, dann installieren Sie es bitte per apt-get nach. Als Nächstes benötigen Sie die Quellen des Ubuntu-Kernels. Diese Quellen sind als Paket erhältlich und können mit apt-get oder Synaptic installiert werden. Sie erkennen dieses Paket an der Bezeichnung linux-source-x.x.x. Die beste Basis ist das Quellpaket, dessen Versionsnummer dem derzeit benutzten Kernel entspricht.
Tipp 232: Kernel-Version herausfinden |
Sie erhalten die aktuelle Versionsnummer, wenn Sie im Terminal uname -r eingeben. Was zählt, sind die ersten drei Zahlen, also beispielsweise 2.6.24. Die Quellen dieses Kernels würden bei der aktuellen Version in jedem Fall installiert, wenn Sie Folgendes in einer Konsole eingeben: |
sudo apt-get install linux-source-2.6.24 |
In den Ubuntu-Quellen sind auch etliche Ubuntu-spezifische Patches enthalten. Es steht Ihnen natürlich frei, sich einen Original-(Vanilla-)Kernel von www.kernel.org zu beschaffen. |
Optional: Kernel-Patches herunterladen
Meist werden Sie den Kernel patchen wollen, um gewisse Funktionalitäten in den Kernel zu integrieren, die im Standard-Kernel (noch) nicht enthalten sind. In diesem Fall wissen Sie wahrscheinlich, welchen Patch Sie benötigen. Besonders komfortabel ist es natürlich, wenn der benötigte Patch in einem Repository zu bekommen ist. Einige Patches finden sich beispielsweise im Universe-Repository. Achten Sie hierbei wie bei allen Patches auf die richtige Versionsnummer. Für jeden Kernel gibt es einen passenden Patch.
Kernel-Quellen auspacken
Die Quellen befinden sich nach Installation als tar.bz2-Archiv im Verzeichnis /usr/src. Mit
sudo tar -xjf linux-source-<Versionsnummer>
und durch cd linux-source-<Versionsnummer> entpacken Sie die Kernel-Quellen und wechseln ins Quellverzeichnis.
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 (*.diff.gz oder *.diff.bz2) vor. Sie lassen sich mit folgendem Befehl einbauen:
gunzip -c /usr/src/kernel-patches/diffs/\
<Patchverzeichnis>/<Patchdatei> | sudo patch -p1
Bei bz2-Kompression ist gunzip durch bunzip2 zu ersetzen.
Kernel konfigurieren
Die Konfiguration des Kernels wird im aktuellen Kernel-Quellverzeichnis in der Datei .config gespeichert. Es ist stets ratsam, von der aktuellen Kernel-Konfiguration auszugehen. Diese finden Sie im Verzeichnis /boot/config. Sie wird folgendermaßen kopiert:
sudo cp /boot/config-<Kernelversion> .config
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 Kernel können Sie dieses Feature aber aktivieren:
sudo zcat /proc/config.gz > .config
Auf der Basis dieser Konfiguration können Sie nun eigene Einstellungen vornehmen. Wenn Sie eine minimale Standardkonfiguration erzeugen möchten, wählen Sie einfach:
sudo make defconfig
Beim Wechsel auf eine neue Kernel-Version kann die Datei .config aus dem alten Kernel-Verzeichnis in das neue kopiert werden. Nach dem Wechsel in dieses neue Verzeichnis können Sie
sudo make oldconfig
aufrufen, worauf dann nur die Einstellungen für die neuen Kernel-Features abgefragt werden.
Kernel kompilieren
Nach dem Abschluss der obigen Konfiguration muss der Kernel kompiliert werden. Mit den folgenden beiden Befehlen erzeugen Sie auch gleich einfach installierbare .deb-Pakete für das Kernel-Image, die Kernel-Header, das Kernel-Doc und die Kernel-Source:
sudo make-kpkg clean
und:
sudo make-kpkg --initrd --revision <meineVersion> binary
Der Parameter binary sorgt für die Erstellung der genannten *.deb-Pakete. Wenn Sie nur ein Kernel-Image-Paket benötigen, können Sie binary durch kernel_image ersetzen. Bei Angabe des optionalen Parameters revision müssen Sie darauf achten, dass die Bezeichnung sich nicht mit einem im System vorhandenen Kernel überschneidet. Weitere Möglichkeiten sind in der Manpage von make-kpkg aufgeführt.
Tipp 233: Den Kernel schrittweise übersetzen |
Sollte es während des Laufs von make-kpkg zu einer Fehlermeldung kommen, so können Sie versuchen, den Kernel in folgenden einzelnen Schritten zu übersetzen, um den Fehler genauer zu lokalisieren: |
sudo make clean bzImage |
Einige Anmerkungen
Eine Initial Ramdisk ist nicht notwendig, wenn Sie Ihre Hardware kennen (und das sollten Sie, wenn Sie Ihren eigenen Kernel kompilieren!). In diesem Falle deaktivieren Sie in der Konfigurationsphase die Unterstützung für initrd und binden die Treiber für das Root-Laufwerk (das sind meist die ATAPI/IDE-Treiber für die Festplatte) fest und nicht als Modul ein. Hilfreich ist auch das feste Einbinden von USB, wenn Sie eine USB-Tastatur und/oder -Maus benutzen. Möchten Sie eine externe FireWire-Festplatte schon beim Booten einbinden, so müssen auch die FireWire-Treiber fest in den Kernel kompiliert werden. Danach starten Sie das Kompilieren mit:
sudo make-kpkg 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 Sie bereits übersetzte Teile aufräumen. Nur dann wird beim nächsten Mal alles neu kompiliert:
sudo make clean
Wurde der Kernel mittels make-kpkg kompiliert, so ist es auch empfehlenswert, alle Teile mit
sudo make-kpkg clean
aufzuräumen. Dadurch werden zum Beispiel auch die Stamp-Dateien gelöscht.
Kernel installieren und booten
Das erzeugte Kernel-Paket können Sie nun ganz einfach mit dem Befehl
sudo dpkg -i ../kernel-image-<neueVersion>.deb
installieren. Nach einem Neustart des Systems lässt sich der neue Kernel im Boot-Menü auswählen. Sollte sich der neue Kernel nach einer Erprobungsphase bewährt haben, können Sie den alten Kernel mit folgendem Befehl aus dem System entfernen:
sudo dpkg -r kernel-image-<alteVersion>
Für den Anfang empfiehlt es sich jedoch, den alten Kernel parallel zum neuen beizubehalten, um sich nicht einer wichtigen Rettungsmöglichkeit zu berauben.
Tipp 234: Grafische Kernel-Konfiguration |
Abhängig von den am Anfang installierten Bibliotheken ist eine grafische Kernel-Konfiguration zum Beispiel für die GTK-Umgebung (GNOME bzw. Unity) möglich: |
sudo make gconfig |
Die entsprechenden Aufrufe für die Konsole bzw. die Qt-Oberfläche (KDE) lauten: |
sudo make menuconfig |
bzw.: |
sudo make xconfig |
Die Konfiguration des Kernels innerhalb der grafischen Oberfläche erfolgt nun durch einfaches (bei xconfig) bzw. doppeltes (bei gconfig) Anklicken der entsprechenden Optionen. Nach dem Fertigstellen der Konfiguration dürfen Sie nicht vergessen, die Änderungen zu sichern. |
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.