Linux-Kernel: Unterschied zwischen den Versionen

Aus Mikiwiki
Wechseln zu: Navigation, Suche
(Linux-Kernel kompilieren)
(Linux-Kernel kompilieren)
Zeile 23: Zeile 23:
 
== Linux-Kernel kompilieren ==
 
== Linux-Kernel kompilieren ==
  
Gründe für einen neuen Kernel gibt es viele:
+
Manchmal wird ein angepasster Linux-Kernel mit zusätzlichen Eigenschaften benötigt:
 
* Die Behebung von Sicherheitslöchern aus älteren Versionen.
 
* Die Behebung von Sicherheitslöchern aus älteren Versionen.
 
* Unterstützung neuer Hardware und Protokolle. Beispielsweise brachte die Linux-Kernel-Version 2.6.x folgende Erweiterungen: USB 2.0, Linux auf Notebooks, SATA, VPN, erweiterte Energieverwaltung und eine neue Audioschnittstelle.
 
* Unterstützung neuer Hardware und Protokolle. Beispielsweise brachte die Linux-Kernel-Version 2.6.x folgende Erweiterungen: USB 2.0, Linux auf Notebooks, SATA, VPN, erweiterte Energieverwaltung und eine neue Audioschnittstelle.
 +
* Ein bisher dynamisch zu ladender Treiber soll fest eingebaut werden.
 
* Interesse des Anwenders und Lerneffekt.
 
* Interesse des Anwenders und Lerneffekt.
  
Zur Installation eines eigenen Linux-Kernels werden die Quelldateien (Sourcen) aus den [http://www.kernel.org/ Linux kernel archives] benötigt. Beim Herunterladen sollte aber nicht der ins Auge springende Hyperlink, sondern der Buchstabe "F" (full sources) gewählt werden.
+
In einem solchen Fall muss der eigene Linux-Kernel aus den Quellen kompiliert werden. Dazu werden üblicherweise die Quelldateien (Sourcen) aus den [http://www.kernel.org/ Linux kernel archives] benötigt. Beim Herunterladen sollte aber nicht der ins Auge springende Hyperlink, sondern der Buchstabe "F" (full sources) gewählt werden.
  
 
Zum Kompilieren eines Linux-Kernels gibt es mehrere Möglichkeiten, in jedem Fall aber sind [[root]]-Rechte erforderlich. Einige ältere Linux-Versionen legen beim Entpacken das Unterverzeichnis "linux" an - gibt es bereits ein solches Verzeichnis oder einen symbolischen Link, so werden diese überschrieben. Deshalb sollte ein allfällig vorhandenes Verzeichnis "linux" zuvor umbenannt werden - es kann später gelöscht werden, wenn klar ist, dass es wirklich nicht mehr benötigt wird.
 
Zum Kompilieren eines Linux-Kernels gibt es mehrere Möglichkeiten, in jedem Fall aber sind [[root]]-Rechte erforderlich. Einige ältere Linux-Versionen legen beim Entpacken das Unterverzeichnis "linux" an - gibt es bereits ein solches Verzeichnis oder einen symbolischen Link, so werden diese überschrieben. Deshalb sollte ein allfällig vorhandenes Verzeichnis "linux" zuvor umbenannt werden - es kann später gelöscht werden, wenn klar ist, dass es wirklich nicht mehr benötigt wird.

Version vom 1. August 2009, 15:44 Uhr

Der Linux-Kernel wird seit 1991 von Linux Torvalds entwickelt und unter der freien GNU General Public License veröffentlicht. Die inzwischen von Torvalds herausgegebene Fassung enthält allerdings proprietäre BLOBs und ist daher nicht mehr frei; Richard Stallman bezweifelt sogar, dass sie legal kopiert werden darf, da diese BLOBs im Widerspruch zur GPL stehen und die Rechte aus der GPL daher erlöschen. Die Free Software Foundation rät deshalb dazu, nur BLOB-freie Versionen von des Linux-Kernels einzusetzen, bei der diese Bestandteile entfernt wurden. Der Linux-Kernel findet in einer Vielzahl von Linux-Distributionen seine Anwendung.

Ursprünglich bezeichnete der Begriff Linux lediglich den von Linus Torvalds veröffentlichten Kernel, mittlerweile sind damit umgangssprachlich oft sowohl der Linux-Kernel, Linux-Distributionen wie auch Linux-Kernel-basierte Betriebssysteme gemeint - im Mikiwiki ist mit "Linux" aus Unterscheidungsgründen ein Linux-Kernel-basiertes Betriebssystem gemeint.

Konzept

Der Linux-Kernel besteht grundsätzlich aus zwei Teilen:

  • der Kernel selbst (eine etwa 1 MB grosse Datei).
  • die Kernelmodule, welche die Funktionalität des Kernels bei Bedarf erweitern.

Kernel und Kernelmodule müssen zusammenpassen, deshalb werden sie mit einer Versionsnummer gekennzeichnet, die aus vier durch Punkte getrennten Elementen besteht: Version, Patchlevel, Sublevel und Extraversion. Die Bezeichnung "2.6.24-24" besagt also Linux-Kernel-Version 2, Patchlevel 6, Sublevel 24 und Extraversion 24. Beim Patchlevel werden stabile Versionen (engl. stable) durch gerade, Entwickler-Kernel durch ungerade Zahlen bezeichnet. Die Extraversion kennzeichnet Änderungen zum offiziellen Linux-Kernel, beispielsweise hängen an den Linux-Kernel-Varianten des Programmierers Alan Cox seine Initialen "ac".

Die Quelldateien des Linux-Kernels befinden sich nach dem Entpacken im Verzeichnis "/usr/src". Ausgehend von diesem Verzeichnis gibt es mehrere Möglichkeiten:

  • "linux"
  • "linux-2.6" (alternativ "linux-2.4")
  • "linux-2.x.x" (mit symbolischem Link "linux" auf dieses Verzeichnis)
  • "linux-headers-2.6.x-x" (bei Ubuntu)

Der fertige Linux-Kernel liegt als Datei im Verzeichnis "/boot" oder direkt unter "/". Typische Dateinamen sind "vmlinux", "vmlinuz", "vmlinuz-x.x.x-x" oder "bzImage-x.x.x". Das "z" im Namen steht dafür, dass die Datei komprimiert ist. Ohne eine solche Datenkompression liessen sich grosse Linux-Kernel auf älteren Rechnern gar nicht booten, da es dort häufig Grössenbeschränkungen gibt.

Die zum jeweiligen Linux-Kernel gehörenden Kernelmodule finden sich im Verzeichnis "/lib/modules", wo jede Linux-Kernel-Version ein eigenes Unterverzeichnis besitzt. Auf diese Weise können mehrere Versionen des Linux-Kernels gleichzeitig vorhanden sein.

Linux-Kernel kompilieren

Manchmal wird ein angepasster Linux-Kernel mit zusätzlichen Eigenschaften benötigt:

  • Die Behebung von Sicherheitslöchern aus älteren Versionen.
  • Unterstützung neuer Hardware und Protokolle. Beispielsweise brachte die Linux-Kernel-Version 2.6.x folgende Erweiterungen: USB 2.0, Linux auf Notebooks, SATA, VPN, erweiterte Energieverwaltung und eine neue Audioschnittstelle.
  • Ein bisher dynamisch zu ladender Treiber soll fest eingebaut werden.
  • Interesse des Anwenders und Lerneffekt.

In einem solchen Fall muss der eigene Linux-Kernel aus den Quellen kompiliert werden. Dazu werden üblicherweise die Quelldateien (Sourcen) aus den Linux kernel archives benötigt. Beim Herunterladen sollte aber nicht der ins Auge springende Hyperlink, sondern der Buchstabe "F" (full sources) gewählt werden.

Zum Kompilieren eines Linux-Kernels gibt es mehrere Möglichkeiten, in jedem Fall aber sind root-Rechte erforderlich. Einige ältere Linux-Versionen legen beim Entpacken das Unterverzeichnis "linux" an - gibt es bereits ein solches Verzeichnis oder einen symbolischen Link, so werden diese überschrieben. Deshalb sollte ein allfällig vorhandenes Verzeichnis "linux" zuvor umbenannt werden - es kann später gelöscht werden, wenn klar ist, dass es wirklich nicht mehr benötigt wird.

Entpacken der Linux-Kernel-Quelldateien ins Verzeichnis "/usr/src".

$ sudo tar xjf linux-2.6.30.4.tar.bz2 -C /usr/src

Bei Bedarf muss ein symbolischer Link angelegt werden.

$ cd /usr/src
$ sudo ln -s linux-2.6.30.4 linux

Wechsel ins neue Verzeichnis mit den Linux-Kernel-Quelldateien.

$ cd /usr/src/linux

Im Verzeichnis "/usr/src/linux" liegen mindestens zwei interessante Dateien:

  • "README" beschreibt, wie ein Linux-Kernel konfiguriert und kompiliert wird.
  • "Changes" im UNterverzeichnis "Documentation" führt die zum Kompilieren benötigten Programme auf und dokumentiert Änderungen gegenüber früheren Versionen.

Die wichtigsten Werkzeuge zum Kompilieren eines Linux-Kernels 2.6 sind die folgenden:

Programm Version Versionsüberprüfung
GNU C-Compiler 1.95.3 gcc --version
GNU make 3.78 make --version
GNU Binutils 2.12 ld -v
Util-Linux 2.100 fdformat --version
Module-Init-Tools 0.9.10 depmod -v

Der neue Linux-Kernel muss natürlich auch zum eigenen Rechner passen, dessen Hardwarebestandteile also bekannt sein müssen. Es muss nicht unbedingt jedes Stück Hardware im Linux-Kernel eingestellt werden, aber je mehr Informationen über den Rechner vorliegen, desto gezielter kann der Linux-Kernel konfiguriert werden.

  • lspci zeigt die vorhandenen PCI-Geräte.
  • lsmod zeigt eine Liste der geladenen Kernelmodule
  • "cat /proc/cpuinfo" zeigt Angaben zum vorhandenen Prozessor.

Bevor der Linux-Kernel nun kompiliert werden kann, werden seine einzelnen Komponenten konfiguriert. Vor der eigentlichen Konfiguration empfiehlt es sich, mit dem folgenden Befehl bestehende Konfigurations- und temporäre Dateien zu löschen:

$ sudo make mrproper

Zum Konfigurieren gibt es mehrere Varianten. Die grafischen Varianten zeigen zu jedem Punkt die englischen Hilfetexte, wobei zwischen mehreren Ansichten gewählt werden kann.

Befehl Beschreibung
make menuconfig Basiert auf dem Textmodus und kann von der Konsole aus verwendet werden. Voraussetzung sind die Pakete "ncurses-5.3-4" und "ncurses-devel-5.3-4".
make gconfig Grafische Oberfläche auf der Grundlage der GTK-Bibliotheken.
make xconfig Grafische Oberfläche auf der Grundlage der Qt-Bibliotheken.

Pro Menüpunkt gibt es jeweils höchstens drei Auswahlmöglichkeiten:

  • Beim Ausschalten des Eintrags wird der fertige Linux-Kernel die abgewählte Eigenschaft nicht unterstützen.
  • Beim festen Einschalten wird der Linux-Kernel die Eigenschaft unterstützen.
  • Bei der Auswahl als Kernelmodul wird das Modul nur bei Bedarf nachgeladen, spart also Arbeitsspeicher.

Das Dateisystemtyp der Root-Partition sollte fest in den Linux-Kernel eingebaut werden, denn er muss kurz nach dem Start das Root-Dateisystem einhängen. Alternativ dazu kann eine RAM-Disk verwendet werden: Dabei handelt es sich um eine virtuelle Festplatte im Arbeitsspeicher, die der Linux-Kernel beim Bootvorgang anstelle einer physikalischen Festplatte als Root-Dateisystem verwendet. Diese Lösung ist allerdings kernelabhängig und muss für die neue Version erst erstellt werden.

Folgende Liste gibt einige Tips zur Konfiguration des Linux-Kernels.

Eintrag Beschreibung
General Setup Grundlegende Systemeinstellung. Es empfiehlt sich die Einstellung von ".config support", denn so kann später die Linux-Kernel-Konfiguration über die Datei "proc/config.gz" ausgelesen werden.
Processor type and features Festlegung des Prozessortyps. Eine falsche Auswahl kann dazu führen, dass der Linux-Kernel nicht bootet. Im Zweifelsfall sollte "586/..." gewählt werden, das funktioniert ab der Pentium-Generation sowohl für Intel wie auch AMD. Der Prozessor des eigenen Rechners kann mit "cat /proc/cpuinfo" ermittelt werden.
Power management options (ACPI/APM) Stromsparfunktionen. Der Linux-Kernel 2.6.x unterstützt APM und ACPI. Letzteres funktioniert allerdings nicht auf allen Rechnern fehlerfrei. Besonders Notebook-Benutzer sollten zuerst APM einstellen. Sind beide als Kernelmodul ausgewählt, so verwendet der Linux-Kernel den Modus, der zuerst geladen wurde.
Device Drivers > Plug and Play support Bei einem modernen Rechner sollten ISA- und BIOS-Plug-and-Play-Support erst einmal deaktiviert werden. Beide Einstellungen verhinderten auf einem Testrechner (Sony-Notebook) das Booten des Linux-Kernels.
Device Drivers > ISDN subsystem ISDN-UNterstützung. Die standardisierte Programmierschnittstelle CAPI 2.0 sollte nur eingeschaltet werden, wenn die ISDN-Programme mit CAPI umgehen können. Ansosnten ist die Verwendung von "Old ISDN4Linux" anzuraten.
Device Drivers > Sound Der Linux-Kernel 2.6 führt als neuen Audiostandard ALSA ein, unterstützt aber weiterhin das ältere OSS. Zur Verwendung von ALSA sind nach dem Start des Kernels mitunter weitere Einstellungen notwendig. Informationen dazu finden sich in der Linux-Kernel-Dokumentation "Documentation/sound/alsa". ALSA unterstützt eine OSS-Emulation, sodass auch ältere Anwendungsprogramme mit dem neuen Audiosystem arbeiten. Für die ersten Versuche ist die Verwendung von OSS anzuraten. Es ist darauf zu achten, bei der Kernelkonfiguration sie passende Audiohardware auszuwählen. Im Zweifelsfall sollten alle verfügbaren Soundchips als Kernelmodule ausgewählt werden. Zu beachten ist ausserdem, dass einige Fernsehkarten einen eigenen Soundchip mitbringen.
Device Drivers > I2C I2C-basierende Chips kommen häufig auf Hauptplatinen, Audio-, Video- und Fernsehkarten zum Einsatz. Es empfiehlt sich, sie als Kernelmodul auszuwählen.
Device Drivers > USB support Universal Serial Bus: Standardmässig ist nur der EHCI HCD-Treiber aktiviert. Dieser unterstützt USB 2.0. Bei Rechnern, die nur USB 1.1 unterstützen, muss der Punkt "UHCI HCD" aktiviert werden.
Device Drivers > USB support > USB ,,, full HID support Die Menüpunkte "Keyboard" und "Maus" werden aktiviert, wenn der Rechner mit einer USB-Tastatur oder -Maus ausgestattet ist. Diese Komponenten können nicht als Kernelmodule eingebunden werden.
File systems Auswahl der unterstützten Dateisysteme. Wichtig ist vor allem, dass das Dateisystem der Root-Partition "/" fest im Linux-Kernel integriert sein muss - ein Einbinden als Kernelmodul reicht nicht.
File systems > DOS/FAT/NAT Filesystems Unterstützung von Nicht-Linux-Dateisystemen. Wird auf demselben Rechner Microsoft Windows verwendet, so kann mit diesen Einstellungen auf DOS- und Windows-Festplatten zugegriffen werden. Für Windows 2000 unterstützt der Linux-Kernel auch NTFS, doch ist der Schreibzugriff nicht ganz ausgereift.

Die Einstellungen der Linux-Kernel-Konfiguration werden in der Datei ".config" gespeichert, die allerdings durch einen Aufruf von "make mrproper" gelöscht wird. Um das zu verhindern, kann sie unter einem anderen Namen gespeichert (hier "myconfig") und von Hand kopiert werden.

$ sudo cp myconfig .config

Mit den folgenden Befehlen werden für den Linux-Kernel 2.6.x die passenden Kernelmodule kompiliert und installiert.

$ sudo make bzImage
$ sudo make modules
$ sudo make modules_install

Wahlweise kann auch alles in einer Zeile erledigt werden.

$ sudo make bzImage modules modules_install

Wurde alles fehlerfrei abgeschlossen, so liegt der neue Linux-Kernel "bzImage" im Unterverzeichnis "arch/i386/boot". Die Datei "bzImage" wird nun an die richtige Stelle kopiert, typischerweise "/boot" oder das Root-Verzeichnis "/". Das folgende Beispiel kopiert den Linux-Kernel und hängt dabei die Versionsnummer an.

$ cp arch/i386/boot/bzImage /boot/bzImage-2.6.6

Jetzt fehlt noch der Eintrag für den Bootloader. Auf eine RAM-Disk sollte zumindest für den ersten Start verzichtet werden, ebenso auf den (unter RED Hat üblichen) Eintrag "root=LABEL=xx". Der neue Linux-Kernel wird zusätzlich zu den bereits vorhandenen Versionen eingetragen, so kann im Fehlerfall eine ältere und funktionierende Version gestartet werden. Ein Eintrag in der GRUB-Konfigurationsdatei sieht beispielsweise wie folgt aus:

title           Linux (2.6.6)
root            (hd1,0)
kernel          /boot/bzImage-2.6.6 ro

Beim Neustart des Rechners steht danach der neue Menüpunkt "Linux (2.6.6)" zur Verfügung. Gibt es Probleme (Linux-Kernel bootet nicht oder eine Unmenge von Fehlermeldungen), so sollten erst die Fehlermeldungen angesehen werden - insbesondere die letzte; dmesg zeigt die Meldungen des jeweils letzten Kernelstarts. Aschliessend wird wieder der "alte" Linux-Kernel gebootet. Danach kann wie bereits beschrieben der Linux-Kernel erneut konfiguriert, kompiliert und installiert werden. So werden schrittweise alle Fehler beseitigt, bis der neue Linux-Kernel problemlos bootet.

Womöglich wird beim Neustart auf das Fehlen von Hardwarekomponenten hingewiesen - in diesem Fall sollten die alten Einstellungen beibehalten werden. Dazu ein Hinweis: Der Aufruf von "make mrproper" aus dem Quellverzeichnis heraus löscht auch die aktuelle Konfigurationsdatei ".config". Um die Dateien der letzten Kompilierung zu löschen, aber die Datei ".config" zu erhalten, wird stattdessen "make clean" verwendet.

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen