Linux-Kernel

Aus Mikiwiki
Zur Navigation springen Zur Suche springen

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. Ansonsten 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.

Linux-Kernel kompilieren unter Ubuntu 8.04 Hardy Heron

Die folgende Anleitung auf der Grundlage von http://wiki.ubuntuusers.de/Kernel funktioniert nur mit aus dem git-tree und mittels "apt-get source" heruntergeladenen Quellen, aber nicht mit Quellcode von http://www.kernel.org.

Compiler und Tools installieren

Es müssen folgende Pakete installiert sein:

  • fakeroot
  • build-essential
  • linux-kernel-devel
$ sudo apt-get install fakeroot build-essential linux-kernel-devel

Kernelquellen herunterladen

Nun wird in das Verzeichnis (hier "/usr/src") gewechselt, wo der Linux-Kernel gebaut werden soll. In diesem Verzeichnis liegen später auch die fertigen Pakete des selbstgebauten Linux-Kernels.

$ sudo mkdir /tmp/linuxkerneltest && cd /tmp/linuxkerneltest
$ sudo apt-get build-dep linux-image-$(uname -r)
$ apt-get source linux-image-$(uname -r)

Anschliessend sind im aktuellen Verzeichnis folgende Dateien (mit allenfalls anderen Versionsnummern) zu finden:

  • "linux_2.6.24.orig.tar.gz" (Quellcode des Linux-Kernels)
  • "linux_2.6.24-24.57.diff.gz" (Debian/Ubuntu-Patches zum Linux-Kernel)
  • "linux_2.6.24-24.57.dsc" (Beschreibung des Quellcode-Paketes)
  • "linux-2.6.24" (Verzeichnis mit dem entpackten und gepatchten Quellcode)

Ist eine aktuellere Version gewünscht, so ist der Linux-Kernel aus den Git-Archiven herunterzuladen werden. Dazu wird das Paket "git-core" benötigt.

$ sudo apt-get install git-core

Danach wird der folgende Befehl ausgeführt, der im aktuellen Verzeichnis das Verzeichnis "ubuntu-hardy" anlegt:

$ git clone git://kernel.ubuntu.com/ubuntu/ubuntu-hardy.git

Abhängig von der Verbindungsgeschwindigkeit kann das eine Weile dauern, da mehrere hundert Megabyte geladen werden müssen.

Ist bereits ein Linux-Kernel-Archiv vorhanden, so kann dieses wie folgt auf einige Megabytes verkleinert werden:

$ git clone --reference ubuntu-hardy/ \
    git://kernel.ubuntu.com/ubuntu/ubuntu-hardy.git

Nähere Informationen zur Verwendung von git für den Linux-Kernel finden sich unter https://wiki.ubuntu.com/KernelTeam/KernelGitGuide

Eigene Variante erstellen

Dieser Schritt ist nicht zwingend notwendig, denn natürlich kann auch eine der originalen Varianten verändert werden, sinnvoll ist es aber, um den eigenen Kernel mit dem originalen vergleichen zu können. In diesem Schritt wird auf der Grundlage von "generic" eine Variante "variante" erstellt. Dabei wird angenommen, dass auf einem 32-Bit-System gearbeitet wird. Auf einem 64-Bit-System muss "i386" durch "amd64" ersetzt werden.

Es müssen folgende Dateien und Verzeichnisse erstellt werden:

  • "debian/binary-custom.d/variante/config.i386" (Linux-Kernelkonfiguration der eigenen Variante)
  • "debian/binary-custom.d/variante/rules"
  • "debian/binary-custom.d/variante/vars"
  • "debian/binary-custom.d/variante/patchset" (Verzeichnis für Patche)
$ cd /tmp/linuxkerneltest/ubuntu-hardy
$ mkdir debian/binary-custom.d/variante
$ cat debian/config/i386/config.generic debian/config/i386/config > \
    debian/binary-custom.d/variante/config.i386
$ touch debian/binary-custom.d/variante/rules
$ touch debian/binary-custom.d/variante/vars
$ mkdir debian/binary-custom.d/variante/patchset

Linux-Kernel-Konfiguration ändern

Die Konfigurationsdateien des Linux-Kernels auf einem 32-Bit-System finden sich unter "debian/config/i386" (auf einem 64-Bit-System unter "debian/config/amd64"). Änderungen der Datei "config" betreffen alle Varianten der jeweiligen Architektur, Änderungen der anderen config-Dateien (z. B. "config.generic") betreffen nur die eine Variante. Die Änderungen können mit einem Texteditor durchgeführt werden, bequemer ist allerdings die Verwendung eines Konfigurationsprogramms.

Um keine Fehlermeldungen zu erhelaten, müssen zunächst einige Skripte ausführbar gemacht werden.

$ cd /tmp/linuxkerneltest/ubuntu-hardy
$ chmod +x debian/scripts/misc/*

Folgender Befehl dient zur Konfiguration sämtlicher Varianten aller Architekturen.

$ debian/rules editconfigs
dh_testdir
Processing i386 (i386) ... 
About to configure i386 config.386
...

Folgender Befehl verändert die Varianten einer einzelnen Architektur (hier "i386").

$ debian/scripts/misc/doconfig i386
Processing i386 (i386) ... 
About to configure i386 config.386
...

Das Skript verwendet zur Konfiguration die ncurses-basierte Oberfläche. Zur Verwendung des GTK- oder Qt-Konfigurationsprogramms kann im Skript "menuconfig" durch "xconfig" bzw. "gconfig" ersetzt werden. Dies kann entweder mit einem Texeditor oder einem folgenden Befehle erfolgen.

Für die grafische Qt-Oberfläche "xconfig" ist folgendes auszuführen (Voraussetzung ist das Paket "libqt3-mt-dev").

$ sudo apt-get install libqt3-mt-dev
$ cd debian/scripts/misc && sed 's/menuconfig/xconfig/' doconfig > \
    doconfig-qt && chmod 755 doconfig-qt
$ cd /tmp/linuxkerneltest/ubuntu-hardy
$ debian/scripts/misc/doconfig-qt i386

Für die GTK-Oberfläche "gconfig" lautet der Befehl:

$ cd debian/scripts/misc && sed 's/menuconfig/gconfig/' doconfig > doconfig-gtk
$ bash debian/scripts/misc/doconfig-gtk i386

Nachdem ein Patch angewendet oder die Konfiguration geändert wurde, sollte folgender Befehl ausgeführt werden, um sicherzustellen, dass die Konfiguration konsistent ist.

Für alle Architekturen:

$ debian/rules updateconfigs

Nur für eine Architektur (hier "i386"):

$ debian/scripts/misc/oldconfig i386

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
Wikipedia ger Linux (Kernel)wbm Enzyklopädischer Artikel
Linux Kernel Organization eng The Linux kernel archiveswbm
Digital Hermit (Kwan Lowe) eng Kernel rebuild guidewbm
Ubuntu eng Kernel compile howtowbm
Howtoforge ger Wie man einen Kernel kompiliert - Ubuntuwbm
Linux Kernel Newbies eng FAQwbm
Jens Kubieziel ger Linux Kernel 2.6 : deutsche Übersetzung des "The post-halloween document"wbm
Ubuntu Users ger Kernelwbm