5.2 Debian Kernel-Pakete erzeugen

Auf einem Debian GNU/Linux-System gibt es grundsätzlich zwei verschiedene Verfahren, um einen individuellen Kernel zu erzeugen. Zunächst ist es natürlich möglich, alle Arbeitsschritte auf klassischem Wege zu Fuß, wie auf jedem anderen Linux-System, durchzuführen. Die elegantere Methode ist es jedoch, ein eigenes Debian-Kernel-Paket zu erzeugen und dieses zu installieren.

Sehen wir uns zunächst die etwas elegantere Debian Methode an; die klassische Methode werden wir später besprechen.

5.2.1 Debian Kernel erzeugen (kernel-package)

Das Paket kernel-package unterstützt den Administrator bei der Verwaltung von individuellen Linux-Kerneln auf seinem System.

Sicherlich haben Sie schon die bei Debian GNU/Linux mitgelieferten Kernel-Pakete entdeckt. Diese sind so konfiguriert, dass sie auf den meisten Systemen funktionsfähig sind. Trotzdem ist es manchmal notwendig, einen eigenen Kernel zu übersetzen, um neue Hardware einzubinden oder um Hardware-Konflikte zu umgehen. Sie können hierbei das Paket kernel-package zu Hilfe nehmen. Dieses erzeugt ein Debian Paket mit einem individuellen Kernel und allen Modulen für Ihr System.

Zunächst benötigen Sie, neben dem Paket kernel-package, das Sie schon installieren können, ein Paket mit dem gewünschten Kernel-Quellcode (Source). Es stehen einerseits Debian Pakete mit dem Quellcode des Kernels zur Verfügung (Paketname linux-source-2.x.xx), welche mit apt-get installiert werden können. Es können aber auch die Original Kernel-Quellen verwendet werden. Sie finden die Archive unter ftp://ftp.kernel.org oder auf den Spiegelservern in Deutschland: ftp://ftp.de.kernel.org oder ftp://ftp2.de.kernel.org.

[Tipp]Aktuelle Kernel-Version herausfinden

Wenn Sie sich nicht per FTP durch die Verzeichnisse auf dem Kernel-Server wühlen möchten, um nachzusehen, ob es eine neue Version gibt, können Sie auf der Webseite www.kernel.org/finger_banner die aktuellen Versionen direkt abrufen.

The latest mainline 3 version of the Linux kernel is:         3.11-rc5
The latest stable 3.10 version of the Linux kernel is:        3.10.7
The latest stable 3.9 version of the Linux kernel is:         3.9.11 (EOL)
The latest longterm 3.4 version of the Linux kernel is:       3.4.58
The latest longterm 3.2 version of the Linux kernel is:       3.2.50
The latest longterm 3.0 version of the Linux kernel is:       3.0.91
The latest longterm 2.6.34 version of the Linux kernel is:    2.6.34.14
The latest longterm 2.6.32 version of the Linux kernel is:    2.6.32.61
The latest linux-next version of the Linux kernel is:         next-20130816

Weiter benötigen Sie einige zusätzliche Pakete, um einen neuen Kernel zu übersetzen, dies sind: gcc, libc5-dev oder besser (weil aktueller) libc6-dev, binutils, make, gawk oder mawk, gzip, shellutils, grep sowie bin86 auf der i386-Plattform. Wenn Sie das Kommando make menuconfig zur Kernel-Konfiguration benutzen möchten, muss das Paket libncurses5-dev installiert sein. Aber sicher haben Sie einige davon bereits installiert.

Wenn die notwendigen Pakete installiert sind, entpacken Sie die Kernel-Quellen; üblicherweise geschieht dies unter /usr/src/.

Wenn Debian Kernel-Source-Pakete verwendet werden, so befindet sich das zu entpackende Archiv bereits im Verzeichnis /usr/src/. Natürlich kann auch jeder andere Linux-Kernel-Source verwendet werden.

Beim Entpacken der Sourcen ist darauf zu achten, dass das Verzeichnis /usr/src/linux/ nicht durch Inhalte aus dem Archiv überschrieben wird. Wenn Sie verschiedene Kernel-Versionen verwalten wollen, empfiehlt es sich, das Verzeichnis /usr/src/linux/ umzubenennen, beispielsweise in linux-source-2.4.31.

Sorgen Sie auch dafür, dass das Verzeichnis /usr/src/ auf einer Partition mit ausreichend Platz angelegt ist. Die aktuellen Kernel-Archive in der Version 2.6 sind in gepackter Form ca. 40-50 MByte (je nach verwendetem Komprimierungsprogramm) groß und nehmen im entpackten Zustand ca. 220 MByte ein, wenn alles übersetzt ist - und zwar pro entpackter Kernel-Version!

Wechseln Sie nun in das Verzeichnis, in dem die Kernel-Quellcodes liegen.

Der Name eines Debian GNU/Linux-Kernel-Pakets besteht immer aus dem Basisnamen (hier: linux-image), der Versionsnummer des Kernels (zum Beispiel 2.6.18, diese wird aus dem Kernel-Makefile ermittelt) und der so genannten Revisionsnummer; Letztere können Sie individuell vergeben (über die Option --revision, die Sie dem Programm make-kpkg übergeben können). Sie sollten diese Revisionsnummer eindeutig wählen, um zu verhindern, dass ein bereits installierter Kernel überschrieben wird. Weiterhin darf das Zeichen _ (Unterstrich) nicht verwendet werden. Alternativ können Sie auch die Umgebungsvariable DEBIAN_REVISION auf den gewünschten Wert setzen.

Sie sollten die Revisionsnummer bei jedem neuen Kernel erhöhen; das Debian Paketsystem kann so automatisch ein Update durchführen.

Auch für das Paket kernel-package gibt es natürlich eine Konfigurationsdatei; diese finden Sie wie üblich im Verzeichnis /etc/ als kernel-pkg.conf. Üblicherweise sollten Sie dort mindestens Ihren Namen sowie die E-Mail-Adresse angeben. Sie können so immer feststellen, dass dieses Paket kein Original Debian Paket ist. Sie können, wenn nötig, noch weitere Variablen in dieser Datei benutzen. Momentan werden folgende Optionen unterstützt:

  • maintainer: Der Betreuer dieses Kernel-Pakets. Wenn Sie hier einen Apostroph (') verwenden möchten, so müssen Sie dieses wie folgt angeben: John O'\''Brien.

  • email: Ihre E-Mail-Adresse.

  • pgp: Der Name, der in der PGP-Datenbank gesucht werden soll. Normalerweise wird hier der Maintainer automatisch eingesetzt. Sie können dies auch mit der Umgebungsvariablen PGP_SIGNATURE überschreiben.

  • debian: Die Revisionsnummer des Pakets; der Standardwert ist 1.00. Sie können die Umgebungsvariable DEBIAN_REVISION benutzen.

  • image_in_boot: Wenn Sie diese Variable auf TRUE setzen, wird der Kernel im Verzeichnis /boot/ abgelegt und ein entsprechender symbolischer Link angelegt, anstatt wie sonst üblich den Kernel direkt in das root-Verzeichnis (/) zu kopieren. Dies kann auch über die Umgebungsvariable IMAGE_IN_BOOT gesetzt werden.

  • kimage: Typ des Kernel-Images, zum Beispiel zImage oder bzImage; der Standardwert ist bzImage. Dieser Wert kann über die Umgebungsvariable IMAGE_TYPE gesetzt werden.

  • no_symlink: Kann nicht zusammen mit reverse_symlink verwendet werden. Sinnvoll kann diese Option im Zusammenspiel mit image_in_boot verwendet werden. Bei Verwendung der Option no_symlink wird das Kernel-Image immer als Datei vmlinuz abgelegt (und nicht als /boot/vmlinuz-x.x.xx). Ein bereits existierendes Kernel-Image wird in jedem Fall (und nicht nur, wenn es sich vom neuen Kernel-Image unterscheidet) in vmlinuz.old umbenannt. Dieses bringt eine Beschränkung auf zwei Kernel-Images mit sich; weitere Versionen müssen dann von Hand eingepflegt werden. Diese Option kann auf Systemen eingesetzt werden, die keine symbolischen Links unterstützen, beispielsweise wenn loadlin eingesetzt wird. Diese Option ist aber eher als Hack zu betrachten.

  • reverse_symlinks: Beschreibt, ob für das Kernel-Image ohne Versionsnummer ein symbolischer Link (mit Versionsnummer) angelegt werden soll. Diese Option wird von einer gesetzten Umgebungsvariablen REVERSE_SYMLINK überschrieben. Weiterhin kann diese Option nicht zusammen mit no_symlinks verwendet werden, wohl aber mit link_in_boot. Wie bei der Option no_symlink besteht hierbei eine Beschränkung auf zwei Kernel-Images, wenn nicht weitere Kernel-Images von Hand gepflegt werden. Diese Option sollte nur genutzt werden, wenn es zwingend erforderlich ist, beispielsweise bei der Verwendung eines umsdos-Dateisystems auf der /boot-Partition.

  • patch_the_kernel: Diese Variable ist nur für Experten gedacht. Wird diese Variable auf den Wert YES gesetzt (diese Variable kann durch die Umgebungsvariable PATCH_THE_KERNEL überschrieben werden), so wird beim Erzeugen des Debian Pakets das Skript /usr/src/kernel-patches/$(architecture)/apply ausgeführt und alle installierten Kernel-Patches auf den Kernel-Source-Code angewendet. Dieser Vorgang wird bei einem Aufruf von make-kpkg clean wieder rückgängig gemacht, indem /usr/src/kernel-patches/$(architecture)/unpatch ausgeführt wird. Um Architektur-unabhängige Patches zu verwenden, kann als Architektur all angegeben werden.

  • config_target: Beschreibt, welcher Schritt der Konfiguration durchlaufen werden soll. Der Vorgabewert ist hierbei oldconfig, der sich besonders gut für das Erstellen eines Kernels ohne viele Nachfragen eignet. Wenn die Option patch_the_kernel gesetzt ist, so werden wahrscheinlich weitere Anpassungen für die neuen Funktionen notwendig. Dann sollte diese Option auf menuconfig oder xconfig gesetzt werden.

    Die Umgebungsvariable CONFIG_TARGET überschreibt den Wert in der Konfigurationsdatei. Entspricht der Wert von config_target nicht einem der Werte config, oldconfig, menuconfig oder xconfig, so wird der Wert auf oldconfig gesetzt.

  • use_saved_config: Wird diese Variable auf NO gesetzt, so wird die Datei .config.save ignoriert.

  • root_cmd: Mit dieser Variablen kann ein Kommando bestimmt werden, das es erlaubt, als Benutzer temporär die Rechte des Administrators zu erlangen. Kommandos, die dies ermöglichen, sind beispielsweise sudo oder fakeroot. Mit der Umgebungsvariablen ROOT_CMD kann dieser Wert überschrieben werden.

  • delete_build_link: Wird diese Variable auf YES gesetzt, so wird der Link auf die Datei /lib/modules/$VERSION/build aus dem erzeugten Debian Paket entfernt. Das Setzen der Umgebungsvariablen DELETE_BUILD_LINK hat die gleichen Auswirkungen.

  • do_clean: Das Setzen dieser Variable auf den Wert YES bewirkt den Aufruf von make clean, nachdem das Kernel-Paket erzeugt wurde. Alle anderen Werte verhindern den Aufruf. Die entsprechende Umgebungsvariable dafür lautet CLEAN_SOURCE.

  • install_vmlinuz: Mit dem Setzen dieser Variable auf YES wird zusätzlich zu dem komprimierten Kernel-Image (vmlinuz) auch ein unkomprimiertes Kernel-Image installiert.

  • source_clean_hook: An dieser Stelle kann vor dem Packen der Kernel-Sourcen zu einem Archiv ein Programm aufgerufen werden, das beispielsweise nicht benötigte Dateien löscht. Dies können Verzeichnisse sein, die zur Versionskontrolle benötigt werden, oder es können Dateien gelöscht werden, die zu einer nicht benötigten Architektur gehören.

    Die Aktion wird nur auf den temporären Kernel-Source-Baum innerhalb von ./debian/tmp-source/usr/src/linux-source-X.X.XX angewendet.

  • header_clean_hook: Wie zuvor bei source_clean_hook beschrieben; diesmal jedoch ausschließlich mit Auswirkungen auf die entsprechenden Kernel-Header.

  • doc_clean_hook: Wie zuvor bei source_clean_hook beschrieben; diesmal jedoch ausschließlich mit Auswirkungen auf die entsprechende Kernel-Dokumentation.

  • extra_docs: Kann auf ein Verzeichnis zeigen, in dem zusätzliche Dokumentation liegt, die im Verzeichnis /usr/share/doc/linux-image-X.X.XX/ abgelegt werden soll. Die Dateien werden dabei nicht komprimiert, und es wird auch nicht geprüft, ob Dateien mit gleichen Namen bereits vorhanden sind. Der Pfad kann auch mit der Umgebungsvariablen EXTRA_DOCS übergeben werden.

  • kpkg_follow_symlinks_in_src: Nützlich für Entwickler, die Symlinks intensiv nutzen, um Kernel zu erzeugen. In den erzeugten Paketen werden die Links umgewandelt, so dass auch tatsächlich alle Dateien enthalten sind. Die entsprechende Umgebungsvariable KPKG_FOLLOW_SYM-LINKS_IN_SRC kann ebenfalls genutzt werden.

  • make_libc_headers: Diese Variable sollte nur vom Maintainer der libc eingesetzt werden, wenn die libc6 neu übersetzt wird. Nutzen Sie diese Variable nicht! Die entsprechende Umgebungsvariable ist MAKE_LIBC_HEADERS.

  • CONCURRENCY_LEVEL: Hiermit kann beeinflusst werden, wie viele Compiler-Instanzen von make über das Flag -j aufgerufen werden. Der Wert muss eine (kleine) Ganzzahl sein.

  • ARCH_IN_NAME: Wird diese Variable benutzt, so wird ein zusätzlicher Name für das Kernel-Paket in der Subarchitektur hinzugefügt. So können über ein kleines Skript unterschiedliche Kernel für verschiedene Architekturen erzeugt werden. Beachten Sie, dass lediglich der Paketname mit dieser Variablen verändert wird, nicht die Anordnung der Dateien in Dateisystem.

  • CONFDIR: Diese Variable kann den Pfad zu einem Verzeichnis enthalten, in dem sich Konfigurationsdateien ( .config) für die jeweilige Architektur befinden. Die Voreinstellung zeigt auf das Verzeichnis /usr/share/kernel-package/Config.

  • IMAGEDIR: Wenn die erzeugten Kernel-Images nicht im Verzeichnis /boot gespeichert werden sollen, so kann mit dieser Variablen das Verzeichnis verändert werden. Benutzer von loadlin werden dies zu schätzen wissen.

  • MODULE_LOC: Zeigt auf ein Verzeichnis, in dem zusätzliche Module abgelegt sind. Die Voreinstellung ist /usr/src/modules.

  • PATCH_DIR: Zeigt auf ein Verzeichnis, in dem sich Kernel-Patches befinden, die vor dem Übersetzen des Kernels auf den Source-Code angewendet werden sollen. Diese Variable zeigt in der Voreinstellung auf /usr/src/kernel-patches/ARCHITECTURE.

  • ALL_PATCH_DIR: Hiermit kann ein Verzeichnis angegeben werden, in dem sich Architektur-unabhängige Kernel-Patches befinden. Die Vorgabe ist hier das Verzeichnis /usr/src/kernel-patches/all.

Die Priorisierung erfolgt in dieser Reihenfolge:

  • Eine Variable ist in der Datei rules gesetzt. Dies ist die Voreinstellung.

  • Eine Variable ist in der Datei /etc/kernel-pkg.conf gesetzt und hat damit eine höhere Wertigkeit.

  • Variablen können auch über die entsprechenden Umgebungsvariablen gesetzt werden. Umgebungsvariablen überschreiben die Angaben in den Konfigurationsdateien und den Voreinstellungen.

  • Werden make-kpkg-Optionen auf der Kommandozeile verwendet, so überschreiben diese alle vorhergehenden Definitionen.

Abschließend wird das Debian Kernel-Paket mittels make-kpkg und den gewünschten Optionen erzeugt.

5.2.1.1 make-kpkg

Mit make-kpkg lassen sich Debian Kernel-Pakete aus dem Kernel-Quellcode (Source) erzeugen. Dabei kann sowohl die Konfiguration des Kernels während des Einsatzes von make-kpkg vorgenommen werden, als auch der eigentliche Übersetzungsvorgang (Kompilieren) des Quellcodes angestoßen werden.

make-kpkg muss immer innerhalb des Verzeichnisses aufgerufen werden, in dem sich der Quellcode des Kernels befindet. Weiterhin sind administrative Rechte notwendig. Dies kann dadurch erreicht werden, dass make-kpkg als Administrator (root) ausgeführt wird. Es ist aber auch ausreichend, das Programm fakeroot einzusetzen.

Die Syntax von make-kpkg ist recht einfach:

make-kpkg [options] [target [target ...]]  
	

Als einfaches Beispiel für den Einsatz von make-kpkg kann folgendes Beispiel dienen, das auch als normaler Benutzer aufgerufen werden kann:

make-kpkg --rootcmd fakeroot kernel_image
	

Es wird ein Debian Kernel-Paket erzeugt und in dem Verzeichnis abgelegt, das dem aktuellen Verzeichnis übergeordnet ist.

Optionen

--help

Gibt eine kurze Hilfe zu den Optionen von make-kpkg aus.

--revision number

Setzt die Revisionsnummer des Debian Pakets auf das angegebene Argument.

Diese Option bewirkt nur eine Änderung der Revisionsnummer während der Konfigurationsphase (also wenn die Datei stamp-configure nicht existiert). Es empfiehlt sich, in jedem Fall vor der Benutzung dieser Option make-kpkg clean aufzurufen. Den gleichen Effekt hat das Löschen der Dateien stamp-configure und stamp-debian.

Nach den Informationen im Debian Policy Manual darf die Zeichenkette für die Version ausschließlich aus Zahlen und den Zeichen + und . bestehen und muss mindestens eine Zahl beinhalten. Die offiziellen Debian Pakete mit Kerneln weichen davon ab, diese beinhalten auch das Zeichen -.

Der voreingestellte Wert für diesen Parameter ist 1.00.Custom. Mit der Umgebungsvariablen DEBIAN_REVISION_MANDATORY kann eine Warnung ausgegeben werden, falls die Revisionsnummer weder auf der Kommandozeile noch in der Konfigurationsdatei gesetzt wird.

--append-to-version foo, --append_to_version foo

Das angegebene Argument foo wird an den Wert der Variablen EXTRAVERSION angehängt, die aus den Angaben im Kernel-Makefile generiert wird. Da EXTRAVERSION ein Bestandteil der Kernel-Version ist, wird diese Angabe auch im Namen des Debian Kernel-Pakets erscheinen und muss somit auch den Richtlinien für Paketnamen entsprechen. Das bedeutet, dass ausschließlich Kleinbuchstaben sowie die Zeichen -, + und . erlaubt sind.

Wird diese Option verwendet, so wird die Umgebungsvariable APPEND_TO_VERSION überschrieben. Bei Verwendung dieser Option muss make-kpkg clean nach der Konfiguration des Kernels aufgerufen werden, da hiermit die Datei include/linux/version.h mit den gewünschten Werten erzeugt wird. Ein einfacher Aufruf von make-kpkg würde eine bestehende Datei include/linux/version.h nicht verändern und so dazu führen, dass der Kernel die Module nicht findet, da diese in einem Verzeichnis abgelegt werden, das sich von der im Kernel festgelegten Syntax unterscheidet.

Wird später noch ein Paket mit den Kernel-Modulen erzeugt, so ist dort auch die verwendete Option anzugeben, damit die Module zum Kernel passen.

--flavor foo

Dies ist eine mittlerweile überflüssige Option, die noch aus Gründen der Kompatibilität mitgeführt wird. Zukünftig sollte nur noch --append_to_version benutzt werden.

--added-modules foo, --added_modules foo

Das Argument zu dieser Option ist ein einzelnes Modul oder eine kommaseparierte Liste von Modulen, die nicht im Standard-Kernel enthalten sind. Dabei muss der komplette Pfad zu den Modulen angegeben werden, falls diese nicht im üblichen Pfad liegen (/usr/src/modules, der auch über die Variable MODULE_LOC gesetzt werden kann).

--added-patches foo, --added_patches foo

Das Argument zu dieser Option ist eine kommaseparierte Liste von Patches, die dem Kernel-Quellcode hinzugefügt werden sollen. Die Verwendung dieser Option setzt automatisch auch die Option patch_the_kernel auf YES.

Abweichend zur Behandlung von Modulen ist es bei Patches ausreichend, den Basisnamen des Patches anzugeben. Der volle Pfad ist nicht erforderlich. Für jeden Namen eines Patches in der Liste wird wie folgt nach der passenden Datei gesucht: Wird die Datei in einem der Verzeichnisse ALL_PATCH_DIR/{apply,unpatch}/ gefunden, so wird die Datei ALL_PATCH_DIR/apply/<patch_name> während des Laufs von configure ausgeführt. Passend dazu wird die Datei ALL_PATCH_DIR/unpatch/<patch_name> ausgeführt, wenn ein clean ausgeführt wird.

Voreingestellt ist, dass alle vorhandenen Patches angewendet werden, in dem die ausführbaren Dateien in ALL_PATCH_DIR/apply/ bearbeitet werden. Dies geschieht durch Setzen der Konfigurationsvariablen patch_the_kernel oder der Umgebungsvariablen PATCH_THE_KERNEL auf den Wert YES. Zu beachten ist, dass alle Patches wieder aus dem Quellcode entfernt werden, wenn clean aufgerufen wird. Dieses Verhalten kann verhindert werden, indem die Umgebungsvariable NO_UNPATCH_BY_DEFAULT gesetzt wird.

Für das bisher Beschriebene gilt, dass die Variable ALL_PATCH_DIR auf das Verzeichnis /usr/src/kernel-patches/ verweist.

Wird später make-kpkg clean aufgerufen, so werden alle Patches wieder entfernt. Dies kann durch Setzen der Umgebungsvariablen NO_UNPATCH_BY_DEFAULT verhindert werden.

--arch foo

Setzt die Hardware-Architektur auf den angegebenen Wert. Diese Option wird nur benötigt, wenn der Kernel nicht auf der Zielplattform erzeugt wird (Cross-Compiling). Derselbe Effekt wird durch Setzen der Variablen KPKG_ARCH auf die gewünschte Zielarchitektur erreicht. Normalerweise wird die Architektur automatisch ermittelt.

--cross-compile foo, --cross_compile foo

Sollte ebenfalls gesetzt werden, wenn der Kernel für eine fremde Hardware-Architektur erzeugt wird. Die Umgebungsvariable hierfür lautet CROSS_COMPILE.

--subarch foo

Auf einigen Hardware-Plattformen (beispielsweise Alpha und m68k) müssen unterschiedliche Kernel für die verschiedenen Prozessoren erzeugt werden. Die dieser Option entsprechende Umgebungsvariable lautet KPKG_SUBARCH.

--arch-in-name, --arch_in_name

Diese Option vergibt einen erweiterten Namen für das Kernel-Image-Paket, so dass in einem Skript mehrere Images für Sub-Architekturen erzeugt werden können. Dies kann auch durch Setzen der Variablen ARCH_IN_NAME erreicht werden. Dies beeinflusst lediglich den Namen des Pakets, nicht das Verzeichnis, in dem die passenden Module abgelegt werden.

--pgpsign name

Setzt die Zeichenkette, mit der die Changes-Dateien für externe Module digital signiert werden. Diese Option überschreibt die Werte, die in /etc/kernel-pkg.conf oder auch ~/.kernel-pkg.conf angegeben sind.

--config target

Ändert die Einstellung für die Kernel-Konfiguration. Normalerweise wird oldconfig benutzt, alternativ kann hier auch config, menuconfig, xconfig, old, menu oder auch x angegeben werden.

Sinnvoll ist diese Option im Zusammenhang mit PATCH_THE_KERNEL, wenn von den eingesetzten Patches neue Konfigurationsoptionen hinzugefügt werden.

--targets

Zeigt eine Liste der bekannten Targets (Ziele, hier als Zielpakete zu verstehen) an. Mehr zu den Targets später.

--noexec

Übergibt die Option -n an das Kommando make, so dass keine Kommandos ausgeführt werden. Es wird lediglich angezeigt, was passieren würde.

--initrd

Wenn make-kpkg die Option linux-image übergeben wurde, so werden durch diese Option alle zusätzlichen Aktionen aufgerufen, die notwendig sind, um eine passende Init-RAM-Disk zu erzeugen.

Hierbei ist zu beachten, dass ein zusätzlicher Patch benötigt wird, der bereits in den Debian-Kernel-Sourcen enthalten ist. Wird dieser cramfs-Patch nicht verwendet, so muss die Konfiguration von mkinird so angepasst werden, dass cramfs nicht benutzt wird.

--zimage

Erzeugt einen zImage-Kernel statt eines bzImage-Kernels.

--bzimage

Erzeugt einen bzImage-Kernel.

--rootcmd foo

Kommando, mit dem auf dem System besondere Zugriffsrechte erreicht werden können. Dies können beispielsweise sudo oder fakeroot sein. Diese Option wird an das Programm dpkg-buildpackage weitergereicht.

--us

Diese Option wird an dpkg-buildpackage weitergereicht; der Quellcode wird nicht digital signiert.

--uc

Diese Option wird an dpkg-buildpackage weitergereicht; die Datei changelog wird nicht digital signiert.

Alle genannten Optionen können so lange verkürzt werden, bis diese nicht mehr eindeutig sind. Weiterhin ist es erlaubt, ein oder zwei Minuszeichen (- oder --) voranzustellen. Argumente können von den Optionen durch ein Leerzeichen oder ein Gleichheitszeichen getrennt sein.

Ziele (Targets)

clean

Löscht alle nicht benötigten Dateien aus dem Kernel-Quellcode, die zuvor über das Target build erzeugt worden sind, und führt dazu das Kommando make distclean aus.

buildpackage

Führt die Targets clean und binary aus und erzeugt so ein Kernel-Paket.

binary

Erzeugt alle vier möglichen Debian Kernel-Pakete, indem die Targets kernel_source, kernel_headers, kernel_doc und kernel_image ausgeführt werden.

kernel_source

Erzeugt ein Debian Paket mit dem Kernel-Quellcode. Zeigt die Umgebungsvariable SOURCE_CLEAN_HOOK auf eine ausführbare Datei, so wird diese im Quellcode-Verzeichnis des Kernels ausgeführt, bevor das Paket erstellt wird. Auf diesem Weg können nicht benötigte Dateien und Verzeichnisse entfernt werden (beispielsweise Architektur-abhängige Dateien oder auch Verzeichnisse, die der Versionskontrolle dienen (find . -type d -name CVS -prune -exec rm -rf {} )).

Diese Option wirkt sich ausschließlich auf den Kernel-Quellcode aus, der zu einem Debian-Paket gepackt wird. Ähnliche Auswirkungen haben die Umgebungsvariablen HEADER_CLEAN_HOOK und DOC_CLEAN_HOOK: Es wird ein Programm ausgeführt, das die Kernel-Header- bzw. die Kernel-Dokumentationsverzeichnisse bearbeitet.

kernel_headers

Erzeugt ein Paket mit den Kernel-Headern.

kernel_doc

Erzeugt ein Paket mit der Dokumentation für den Kern.

kernel_image

Erzeugt ein Debian Paket mit dem Linux-Kernel, der aus dem Quellcode übersetzt wird. Ist noch keine Konfigurationsdatei für den Kern (.config) vorhanden, so wird eine Konfiguration benutzt, die der der Debian Bootfloppies sehr ähnlich ist.

Das Paket wird so erstellt dass, abhängig von der Hardware-Plattform, der entsprechende Bootloader aufgerufen wird, so dass der neue Kernel auch zuverlässig gestartet wird. Als Bootloader kommt dabei LILO, SILO, QUIK, VMELILO, ZIPL, yaboot, PALO oder auch GRUB zum Einsatz. Während der Installation des Pakets wird dem Administrator angeboten, eine Bootdiskette zu erzeugen. Diese wird formatiert, falls dies notwendig ist.

build

Hiermit wird lediglich der Compiler gestartet und der Kernel aus dem Source-Code übersetzt. Dieses Target wird vom Target kernel_image benutzt.

modules

Erzeugt alle Module und die entsprechenden Debian Pakete, die sehr eng von einer passenden Kernel-Version abhängen. Hierbei wird vorausgesetzt, dass alle Module im Verzeichnis /usr/src/modules abgelegt sind. Es wird ein Debian Modul-Paket erzeugt, eine entsprechende komprimierte tar-Datei, eine komprimierte diff-Datei. Weiterhin werden die MD5-Checksummen in der changes-Datei aktualisiert (mittels dpkg-genchanges). Die Datei wird mit der gleichen Identität digital signiert, mit der auch das Kernel-Paket signiert wurde. Diese Option erlaubt einem Maintainer, das Paket direkt in die Debian Archive zu kopieren.

modules_config

Konfiguriert alle Module, die sich unter /usr/src/modules befinden.

modules_image

Erzeugt Pakete zu den Modulen unter /usr/src/modules, es werden aber keine Quellcode-Pakete oder Diff-Dateien erzeugt. Weiterhin wird die Changes-Datei nicht digital signiert.

modules_clean

Löscht alle nicht benötigten Dateien im Verzeichnis /usr/src/modules.

configure

Diese Option führt ein make configure aus, genauer genommen das mittels --config angegebene config_target. Es ist voreingestellt auf oldconfig. Dies bietet die Möglichkeit, von make config erzeugte Dateien anzupassen, so dass diese später nicht von make-kpkg verändert werden.

debian

Erzeugt das Verzeichnis debian/ innerhalb des Quellcode-Verzeichnisses und wendet vorhandene Patches auf den Quellcode an.

libc-kheaders

Eine spezielle Option für den Betreuer der C-Bibliotheken.

make-kpkg verwendet die folgenden Umgebungsvariablen, falls diese gesetzt sind: DEBIAN_REVISION_MANDATORY, APPEND_TO_VERSION, VERSION_H_OK, PATCH_THE_KERNEL, NO_UNPATCH_BY_DEFAULT, KPKG_ARCH, CROSS_COMPILE, KPKG_SUBARCH, ARCH_IN_NAME, INITRD, SOURCE_CLEAN_HOOK, MODULE_LOC, INITRD_OK

Neben den Optionen, die zur Laufzeit übergeben werden, kann make-kpkg auch über die Konfigurationsdateien /etc/kernel-pkg.conf (systemweite Konfiguration) oder ~/.kernel-pkg.conf (benutzerbezogene Konfiguration) gesteuert werden.

Die dem Debian Paket mitgelieferte Konfiguration erlaubt es, den Namen und die E-Mail-Adresse zu überschreiben. Die Konfigurationsdateien sind als Teile eines Makefiles zu verstehen, alle in einem solchen Makefile erlaubten Funktionen können hier aufgerufen werden.

5.2.2 Debian Kernel-Patches

Mit der Debian Distribution werden neben den Sourcen für die in Debian selbst verwendeten Kernel auch eine Reihe Kernel-Patches geliefert, die in eigene Kernel integriert werden können. Ein guter Einstieg für die ersten Versuche ist der kernel-patch-debianlogo; dieser Patch ersetzt den beim Systemstart angezeigten Pinguin durch ein Debian Logo. Bei der ersten Installation eines solchen Debian Kernel-Patches wird in /usr/src/ das Verzeichnis kernel-patches angelegt.

Die Installation eines solchen Kernel-Patch-Pakets wendet den Patch noch nicht an; dies geschieht erst mit dem Aufruf von make-kpkg:

bash$ fakeroot make-kpkg --append-to-version=030825 \
 --added-patches=debianlogo kernel_image modules_image

Das Kommando fakeroot wird dabei benutzt, um beschränkte administrative Rechte auch als normaler Benutzer zu erlangen.

Wenn weitere Patches in den Kernel eingespielt werden sollen, können diese durch Kommata getrennt an der Option --added-patches angegeben werden.

Normalerweise benutzt make-kpkg make oldconfig, nachdem die Patches angewendet wurden. Wenn von den Patches neue Kernel-Optionen benötigt werden, so werden diese abgefragt. Alternativ kann auch die Option --config=menuconfig benutzt werden, um die komplette Konfiguration zu überprüfen.

5.2.3 Klassische Kernel

5.2.3.1 Anpassen des Kernels von Hand

In einigen Fällen kann es notwendig sein, den Linux-Kernel an die eigenen Bedürfnisse anzupassen. Debian GNU/Linux installiert einen Standard-Kernel, der in den meisten Fällen ausreichend ist. Zusätzliche Treiber können über Module im laufenden Betrieb hinzugeladen werden.

5.2.3.2 Benötigte Programme

Um aus den Kernel-Sourcen einen lauffähigen Kernel zu erzeugen, müssen die Quelltexte mittels eines passenden Compilers übersetzt werden. Der komplette Linux-Kernel wurde in der Programmiersprache C geschrieben - mit Ausnahme einiger ganz weniger Zeilen, die aus Geschwindigkeitsgründen in der Maschinensprache Assembler geschrieben wurden. Übrigens steht unter Linux der gcc (GNU Compiler Collection) - eine freie Implementierung eines C-Compilers - zur Verfügung.

Es werden folgende Pakete benötigt, um einen Kernel selbst zu erzeugen:

  • binutils - Der GNU-Assembler, -Linker und einige Zusatzprogramme.

  • libc6-dev - GNU C-Bibliothek, Entwicklerpaket.

  • gcc - Der eigentliche GNU (EGCS) C-Compiler.

  • make - GNU-Version von make.

  • bin86 - Ein 16-Bit-Assembler.

Nützlich, aber nicht zwingend erforderlich, sind weiterhin folgende Pakete:

  • libncurses5-dev - Entwickler-Bibliotheken und Dokumentation für ncurses.

  • tkstep8.0-dev - NeXTStep ähnliche Version des Tk-Toolkits. (oder tk8.0-dev oder tkstep4.2-dev oder tk4.2-dev).

  • kernel-package - Debian Linux-Kernel-Paket-Skripte.

5.2.3.3 Entpacken der Sourcen

Soll ein individuell auf das System angepasster Kernel installiert werden, so ist es zuerst nötig, die Kernel-Sourcen (Quellcode) zu installieren. Für den ersten Versuch ist es ratsam, die gleiche Kernel-Version zu installieren, die auch schon vom Installationsprogramm installiert wurde. Der Befehl

cat /proc/version

gibt Ihnen die installierte Version aus. Installieren Sie nun (mit dselect, dpkg oder apt) die Sourcen zu diesem Kernel.

Die Kernel-Sourcen werden vom Installationsprogramm unter /usr/src/ als Datei linux-source-2.x.x.tgz abgelegt und müssen noch von Hand entpackt werden. Dies wird mit dem Befehl

tar xvfz linux-source-2.x.x.tgz

erreicht. Die entpackten Sourcen finden sich nun in dem Verzeichnis linux-source-2.x.x/.

Dass die Debian Quellcodes des Kernels als ein Archiv installiert werden, mag auf den ersten Blick seltsam erscheinen, da ja durch das Entpacken sogar noch mehr Speicherplatz belegt wird. Dies hat aber bei näherer Betrachtung einen guten Grund. Das Debian Paketmanagement führt eine Datenbank über alle installierten Pakete und die dazugehörigen Dateien. Würde nun ein Kernel-Quellcode-Paket entpackt installiert werden, so würden die Anwender direkt mit diesen Dateien arbeiten und diese eventuell gar verändern. Damit wäre die zentrale Kontrolle umgangen.

Auf den Servern finden sich die aktuellen Archive des Linux-Kernels auch in einer mit bzip2 (anstatt mit gzip) komprimierten Form. Diese Archive sind noch einmal ein wenig kleiner, da bzip2 bessere Kompressionsalgorithmen verwendet. Die so gepackten Archive enden auf .bz2. Diese Archive können ebenfalls mit tar entpackt werden; hierzu ist aber die Option -j statt -z anzugeben. Beachten Sie: Es sind zwischenzeitlich einige Versionen von tar im Umlauf gewesen, bei denen für bzip2-komprimierte Archive die Option -I zu verwenden ist.

5.2.3.4 Konfiguration des Kernels

Wechseln Sie nun in das Verzeichnis, in dem Sie vorher die Kernel-Sourcen entpackt haben. Mit dem Kommando make config erzeugen Sie die benötigte Konfigurationsdatei. Sie können hier den Kernel individuell an Ihre eigene Hardware anpassen. Bei vielen Optionen haben Sie die Möglichkeit, zwischen fest im Kernel integrierten Treibern * oder Modulen M zu wählen. Achten Sie darauf, nur die nötigen Treiber fest in den Kernel einzubinden, da sonst der Kernel zu groß wird und nicht mehr von lilo geladen werden kann. Gute Kandidaten auf der Liste der Module sind alle Treiber, die nicht zum unmittelbaren Systemstart benötigt werden (Netzwerk, Bandlaufwerke).

Neben make config stehen Ihnen alternativ die Befehle make menuconfig mit einer textbasierten Oberfläche ähnlich wie bei dselect sowie make xconfig unter X11 zur Verfügung. Diese erleichtern kleine Änderungen am Kernel sehr, da die gewünschten Einstellungen direkt anzuwählen sind.

Wenn Sie die Option menuconfig benutzen wollen, muss das Paket libncurses5-dev installiert sein; dieses stellt die notwendigen Funktionen für die textbasierte Oberfläche zur Verfügung.

5.2.3.5 Übersetzen des Kernels

Nachdem Sie die gewünschten Einstellungen gemacht haben, werden mit dem Befehl make dep die Abhängigkeiten geprüft. Ein make clean räumt noch übrig gebliebene Dateien von der Festplatte. Einen neuen Kernel erzeugen Sie mit dem Befehl make bzImage. Zum Übersetzen des Kernels müssen neben einem C-Compiler auch die Pakete bin86 und natürlich make (das haben Sie aber sicher vorher schon bemerkt) installiert sein. Nach einiger Zeit (wenn alles ohne Fehlermeldungen über die Bühne gegangen ist) finden Sie den neuen Kernel unter /usr/src/linux-source-2.x.x/arch/i386/boot/. Dieser muss nun noch an die passende Stelle (bei Debian üblicherweise /boot/) kopiert werden. Abschließend ist die Konfiguration von lilo zu prüfen und ggf. anzupassen.

Statt make bzImage können Sie auch make bzlilo verwenden: Dieser Befehl kopiert den Kernel nach /vmlinuz und benennt vorher den schon vorhandenen Kernel in vmlinuz.old um. Danach wird automatisch lilo aufgerufen, und somit steht der Kernel dann ab dem nächsten Neustart zur Verfügung.

5.2.3.6 Übersetzen der Module

Sie können nun die Treiber, die Sie bei der Konfiguration als Module ausgewählt haben, übersetzen. Dies geschieht mit dem Befehl make modules. Nach dem Übersetzen der Module werden diese mit make modules_install an den richtigen Ort kopiert.

5.2.3.7 Tipps

Benutzen Sie das Zeichen & , um mehrere Kommandos nacheinander auszuführen. Sie müssen so nicht die einzelnen Schritte beim Übersetzen eines neuen Kernels abwarten. make dep && make clean && make bzlilo && make modules && make modules_install erledigt einen kompletten Durchlauf ohne Pause.

Probieren Sie einfach einmal, den Kernel mit der Option -s zu übersetzen, also: make -s zImage oder make -s bzImage. Bei einem so übersetzten Kernel werden lediglich Warnungen und Fehlermeldungen des Kernels beim Systemstart ausgegeben. Alle Ausgaben der Treiber werden unterdrückt.

Sie können das Übersetzen des Kernels beschleunigen, indem Sie den Parameter -j # einfügen, wobei # für eine (fast beliebige) Zahl steht. Mit diesem Parameter werden, entsprechend der angegebenen Zahl, mehrere Prozesse gestartet und Teile des Kernels gleichzeitig übersetzt. Sinnvolle Werte für die Anzahl der Prozesse sind in erster Linie vom Ausbau des Hauptspeichers (RAM) abhängig. Auf Systemen mit mehreren Prozessoren wirkt sich dies natürlich auch positiv aus. Bedenken Sie bitte, dass zu hoch gewählte Werte zum Auslagern (Swappen) führen und den Vorgang merklich verlangsamen.

Um festzustellen, welcher Wert sinnvoll ist, benutzen Sie das Kommando time make -j 10 bzImage und variieren den Wert für die Anzahl der Prozesse.

Sollten Sie nach dem Übersetzen der Module mit make modules; make modules_install Probleme haben, diese zu laden, liegt dies wahrscheinlich daran, dass die Datei modules.dep, in der die Abhängigkeiten (dependencies) beschrieben sind, nicht aktuell ist. Es ist nicht nötig, in dieser Datei irgendetwas von Hand zu ändern: Der Befehl depmod -a 2.6.x erstellt eine aktuelle Datei für Sie, wobei 2.6.x der neuen Kernel-Version entspricht.

Wenn Sie viele verschiedene Kernel-Versionen auf der Festplatte halten, kann es vorkommen, dass Fehlermeldungen in der Form Warning: /boot/System.map has an incorrect kernel version. erscheinen. Neben der Möglichkeit, je eine Version der System.map in /boot/ und eine weitere in /usr/src/linux/ zu halten (was maximal zwei Versionen erlaubt), bietet Debian GNU/Linux sozusagen eine Komplettlösung.

Das Skript /etc/init.d/klogd startet beim Systemstart den klogd. Sie können am Anfang dieses Skriptes in der Variablen KLOGD als Parameter -k /boot/System.map-$(uname -r) angeben. Eine entsprechende Zeile findet sich bereits vorbereitet in dem Skript. So wird je nach verwendeter Kernel-Version eine passende System.map aus /boot/ geladen. Diese müssen Sie nach dem Übersetzen des Kernels in das Verzeichnis /boot/ kopieren und passend zur Kernel-Version benennen. Am einfachsten können Sie das mit folgendem Kommando erledigen: cp /usr/src/linux/System.map /boot/System.map-`uname -r`.

Hier sehen Sie ein kleines Skript, das in /boot/ nach Kerneln sucht und eine passende lilo.conf erstellt, mit dem neuesten Kernel als Standardkernel.

#!/bin/bash

umask 772
kernel_dir=/boot

# lilo assumes the default image is the first one in lilo.conf, so
# we sort the kernel images backwards, hence the highest-version'd kernel
# will be the default.
images=`cd $kernel_dir >> ls -1 vmlinuz-* \
 | egrep "vmlinuz-([0-9]+).([0-9]+).([0-9]+)[^-]*$" \
 | sort -rn`

cp -f /etc/lilo.conf.static /tmp/lilo.conf

# three lines per entry, 3 x 19 images = 57
( for img in $images ; do
   label=`echo $img | sed 's/vmlinuz/linux/ ; s/-//g ; s/\.//g'`
   echo "image=$kernel_dir/$img"
   echo "label=$label"
   echo ""
 done ) | head -57 >> /tmp/lilo.conf

if /sbin/lilo -C /tmp/lilo.conf ; then
  mv -f /etc/lilo.conf /etc/lilo.conf.last
  cp -f /tmp/lilo.conf /etc/lilo.conf
  echo successfully installed new bootloader.
  rm -f /tmp/lilo.conf
  exit 0
else
  echo eek, lilo barfed
  rm -f /tmp/lilo.conf
  exit 1
fi

Wenn Sie einen der neueren Kernel (2.3.x oder 2.4.x) mit Debian GNU/Linux 2.2 verwenden möchten, sollten Sie folgende Zeile in die Datei /etc/fstab einfügen:

none	/var/shm	shm	defaults	0	0

Ab der Kernel-Version 2.3.51 wurde das Shared-Memory-Dateisystem eingeführt.

 Impressum