Teil VI Der Kernel und die Kernel-Parameter 353 Kapitel 13 Der Kernel Der Kernel, der während der Installation möglicherweise auf die Diskette ge- schrieben wird ­ und auch im installierten System im /boot-Verzeichnis zu finden ist ­, ist so konfiguriert, dass er ein möglichst breites Spektrum von Hardware unterstützt. Wenn Sie während der Installation oder des Up- dates die richtige Auswahl getroffen haben, ist dieser Kernel sogar für Ihren Prozessor speziell optimiert. Deshalb ist es keineswegs zwingend erforder- lich, einen eigenen Kernel zu generieren. Sollten Sie jedoch experimentelle" Features oder Treiber ausprobieren wollen, so ist das Selberbauen" des Ker- nels mitunter notwendig. Und nicht zuletzt gestattet das Konfigurieren des Kernels einen höchst interessanten Einblick in den gegenwärtigen Stand der Entwicklung. Zum Erzeugen eines neuen Kernels existieren bereits Makefiles für den C- Compiler, mit deren Hilfe der Ablauf fast völlig automatisiert ist. Lediglich die Abfrage der vom Kernel zu unterstützenden Hardware muss interaktiv durchlaufen werden. Für das Kompilieren eines eigenen Kernels kann kein Installationssupport in Anspruch genommen werden (vgl. Abschnitt H.1.2 auf Seite 548); wir sind aber gern bereit, im Rahmen der kostenpflichtigen Professional Services zu helfen (vgl. Abschnitt H.3 auf Seite 551). Die folgende Beschreibung betrifft im Wesentlichen den Kernel der Serie 2.2.x. Viele Dinge treffen zwar auch noch auf die Kernel der Serie 2.0.x zu ­ im Detail ist jedoch oftmals mit kleinen, aber entscheidenden Abwei- chungen zu rechnen! 13.1 Die Kernelquellen Um einen Kernel bauen zu können ist es selbstverständlich notwendig, dass sowohl die Kernelquellen (Paket lx_suse) als auch wenigstens der C-Com- piler (Paket gcc), die GNU Binutils (Paket binutils) und die Include- Dateien für den C-Compiler (Paket libc) installiert sind. Diese Pakete sind in der Serie D (Development) enthalten. Generell ist die Installation des C- Compilers dringend anzuraten, da die Programmiersprache C untrennbar mit dem Betriebssystem Linux verbunden ist. Die Kernelquellen befinden sich im Verzeichnis /usr/src/linux. Sollten Sie vorhaben, am Kernel herumzuexperimentieren und verschiedene Versio- 355 13. Der Kernel nen des Kernels gleichzeitig auf der Platte zu haben, so bietet es sich an, die einzelnen Versionen in verschiedene Unterverzeichnisse zu entpacken und die augenblicklich relevanten Quellen über einen Link anzusprechen. Diese Form der Installation wird von YaST automatisch vorgenommen. Genaugenommen können die Kernelquellen in einem beliebigen Unterver- zeichnis installiert und übersetzt werden. Da es jedoch eine ganze Reihe von Software gibt, die die Kernelquellen unter /usr/src/linux erwartet, sollte dieses Verzeichnis gewählt werden, um ein fehlerfreies Compilieren systemnaher Programme zu gewährleisten. 13.2 Kernel-Module Viele Treiber und Features des Linux-Kernels müssen nicht fest zum Kernel hinzugebunden werden, sondern können zur Laufzeit als Kernel-Modul (engl. kernel module) geladen werden. Welche Treiber fest zum Kernel gebunden und welche als Module realisiert werden, wird bei der Konfiguration des Kernels festgelegt. Die Kernelmodule werden in dem Verzeichnis /lib/modules/ abgelegt, wobei der momentanen Version des Kernels entspricht (beispielsweise 2.2.14). Wenn immer möglich, sollten Sie von diesem Feature Gebrauch machen. Die Grundregel ist: Alle Kernel-Komponenten, die nicht zwingend während des Bootvorgangs benötigt werden, sind als Modul zu realisieren. So wird sicher- gestellt, dass der Kernel nicht zu groß wird und dass der Kernel ohne Schwie- rigkeiten vom BIOS und einem beliebigen Bootloader geladen werden kann. Der Festplatten-Treiber, Unterstützung für ext2 und ähnliche Dinge sind al- so im Regelfall direkt in den Kernel hineinzucompilieren, Unterstützung für isofs, msdos oder sound sollten in jedem Fall als Modul compiliert wer- den. Umgang mit Modulen Folgende Befehle zum Umgang mit Modulen stehen zur Verfügung: * insmod Mit dem Befehl insmod wird das angegebene Modul geladen. Das Modul wird in einem Unterverzeichnis von /lib/modules/ gesucht. Zugunsten von modprobe (s. u.) sollte insmod nicht mehr verwendet werden. * rmmod Entlädt das angegebene Modul. Dies ist natürlich nur dann möglich, wenn die entsprechende Funktionalität des Kernels nicht mehr verwendet wird. So ist es nicht möglich, das Modul isofs zu entladen, wenn noch eine CD gemountet ist. * depmod Dieser Befehl erzeugt eine Datei mit dem Namen modules.dep im Verzeichnis /lib/modules/, in der die Abhängigkeiten der einzelnen Module untereinander verzeichnet sind. Damit stellt man 356 13.2. Kernel-Module sicher, dass beim Laden eines Modules alle davon abhängigen Module ebenfalls automatisch geladen werden. Ist das Starten des Kernel-Dae- mons in /etc/rc.config vorgesehen, wird die Datei mit den Modul- Abhängigkeiten beim Start des Systems automatisch generiert, sofern sie noch nicht existiert. * modprobe Laden bzw. Entladen eines Modules mit Berücksichtigung der Abhängig- keiten von anderen Modulen. Dieser Befehl ist sehr mächtig und kann für eine Reihe weiterer Zwecke eingesetzt werden (etwa Durchprobieren al- ler Module eines bestimmten Typs, bis eines erfolgreich geladen werden kann). Im Gegensatz zum Laden mittels insmod wertet modprobe die Da- tei /etc/modules.conf aus und sollte daher generell zum Laden von Modulen verwendet werden. Für eine ausführliche Erklärung sämtlicher Möglichkeiten lesen Sie bitte die zugehörigen Manpages. * lsmod Zeigt an, welche Module gegenwärtig geladen sind und von wie vielen anderen Modulen sie verwendet werden. Module, die vom Kernel-Dae- mon geladen wurden, sind durch ein nachfolgendes (autoclean) ge- kennzeichnet; das weist darauf hin, dass diese Module automatisch wieder entfernt werden, wenn sie längere Zeit nicht benutzt wurden. /etc/modules.conf Das Laden von Modulen wird über die Datei /etc/modules.conf be- einflusst; vgl. Manual-Page von depmod (man depmod). Hinweis: Der Dateiname wurde ab SuSE Linux 6.3 von /etc/conf. modules in /etc/modules.conf umbenannt. Insbesondere können in dieser Datei die Parameter für solche Module ein- getragen werden, die direkt auf die Hardware zugreifen und daher auf das spezifische System eingestellt werden müssen (z. B. CD-ROM-Treiber oder Netzwerktreiber). Die hier eingetragenen Parameter sind im Prinzip identisch mit denen, die am Bootprompt des Kernels (z. B. von LILO ) übergeben wer- den (siehe Abschnitt 14.3.2 auf Seite 364), jedoch weichen in vielen Fällen die Namen von denen ab, die am Bootprompt zum Einsatz kommen (siehe zum Vergleich Abschnitt 14.3.4 auf Seite 377). Wenn das Laden eines Mo- duls nicht erfolgreich ist, versuchen Sie, in dieser Datei die Hardware zu spe- zifizieren und verwenden Sie zum Laden des Moduls modprobe anstelle von insmod. Kmod ­ der Kernel Module Loader" Der eleganteste Weg bei der Verwendung von Kernel-Modulen ist seit Ver- sion 2.2.x der Einsatz des Kernel Module Loader", der den alten" Kernel- Daemon (kerneld) ersetzt. Kmod wacht im Hintergrund und sorgt dafür, dass benötigte Module durch modprobe-Aufrufe automatisch geladen werden, so- bald auf die entsprechende Funktionalität des Kernels zugegriffen wird. Um den Kmod verwenden zu können, müssen Sie bei der Kernel-Konfigura- tion die Option `Kernel module loader' (CONFIG_KMOD) aktivie- ren. 357 13. Der Kernel Treiber, die benötigt werden, um auf das Root-Dateisystem zuzugreifen, soll- ten fest zum Kernel hinzugebunden werden. Sie sollten also Ihren SCSI-Trei- ber und das Dateisystem der Root-Partition (üblicherweise ext2) nicht als Modul konfigurieren! Da SuSE Linux jedoch nunmehr initrd (engl. initial ramdisk) verwen- det und über diesen Weg beispielsweise den SCSI-Treiber einbindet, müs- sen Sie bei der Erstellung eines eigenen Kernels darauf achten, die Variable INITRD_MODULES in der Datei /etc/rc.config anzupassen (Ab- schnitt 17.6 auf Seite 447) und die initrd-Zeile in /etc/lilo.conf auszukommentieren (vgl. Abschnitt 16.2.5 auf Seite 421). ­ Wenn Sie dies nicht tun, wird der Kernel beim Booten hängen bleiben! Der Einsatz von Kernel-Modulen bietet sich vor allem für unregelmäßig oder selten benutzte Funktionalitäten an, wie z. B. parport- und Drucker- Unterstützung, Treiber für Diskettenlaufwerke oder bestimmte Dateisysteme, die Sie nur sporadisch verwenden werden. Der Kmod ist nicht dafür ausgelegt, Module wieder automatisch zu ent- laden; bei der heutigen RAM-Ausstattung der Rechner wäre der Ge- winn an Arbeitsspeicher nur marginal; vgl. auch /usr/src/linux/ Documentation/kmod.txt. Server-Maschinen, die spezielle Auf- gaben zu erfüllen haben und nur wenige Treiber benötigen, werden aus Performance-Gründen einen monolithischen" Kernel bevorzugen. 13.3 Konfiguration des Kernels Die Konfiguration des während der Installation oder während des Updates eingerichteten Kernel ist der Datei /usr/src/linux/.config zu ent- nehmen (vgl. Abschnitt 2.2.9 auf Seite 37); diese Datei beschreibt jedoch nur den Kernel, nicht die Module, die dem Paket kernmod entstammen. Wenn Sie auch Module neu compilieren wollen, müssen Sie diese explizit anwäh- len. Die Konfiguration des Kernels kann man auf drei verschiedene Arten vorneh- men: 1. In der Kommandozeile 2. Im Menü im Textmodus 3. Im Menü unter dem X Window System Diese drei Wege werden im Folgenden kurz vorgestellt. Kommandozeilenkonfiguration Um den Kernel zu konfigurieren, wechseln Sie nach /usr/src/linux und geben folgenden Befehl ein: erde:/usr/src/linux # make config Sie werden nach einer Reihe von Systemfähigkeiten gefragt, die der Kernel unterstützen soll. Bei der Beantwortung der Fragen gibt es normalerweise zwei oder drei Möglichkeiten: Entweder einfaches y und n , oder eine der 358 13.4. Einstellungen bei der Kernelkonfiguration drei Möglichkeiten y (engl. yes), n (engl. no) und m (engl. module). `m' bedeutet hierbei, dass der entsprechende Treiber nicht fest zum Kernel hinzu- gebunden wird, sondern vielmehr als Modul übersetzt wird, das zur Laufzeit zum Kernel hinzugeladen werden kann. Es versteht sich, dass sämtliche Trei- ber, die Sie zum Booten des Systems unbedingt benötigen, fest zum Kernel hinzugebunden werden müssen; in diesen Fällen also y wählen. Wenn Sie bei einer Frage eine andere Taste drücken, erhalten Sie eine kurze Hilfestellung zu der jeweiligen Option angezeigt. Konfiguration im Textmodus Angenehmer lässt sich die Konfiguration des Kernels mit menuconfig" durchführen; dies mit dem Befehl erde:/usr/src/linux # make menuconfig aufgerufen werden. Insbesondere müssen Sie sich bei einer geringfügigen Änderung der Konfiguration nicht durch zig Fragen durchtasten". Konfiguration unter dem X Window System Haben Sie das X Window System (Paket xf86) sowie Tcl/Tk (Paket tcl und Paket tk) installiert, so können Sie die Konfiguration alternativ durch erde:/usr/src/linux # make xconfig vornehmen. Sie haben dann eine grafische Oberfläche, die das Konfigurieren komfortabler macht. Dazu müssen Sie das X Window System aber als Be- nutzer `root' gestartet haben, da Sie andernfalls zusätzliche Maßnahmen treffen müssen, um Zugriff auf das Display eines anderen Benutzers zu erhal- ten. 13.4 Einstellungen bei der Kernelkonfiguration Die einzelnen Konfigurationsmöglichkeiten des Kernels können hier nicht Hilfetexte im Detail dargestellt werden. Machen Sie bitte Gebrauch von den zahlreich vorhandenen Hilfetexten zur Kernel-Konfiguration. Der allerneueste Stand der Dokumentation findet sich immer unter den Kernelquellen im Verzeichnis /usr/src/linux/Documentation. 13.5 Übersetzen des Kernels Entfernen Sie ggf. im Haupt-Makefile (ca. Zeile 74) das Kommentar- zeichen vor INSTALL_PATH=/boot, damit der eigene Kernel einfach in /boot installiert werden kann. Wir empfehlen, ein bzImage" zu generieren. So lässt es sich in der Regel umgehen, dass der Kernel zu groß wird, wie dies leicht passieren kann, wenn man zu viele Features auswählt und ein zImage" herstellt (typisch sind dann die Meldungen "kernel too big" oder "System is too big"). Nachdem Sie den Kernel für Ihre Gegebenheiten konfiguriert haben, starten Sie die Kompilation: 359 13. Der Kernel erde:/usr/src/linux # make dep erde:/usr/src/linux # make clean erde:/usr/src/linux # make bzImage Diese 3 Befehle können Sie auch in einer Befehlszeile eingeben. Die wer- den dann hintereinander abgearbeitet. Dies birgt Vorteile in sich, wenn Sie die Kernel-Übersetzung automatisch, z. B. über Nacht", durchführen lassen wollen. Dazu geben Sie ein: erde:/usr/src/linux # make dep clean bzImage Je nach Leistung des Systems dauert es jetzt einige Minuten (schneller AMD Athlon / Intel Pentium III)1 bis zu einigen Stunden (bei 386ern mit 8 MB), bis der Kernel neu übersetzt ist. Während der Übersetzungsprozedur können Sie sich selbstverständlich auf einer anderen Konsole weiterhin mit dem System beschäftigen. Nach der erfolgreichen Übersetzung finden Sie den komprimierten Kernel im Verzeichnis /usr/src/linux/arch/i386/boot. Das Kernel-Image ­ die Datei, die den Kernel enthält ­ heißt bzImage. Finden Sie diese Datei nicht vor, ist aller Wahrscheinlichkeit nach ein Fehler während der Kernel- übersetzung aufgetreten. Dies geht eventuell leicht in der Menge der Bild- schirmausgaben unter. Ob ein Fehler aufgetreten ist, können Sie dadurch ve- rifizieren, dass Sie nochmals mit erde:/usr/src/linux # make bzImage die Kernelübersetzung anstoßen und auf entsprechende Fehlermeldungen achten. Aber keine Angst: Fehler bei der Kernelübersetzung treten eher selten auf! Unter der Bash können Sie mit erde:/usr/src/linux # make bzImage 2>&1 | tee ker- nel.out die Ausgaben den Kompilationsvorgangs in die Datei kernel.out mit- schreiben" lassen; unter der Tcsh lautet der Befehl: erde:/usr/src/linux # make bzImage |& tee kernel.out Wenn Sie Teile des Kernels als ladbare Module konfiguriert haben, müssen Sie anschließend das Übersetzen dieser Module veranlassen. Dies erreichen Sie durch erde:/usr/src/linux # make modules 13.6 Kernel installieren Nachdem Sie den Kernel übersetzt haben, müssen Sie dafür sorgen, dass er künftig gebootet wird. Verwenden Sie den LILO, so muss dieser neu in- stalliert werden. Im einfachsten Fall kopieren Sie dazu den neuen Kernel nach /boot/vmlinuz (vgl. Abschnitt 13.5 auf der vorherigen Seite) und rufen dann den LILO auf; um sich vor unliebsamen Überraschungen zu schützen, empfiehlt es sich jedoch, den alten Kernel zunächst beizubehalten 1 Ein beliebter Test für Hard- und Software ist es, den Kernel mit der Option make -j zu übersetzen. Sie brauchen viel Hauptspeicher (bis über 100 MB) für diesen Test. Hierbei wird für jede zu übersetzende Quelldatei ein eigener Compiler gestartet. 360 13.6. Kernel installieren (/boot/vmlinuz.old), um ihn notfalls booten zu können, wenn der neue Kernel nicht wie erwartet funktioniert: erde:/usr/src/linux # cp /boot/vmlinuz /boot/vmlinuz.old erde:/usr/src/linux # cp arch/i386/boot/bzImage /boot/vmlinuz erde:/usr/src/linux # lilo Das Makefile-Target make bzlilo erledigt diese 3 Schritte übrigens in einem Rutsch. Die übersetzten Module müssen nun noch installiert werden; durch Eingabe von erde:/usr/src/linux # make modules_install können Sie diese in die korrekten Zielverzeichnisse unter /lib/modules/ kopieren lassen. Es ist darauf zu achten, dass Module, die man einkompiliert, unter /lib/ modules entfernt werden, da es sonsten zu nicht vorher- sehbaren Effekten kommen kann. Deswegen wird dem Ungeübten vom Selbstkompilieren des Kernels dringend abgeraten. Tragen Sie in Ihrer /etc/lilo.conf zusätzlich ein Label Linux.old als Boot-Image ein (vgl. Abschnitt 4.4.1 auf Seite 121) und benennen Sie den alten Kernel nach /boot/vmlinuz.old um. Sie stellen so sicher, dass Sie immer noch mit dem vorherigen Kernel booten können, falls dies mit dem neu gebauten nicht funktionieren sollte. Diese Möglichkeit wird ausführlich im Kapitel 4 auf Seite 115 beschrieben. Haben Sie die Datei /etc/lilo.conf nach Ihren Wünschen angepasst, so müssen Sie erneut erde:/usr/src/linux # lilo aufrufen. Falls Sie Linux von DOS aus über linux.bat ­ also mit loadlin ­ star- ten, müssen Sie den neuen Kernel noch nach /dosc/loadlin/bzimage2 kopieren, damit er beim nächsten Booten wirksam werden kann. Falls Sie Linux über den Windows NT Bootmanager starten, dürfen Sie nun nicht vergessen, erneut den LILO-Bootsektor umzukopieren (vgl. Ab- schnitt 4.7.2 auf Seite 132). Weiterhin ist Folgendes zu beachten: Die Datei /boot/System.map ent- hält die Kernelsymbole, die die Kernelmodule benötigen, um Kernelfunk- tionen korrekt aufrufen zu können. Diese Datei ist abhängig vom aktuellen Kernel. Daher sollten Sie nach der Übersetzung und Installation des Kernels die aktuelle3 Datei /usr/src/linux/System.map in das Verzeich- nis /boot kopieren. Falls Sie Ihren Kernel mittels make bzlilo bzw. make zlilo erstellen, wird diese Aufgabe automatisch für Sie erledigt. Sollten Sie beim Booten eine Fehlermeldung wie "System.map does not match actual kernel" erhalten, dann wurde wahrscheinlich nach der Kernelübersetzung die Datei System.map nicht nach /boot kopiert. 2 Bzw. dorthin, wohin Sie das Verzeichnis loadlin haben installieren lassen. 3 Bei jeder Kernelübersetzung wird diese Datei neu erzeugt. 361 13. Der Kernel 13.7 Boot-Diskette erstellen Möchten Sie eine Boot-Diskette mit dem neuen Kernel erstellen, so können Sie einfach den folgenden Befehl verwenden: erde:/usr/src/linux # make bzdisk 13.8 Festplatte nach der Kernel-Übersetzung aufräumen Sie können die während der Kernel-Übersetzung erzeugten Objekt-Dateien löschen, falls Sie Probleme mit dem Plattenplatz haben: erde: # cd /usr/src/linux erde:/usr/src/linux # make clean Falls Sie jedoch über ausreichend Plattenplatz verfügen und vorhaben, den Kernel des Öfteren neu zu konfigurieren, so überspringen Sie diesen letzten Schritt. Ein erneutes Übersetzen des Kernels ist dann erheblich schneller, da nur die Teile des Systems neu übersetzt werden, die von den entsprechenden Änderungen betroffen sind. 362