Debian GNU/Linux Anwenderhandbuch | ||
---|---|---|
Zurück | Kapitel 19. Systemadministration | Nach vorne |
Auf einem Debian GNU/Linux System gibt es grundsätzlich zwei verschiedene Wege 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.
Das Paket kernel-package unterstützt den Debian GNU/Linux-Systemadministrator 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, daß diese auf den meisten Systemen funktionsfähig sind. Trotzdem ist es manchmal notwendig, einen eigenen Kernel zu übersetzen, um neue Hardware einzubinden oder um Hardwarekonflikte 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, welches Sie schon installieren können, ein Paket mit dem gewünschten Kernel-Quellcode (Source). 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.
Tip: 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 mit dem Kommando finger @www.kernel.org die aktuelle Kernel-Version ermitteln.
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, muß 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/. Die entpackten Quellen befinden sich dann im Verzeichnis /usr/src/linux. Es ist ratsam, wenn Sie verschiedene Kernelversionen verwalten wollen, diese umzubenennen, beispielsweise in: kernel-source-2.2.14.
Wählen Sie in jedem Fall ein Verzeichnis auf Ihrer Platte, in dem genug Platz vorhanden ist. Die neuesten Kernel-Versionen sind in gepackter Form ca. 16,5 MB groß und nehmen im entpackten Zustand ca. 97 MB sowie ca. 116 MB, wenn alles übersetzt ist, ein. Je entpackter Kernel-Version! Wechseln Sie nun in das Verzeichnis, in dem die Kernel-Quellcodes liegen.
Der Name eines Debian GNU/Linux-Paketes besteht immer aus dem Basisnamen (hier: kernel-image), der Versionsnummer des Kernels (zum Beispiel 2.2.14, diese wird aus dem Kernel-Makefile ermittelt) und der sogenannten Revisionsnummer, diese 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, daß 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, daß 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-Paketes. Wenn Sie hier ein Apostroph (') verwenden möchten, so müssen Sie dieses wie folgt angeben: John O'\\''Brien.
email: Ihre E-Mail-Adresse
pgp: 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: Revisionsnummer des Paketes, Standardwert ist 1.00. Es kann die Umgebungsvariable DEBIAN_REVISION benutzt werden.
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, 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 no_symlink Option 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 welche keinen symbolischen Links unterstützen, beispielsweise wenn loadlin eingesetzt wird. Diese Option ist aber eher als Hack zu betrachten...
In einigen Fällen kann es notwendig sein, den Linux-Kernel an die eigenen Bedürfnisse anzupassen. Debian GNU/Linux installiert einen Standardkernel, der in den meisten Fällen ausreichend ist. Zusätzliche Treiber können über Module im laufenden Betrieb hinzugeladen werden.
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 C-Compiler) - eine freie Implementierung eines C-Compilers - zur Verfügung.
Sie benötigen folgende Pakete, um einen Kernel selber 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 - 16-bit Assembler
libncurses4-dev - Entwickler-Bibliotheken und Dokumentation für ncurses
tkstep8.0-dev - NeXTStep ähnlich Version des Tk Toolkits. (oder tk8.0-dev oder tkstep4.2-dev oder tk4.2-dev)
kernel-package - Debian Linux-Kernel Paket-Scripte.
Möchten Sie einen individuell auf Ihr System angepassten Kernel installieren, so ist es zuerst nötig, die Kernel-Sourcen (Quellcode) zu installieren. Für den ersten Versuch ist es ratsam, die gleiche Kernelversion 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 kernel-source-2.x.x.tgz abgelegt und müssen noch von Hand entpackt werden. Dies erreichen Sie mit dem Befehl tar xvfz kernel-source-2.x.x.tgz. Die entpackten Sourcen finden sich nun in dem Verzeichnis kernel-source-2.x.x/.
Auf den Servern finden sich die aktuellen Archive des Linux Kernels auch in einer mit bzip2 anstatt gzip, komprimierten Form. Diese Archive sind nochmal 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. Bitte 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.
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 auf 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, muß das Paket libncurses5-dev installiert sein, dieses stellt die notwendigen Funktionen für die textbasierte Oberfläche zur Verfügung.
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 Platte. 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/kernel-source-2.x.x/arch/i386/boot/. Dieser muß 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 zu Verfügung.
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.
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, daß 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, daß 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.2.x erstellt eine aktuelle Datei für Sie, wobei 2.2.x der neuen Kernelversion entspricht.
Wenn Sie viele verschiedene Kernelversionen auf der Platte halten, kann es vorkommen, daß 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 Script /etc/init.d/sysklogd startet beim Systemstart auch den klogd. Sie können am Anfang dieses Scripts in der Variablen KLOGD als Parameter -k /boot/System.map-$(uname -r) angeben. So wird je nach verwendeter Kernelversion eine passende System.map aus /boot/ geladen. Diese müssen Sie nach dem Übersetzen des Kernels in das Verzeichnis /boot/ kopieren und passend zur Kernelversion benennen. Am einfachsten können Sie das mit folgendem Kommando erledigen: cp /usr/src/linux/System.map /boot/System.map-`uname -r`.
Hier ein kleines Script, welches 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 neuesten 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 |
Mittlerweile sind Motherboards mit mehreren Prozessoren recht preiswert zu erhalten. Diese werden natürlich auch von Debian GNU/Linux unterstützt. Die Kernelversion 2.0.x kann bereits mit mehreren Prozessoren umgehen, im Kernel 2.2.x wurde die Unterstützung wesentlich verbessert. Ein Umstieg ist ratsam, aber nicht zwingend nötig.
Um einen SMP-fähigen 2.0.x Kernel zu erzeugen, muß im Makefile die Zeile: # SMP=1 auskommentiert (also das erste Zeichen #) entfernt werden. Dies ist unabhängig von der Anzahl der Prozessoren, es wird lediglich die Fähigkeit mehrere Prozessoren zu nutzen, aktiviert. Linux erkennt die Anzahl der Prozessoren dann automatisch.
Mit der Kernelversion 2.2.x wurde die SMP-Funktionalität weiter ausgebaut und es gibt bei der Konfiguration des Kernels die Option SMP einzuschalten. Sie müssen nichts von Hand ändern. Den Parameter können Sie bei make config, make menuconfig oder make xconfig aktivieren.
Zurück | Zum Anfang | Nach vorne |
Systemzeit | Nach oben | Kernel Pakete |