Linux als SOHO-Server

für Linux- und Windows-Clients
http://linux.eusterholz.dyndns.org

Kapitel:

Home
Debian Installation
Debian Etc.
Internet-Zugang
Telnet
FTP
r-Utilities
SSH
Printing
NTP
Nameserver
NFS/NIS/Automount
Samba (SMB-Server)
Apache (WEB-Server)
Modem / ISDN
Backup
Etc.


Kernel

Partitionierung ] RAID ] LVM ] RAID1 + LVM ] Disk-Quotas ] Hardware-Information/Diagnose ] [ Kernel ]


Der Kernel ist das Herzstück eines Unix- bzw. Linux-Betriebssystems. Unter Debian GNU/Linux liegt der Kernel in verschiedenen Versionen als offizielles Paket (Standard-Kernel) vor, jedoch kann es manchmal sinnvoll sein einen eigenen Kernel zu verwenden. Gründe die für einen anderen Kernel können z.B. sein:

  • Unterstützung von speziellen Hardwaren, bzw. Erstellen von speziellen Modulen.
  • Erstellen eines optimierten Kernels, z.B. durch Entfernen von nicht benötigten Treibern (kleinerer Kernel; kürzere Boot-Zeit).
  • Verwendung eines aktuellen oder Entwicker-Kernels.
  • Einsatz eines monolithischen Kernels, statt eines modularen Kernels.
  • Ausnutzen der Kernel-Optionen, die vom Standard-Kernel nicht unterstützt werden (z.B 'high memory support').
  • Oder auch nur einfach mehr über Kernel lernen, kann auch eine Motivation sein.

Im Folgenden wird gezeigt, wie unter Debian-Linux ein neuer Kernel erstellt und installiert werden kann. Weiterhin wird kurz auf dazugehörige Dinge wie 'Header', 'Module' und 'Patches' eingegangen.

Vorgefertigte Kernel nutzen

Unter Debian können aus der Distribution heraus einige andere alternative vorgefertigte Kernel genutzt werden. Dabei kann zwischen unterschiedlichen Kerneln, die zumeist jeweils für die entsprechenden Prozessoren optimiert sind, gewählt werden. Mit dem Kommando 'apt-cache search --names-only linux-image' kann man sich die verfügbaren fertigen Kernels anzeigen lassen. Dabei fällt auf, dass es bei den Bezeichnungen für die Images Kurzbezeichnungen (z.B.: 'linux-image-2.6-686') und Langbezeichnungen (z.B.: 'linux-image-2.6-1-686') für den Kernel gibt. Bei den Kurzbezeichnung ist ein Meta-Paket gemeint, während die Langbezeichnung das eigentliche Kernel-Image ist. Wird das Meta-Paket installierst, wird bei einem 'dist-upgrade' automatisch ein evtl. neuer Kernel installiert (der alte bleibt natürlich erhalten). Ist das Meta-Paket nicht installiert ist, muss der Kernel-Upgrade manuell anstoßen werden.

Ein neuer Kernel kann dann einfach, wie unter Debian üblich, mittels 'apt-get install' installiert werden; z.B. mit:

apt-get install linux-image-2.6-686

wird ein 'Linux-Image 2.6 für PPro/Celeron/PII/PIII/P4' installiert.

Nach der Installation des Kernel-Pakets befinden sich der eigentliche Kernel ('vmlinuz-2.6.26-1-686'), die passende System-Map ('System.map-2.6.26-1-686') sowie die Konfigurationsdatei, mit der das Kernel-Image erzeugt wurde, ('config-2.6.26-1-686') im Verzeichnis '/boot'.

Auch wurden die zum Kernel gehörenden Module unter '/lib/modules/2.6.26-1-686' installiert, sowie ein entsprechende Eintrag zum Starten für den Boot-Loader (z.B.: 'GRUB') hinzugefügt.

Nach der Installation kann das System mit dem neu installierten fertigen Kernel gebootet werden.

Eigene Kernel/Module erstellen

Im Folgenden wird kurz gezeigt, wie nach Debian-Art,  aus den Kernel-Sourcen ein eigener Kernel generiert und installiert werden kann. Die Debian-Methode nutzt dazu eigene Tools, mit denen es wesentlich einfacher ist einen Kernel zu erstellen und zu installieren als mit der klassischen Methode unter Linux. Auf die klassische Methode wird auf dieser Seite nicht weiter eingegangen, sie kann leicht im Internet rechergiert werden.

Vorbereitungen zum Kernel-Bau

Zum Erstellen eines Kernels sind zunächst einige Vorbereitungen zu treffen, wie das zusätzliche Installieren von Software-Tools zur Kernel-Erstellung. Auf dem Rechner sollten mit 'apt-get install' zusätzlich folgende Pakete installiert werden:

apt-get install debhelper modutils kernel-package libncurses5-dev bzip2

Auch muss natürlich ein 'C'-Compiler und die nötigen Hilfsmittel ('make') vorhanden sein. Bei einer Standard-Installation von Debian sollte das jedoch der Fall sein.

Kernel erstellen

Nach dem alle Vorbereitungen bez. Kernel-Bau getroffen sind können als nächstes die 'Source-Code'-Quellen installiert werden, welches ebenfalls mit 'apt-get install' aus dem Debian-Archiv geschehen kann:

apt-get install kernel-source-x.y.z

Nach der Installation sind, die noch gepackten 'Sourcen' im Verzeichnis '/usr/src' zu entpacken:

cd /usr/src
tar --bzip2 -xvf kernel-source-x.y.z.tar.bz2

Nach dem Entpacken sollte ein neues Verzeichnis mit dem Namen 'kernel-source-x-y.z' unter '/usr/src/' vorliegen, indem sich nun die ausgepackten 'Sourcen' befinden.

Auch für das Kernel-Paket gibt es eine Konfigurationsdatei: '/etc/kernel-pkg.conf'. In dieser Datei sollen einige Eintragungen bez. der späteren Verwaltung des fertigen Kernels vorgenommen werden:

Auszug aus: /etc/kernel-pkg.conf

# This file is used by kernel-package (>2.0) to provide a means of the site
# admin to over-ride settings in the distributed debian/rules. Typically
# thus is used to set maintainer information, as well as the priority
# field. However, one may hack a full makefile in here (you should
# really know what you are doing here if you do that, though)

# Please change the maintainer information, as well as the Debian version
# below, (and maybe the priority as well, especially if you are uploading
# an official package)

# The maintainer information.
maintainer := Norbert Eusterholz
email := norbert@eusterholz.com

# Priority of this version (or urgency, as dchanges would call it)
priority := Low

# This is the Debian revision number (defaulted to 1.0 in debian/rules)
# You may leave it commented out if you use the wrapper script, or
# if you create just one kernel-image package per Linux kernel revision
# debian := 1.0

In der Datei sollte zumindest der Name ('maintainer') und die E-Mail-Adresse eingetragen werden. Weiteren mögliche Parameter und deren Bedeutung lassen sich auf der Manualseite zu 'kernel-pkg.conf' nachschlagen.

Als weitere Schritt sollte die eigentliche Kernel-Konfigurationsdatei '.config' ins Verzeichnis '/etc/src/kernel-x.y.z' abgelegt werden. Als quasi Vorlage kann eine ältere Konfigurationsdatei, z.B. von einem zuvor installierten Debian-Standard-Kernel dienen. Die '.config'-Vorlagen sollten sich im Verzeichnis '/boot/'config-x.y.z' befinden. Also am besten Folgendes:

cp /boot/config-x.y.z-a-abc /usr/src/kernel-source-x.y.z/.config

Mittels 'make oldconfig' wird die alte Konfigurationsdatei auf den neuen Kernel angepasst, es werden so evtl. neu hinzugekommenen Optionen berücksichtigt. Das 'make' sollte im Verzeichnis der 'Kernel-Sourcen' ausgeführt werden:

cd /usr/src/kernel-source-x.y.z
make oldconfig

Nun kann die eigentliche Konfiguration des Kernels erfolgen. Dazu kann auf der Konsole 'make menuconfig' eingegeben werden. Es sollte ungefähr folgendes Menü erscheinen:

Mittels den 'Cursor'-Tasten kann navigiert und  in die einzelnen Untermenüs gewechselt werden um die gewünschten Einstellungen/Änderungen zu tätigen. Zum Schluss sollte die neue Konfiguration vor dem Verlassen der Konfiguration gespeichert werden. Die neuen Einstellungen sollten dann in der Datei '/usr/src/kernel-source-x.y.z/.config' einfließen.
Alternativ zu 'make menuconfig' kann 'make config' für die rein textbasierte Benutzerschnittstelle oder falls 'X11' installiert ist auch 'make xconfig' zur Konfiguration genutzt werden.

Nun kann zur eigentlichen Kompilierung übergegangen werden, welches unter Debian dank des Paketes 'kernel-package' und dem Befehl 'make-kpkg' recht einfach ist. Der Kernel kann z.B. mit folgenden Kommandos kompiliert werden:

make-kpkg clean
make-kpkg --append_to_version -my-kernel --initrd --revision=rev.01 kernel_image

Vor der eigentlichen Kompilierung sollte noch ein 'clean' auf die 'Sourcen' angewendet werden.
Die Option '--append-to-version' fügt einen Extra-String zum Namen des Kernels hinzu. Dadurch kann beim Start des Systems die Kernel besser unterscheiden werden. Auch im laufenden Betrieb kann mit 'uname -r' sofort der Kernel identifiziert werden. Mit der Option '--revision' kann außerdem festgelegt werden, welche Version das Debian-Paket haben wird. Wird dieser Wert beim nächsten Kompilieren hoch gezählt (z.B. '--rev.02'), dann wird 'apt-get', dass daraus resultierende Debian-Pakete als Update auffassen. Der Parameter '--initrd' veranlasst einen Kernel zu bauen, der mittels RAM-Disk starten kann.
Natürlich kennt 'make-kpkg' noch weitere Parameter die auf der Manualseite oder im Internet beschrieben sind. Auch können die Parameter in der schon erwähnten Datei '/etc/kernel-pkg.conf' einfließen.

Nach Beendigung der Kompilierung, welches je nach Performance des Systems dauern kann, sollte im Verzeichnis '/usr/src/'  ein fertige Debian-Kernel-Paket z.B. 'kernel-image-x.y.z-....deb' nebst sämtlicher Module vorliegen. Das Paket kann nach Debian-Art einfach installiert werden:

cd /usr/src
dpkg -i kernel-image-x.y.z-*.deb

Auch kann das Kernel-Paket selbstverständlich auch auf unterschiedlichen Maschinen installiert werden.

Nach einen Restart (z.B. mit 'reboot') des Systems, sollte beim Boot-Manager (z.B. 'GRUB') der neue Kernel zusätzlich mit angeboten werden. Der erster Hochlauf mit den neuen Kernel sollte dann sorgsam beobachtet werden.

Kernel-Headers

Manche Programme oder Module, die später für das System bzw. den vorhanden Kernel kompiliert werden sollen, benötigen die Kernel-Sourcen. In vielen Fällen genügt es jedoch, wenn nur die Kernel-Headers vorhanden sind. Zu jedem Debian-Standard-Kerneln gibt es auch immer ein entsprechendes Kernel-Header-Paket, welches einfach nur eingespielt werden brauch ('apt-get install ...'). Dabei ist zu beachten, dass nur ein 'Header'-Paket verwendet werden darf, welches auch zur Kernel-Version passt. Ein fertiges 'Header'-Paket installiert man daher am besten wie folgt:

apt-get install linux-headers-'uname -r'

Mit 'uname -r' ist sichergestellt, dass die 'Headers' auch zum Kernel passen.

Hat man wie oben beschrieben einen eigenen Kernel erstellt, so ist es sinnvoll eine Kopie der Kernel-Header vorrätig zu haben. Ein 'Header'-Paket kann wie folget erstellt werden:

cd /usr/src/kernel-source-x.y.z/
make-kpkg --append_to_version -my-kernel --initrd --revision=rev.01 kernel_headers

Nach dem Erzeugen der 'kernel_headers', sollten diese auch als installierbares Debian-Paket unter '/usr/src/' vorliegen. Das 'Header'-Paket kann wie gewohnt unter Debian installiert werden:

cd /usr/src
dpkg -i kernel-headers-x.y.z-*.deb

Danach liegt ein Verzeichnis 'kernel-headers-x.y.z-...' vor, indem sich dann die eigentlichen 'Headers' befinden. Um Festplattenkapazität zu sparen, können evtl. die eigentlichen 'Sourcen' unter 'kernel-source-x.y.z-...' gelöst werden.

Kernel Dokumentation

Eine weitere Option von 'make-kpkg' ist 'kernel_doc', mit der eine Dokumentation für den Kernel erstellt werden kann. Die Option 'kernel_doc' kann wie folgt angewendet werden:

cd /usr/src/kernel-source-x.y.z/
make-kpkg --append_to_version -my-kernel --initrd --revision=rev.01 kernel_doc

Als Ergebnis werden unter '/usr/src/kernel-source-x.y.z/Documentation' die Dokumentation zum Kernel erzeugt, zusätzlich wird unter '/usr/src/' ein auch später installierbares Debian-Paket 'kernel-doc-2.6.8-....deb' abgelegt.

Module erstellen

Viel häufiger, als ein neuer Kernel, werden neue oder veränderte Kernel-Module benötigt. Kernel-Module sind Gerätetreiber, die als separates Modul vorliegen und bei laufenden System eingebunden und wieder entfernt werden können. Beispiele hierfür sind z.B.: ISDN- oder Grafikkarten-Treiber, die später als Module im Kernel eingebunden werden. Der 'Source'-Code der Module sollten ebenfalls im Verzeichnis '/usr/src/' abgelegt werden, in der Regel handelt es sich hierbei um 'tar.gz'- oder 'tar.bz2'-Archive. Nach dem Entpacken der Archive sollten sich die 'Sourcen' im Verzeichnis '/usr/src/modules' befinden. Die Module können als Debian-Paket dann wie folgt erzeugt werden:

cd /usr/src/kernel-source-x.y.z/
make-kpkg --append_to_version -my-kernel --initrd --revision=rev.01 modules_image

Mit dem Target 'modules-image' können alle dort abgelegten Treiber- bzw. Modul-Quellen passend zum jeweiligen Kernel übersetzen werden. 'make-kpkg' erzeugt für jedes dieser installierten Quellpakete ein eigenes Paket, das sich, wenn der passende Kernel auf einem System vorhanden ist, dann zusätzlich dort einrichten lässt. Wichtig ist, dass für den 'make-kpkg'-Aufruf die gleichen Parameter verwendet werden wie für den Kernel auch, sonst lässt sich ein aus den Modul-Quellen erzeugtes Paket nicht installieren.

Eventuell muss vor der Erstellung der Modulen noch ein Pfad zu den Kernel-Sourcen mit angegeben werden ('KSRC'-Variable). Es sollte diesbezüglich die Dokumentation (ReadMe) zum Modul-Source-Paket gelesen werden.

Nach der Erstellung der Module mit 'make-kpkg' sollten Modul-Pakete ('.deb') unter '/usr/src/' vorliegen. Die Modul-Pakete können wie gewohnt installiert werden, die fertigen Module liegen nach der Installation in '/lib/modules/x.y.z.../'.

Kernel-Patches

In den meisten Fällen möchte man nur einen Kernel aus den aktuellen Quellen erstellen. Es gibt aber auch Fälle, wo zusätzliche Funktionalität oder Korrekturen eingebaut werden müssen. Dabei kommen vielfach 'Patches' (Flicken) zum Einsatz. Unter Debian gibt es separate Pakete die als Kernel-Patch-Pakete verpackt sind. Um nach Kernel-Patches unter Debian zu suchen verwendet man am besten 'apt-cache search', z.B:

apt-cache search kernel-patch
...
kernel-patch-atopcnt - additional statistical counters for atop
kernel-patch-badram - Kernel patch allowing to use partly-bad RAM modules
kernel-patch-debianlogo - Display a Debian logo on a framebuffer device at boottime
kernel-patch-evms - Enterprise Volume Management System (kernel patches)
kernel-patch-freeswan - IPSEC kernel support for FreeSWan
...

Hat man sich für einen notwendigen Kernel-Patch entschieden, so kann dieser einfach mit 'apt-get install' installiert werden, z.B.:

apt-get install kernel-patch-debianlogo

Die Patch-Pakete werden ausgepackt und an den korrekten Ort abgelegt (nach '/usr/src/kernel-patches').

cd /usr/src/kernel-source-x.y.z/
make-kpkg --append_to_version -my-kernel --initrd --revision=rev.01 --added-patches debianlogo kernel-image

Dabei gibt '--added-patches' an, mit welchen der installierten 'Patches' der Kernel zu behandeln ist, in diesem Beispiel 'kernel-patch-debianlogo'.

Nach Fertigstellung des neuen Kernel-Paketes kann dieses wie oben beschrieben installiert werden.

Auch werden Kernel-Patches als 'diff'-Dateien bereitgestellt. Angenommen, es wurde ein Patch 'my-patch.diff' herunter geladen und unter '/usr/src/' gespeichert, so sollte zunächst getestet werden ob dieser passt:

cd /usr/src/kernel-source-x.y.z/
patch -p1 --dry-run < ../my-patch.diff

Mit der Option '--dry-run' kann zunächst ausprobiert werden was der 'Patch' macht, ohne an den 'Sourcen' des Kernels etwas zu verändern. Es wird zunächst nur die Anwendung des 'Patches' geprüft.

Sollte 'patch' keinen Fehler melden, kann richtig ge-patcht werden:

patch -p1 < ../my-patch.diff

Je nach Herkunft kann es sein, dass man statt dem Parameter 'p1' eher 'p0' nutzen sollte.

Anmerkungen

Um einen installierten Kernel nach Debian-Art wieder zu entfernen kann einfach folgender Befehl verwendet werden:

dpkg -P kernel-image-x.y.z-*

Kommt es zu einer Meldung, dass z.B. '/lib/modules/x.y.z-*' nicht leer ist, sollten zunächst die Module deinstalliert werden, z.B.:

dpkg -P ???-modules*

Auch kann evtl. das Modul-Verzeichnis gelöscht werden.

Beim Kompilieren und Einsetzen eines neuen Kernels sollte auf jeden Fall eine Möglichkeit vorgesehen werden um mit dem alten Kernel weiterhin starten zu können. Auch sollet sichergestellt werden, dass zumindest bei Problemen die Daten auf dem System erreichbar sind, es kann nicht schaden zuvor ein Backup des Systems durchzuführen.

Weitere Infos

Creating custom kernels with Debian's kernel-package system http://newbiedoc.sourceforge.net/system/kernel-pkg.html.en
Linux Kernel HOWTO http://www.linuxhaven.de/dlhp/HOWTO/DE-Kernel-HOWTO.html
Linux Kernel HOWTO http://www.thomashertweck.de/kernel.html
The Linux Kernel Archives http://www.kernel.org/
Manualseiten zu: make-kpkg; kernel-pkg.conf man make-kpkg, man kernel-pkg.conf
Manualseiten zu: dpkg man dpkg
Manualseite zu: patch man patch
System-Dokumentation: kernel /usr/share/doc/kernel-*

Home ] Nach oben ] Partitionierung ] RAID ] LVM ] RAID1 + LVM ] Disk-Quotas ] Hardware-Information/Diagnose ] [ Kernel ]

letzte Änderung: 16. Februar 2009

 

Copyright © 2004 Norbert Eusterholz