Red Hat Linux 7.0: Das Offizielle Red Hat Linux Referenzhandbuch | ||
---|---|---|
Zurück | Kapitel 2 Systemadministration | Vor |
Linux-Neulinge stellen häufig die Frage: "Warum soll ich einen eigenen Kernel generieren?" Angesichts der Fortschritte, die beim Einsatz von Kernel-Modulen gemacht worden sind, kann die Antwort auf diese Frage nur sein: "Wenn Sie nicht genau wissen, warum Sie einen eigenen Kernel generieren sollen, brauchen Sie wahrscheinlich auch keinen eigenen Kernel." Wenn Sie also keinen speziellen Grund haben, einen benutzerdefinierten Kernel zu generieren (es sei denn, Sie gehören zu den neugierigen Menschen), können Sie getrost zu Abschnitt namens Sendmail weiterblättern.
Früher war es notwendig, den Kernel neu zu kompilieren, wenn Sie Ihrem System neue Hardware hinzufügen wollten. Anders ausgedrückt: der Kernel war statisch. Durch Verbesserungen an den Kerneln von Linux 2.0.x war es möglich, viele der Hardware-Treiber zu Komponenten zu modularisieren, die nur bei Bedarf eingefügt werden konnten. Es traten jedoch erhebliche Probleme auf, wenn mehrere Kernel im System vorhanden waren, die für unterschiedliche Versionen kompiliert worden waren (beispielsweise SMP- im Gegensatz zu UP-Kerneln). Weitere Fortschritte bei der Modularisierung des Linux 2.2.x-Kernel ermöglichen jetzt eine bessere Verträglichkeit bei der Verwendung mehrerer Kernel (das gilt jedoch nicht für den gemeinsamen Zugriff auf Module).
Informationen zur Handhabung von Kernel-Modulen finden Sie in Abschnitt namens Laden von Kernelmodulen in Kapitel 3. Die meisten Änderungen sind nur beim Neukompilieren eines angepassten Kernels sichtbar.
Diese Anweisungen vermitteln Ihnen die nötigen Kenntnisse für die Nutzung der Leistungsfähigkeit und Flexibilität, die aus der Kernel-Modularisierung resultieren. Falls Sie keine Kernel-Modularisierung verwenden möchten, finden Sie in Abschnitt namens Erstellen eines monolithischen Kernels Erläuterungen zu den verschiedenen Gesichtspunkten der Erstellung und Installation eines monolithischen Kernels. Wir gehen davon aus, dass Sie die Pakete kernel-headers und kernel-source bereits installiert haben und dass das Verzeichnis /usr/src/linux das aktuelle Verzeichnis ist.
Stellen Sie unbedingt sicher, dass Sie über eine funktionierende Notfall-Bootdiskette verfügen, falls etwas schief geht. Wenn Sie während der Installation keine Bootdiskette erstellt haben, holen Sie dies jetzt mit dem Befehl mkbootdisk nach. Der Standardbefehl lautet ähnlich wie mkbootdisk --device /dev/fd0 2.2.x, wobei 2.2.x für die vollständige Version Ihres Kernels steht (z.B. 2.2.14-5.0). Wenn Sie fertig sind, überprüfen Sie die Bootdiskette, um sicherzugehen, dass Sie damit das System booten können.
Zu Beginn der Erstellung eines Kernels ist es wichtig, dass sich der Quellcodebaum in einem bekannten Zustand befindet. Es wird deshalb empfohlen, zuerst den Befehl make mrproper anzuwenden. Dieser Befehl entfernt alle Konfigurationsdateien einschließlich der Reste früherer Builds, deren Dateien möglicherweise im Quellcodebaum verstreut sind. Als Nächstes müssen Sie eine Konfigurationsdatei erstellen, die festlegt, welche Komponenten Ihr neuer Kernel enthalten soll. Folgende Methoden zur Kernelkonfiguration stehen zur Verfügung:
make config — Ein interaktives Textprogramm. Es werden Ihnen Komponenten angeboten, und Sie wählen Y (Ja), N (Nein) oder M (Modul).
make menuconfig — Ein grafisches, menügesteuertes Programm. In einem Menü mit verschiedenen Kategorien werden Ihnen Komponenten angeboten. Sie wählen die gewünschten Komponenten auf die gleiche Weise wie im Red Hat Linux Installationsprogramm aus. Markieren Sie die einzubindenden Komponenten mit Y (Ja), N (Nein) oder M (Modul).
make xconfig — ein X Window System-Programm. Die Komponenten sind in verschiedenen Menüebenen angeordnet und können mit der Maus ausgewählt werden. Wählen Sie auch hier zwischen Y (Ja), N (Nein) oder M (Modul).
make oldconfig — Hierbei handelt es sich um ein nicht-interaktives Skript, das die Einstellungen in der Datei Makefile als Standardeinstellungen einrichtet. Wenn Sie den von Red Hat gepatchten Kernel verwenden, wird Ihr System für den Kernel konfiguriert, der in Ihrem Software-Paket mitgeliefert wird. Dies ist sinnvoll, da auf diese Weise der Kernel mit bekannten, funktionierenden Standardeinstellungen konfiguriert werden kann. Anschließend können Sie Funktionsmerkmale deaktivieren, die Sie nicht benötigen.
![]() | Bitte beachten |
---|---|
Um kmod (Einzelheiten siehe Abschnitt namens Laden von Kernelmodulen in Kapitel 3) und Kernel-Module verwenden zu können, müssen Sie bei der Konfiguration bei kmod support und module version (CONFIG_MODVERSIONS) support mit Ja antworten. |
Wenn Sie einen Kernel mit einer Konfigurationsdatei erstellen möchten, (/usr/src/linux/.config — diese Datei wird erstellt, sobald eine der oben genannten Methoden ausgeführt wurde), die Sie bereits mit einer der erwähnten Methoden erzeugt haben, können Sie die Befehle make mrproper und make config auslassen und stattdessen den Befehl make dep, gefolgt von make clean verwenden, um den Quellcodebaum für den Build vorzubereiten.
Der nächste Schritt zur Erstellung eines modularisierten Kernels ist das Bearbeiten der Datei /usr/src/linux/Makefile und das Kompilieren die Quellcodekomponenten zu einem lauffähigen Programm, mit dem Ihr Computer gebootet werden kann. Mit der hier beschriebenen Methode können Sie am problemlosesten wieder in den Ausgangszustand zurückkehren, falls etwas schief gehen sollte. Falls Sie sich für weitere Möglichkeiten interessieren, finden Sie nähere Informationen hierzu im Kernel-HOWTO oder in Ihrem Linux-System in der Datei Makefile unter /usr/src/linux.
Bearbeiten Sie die Datei Makefile, und ändern Sie die Zeile: EXTRAVERSION = in eine "eindeutige" Bezeichnung (zum Beispiel durch Anfügen Ihrer Initialen an das Ende der Zeichenkette, wie in EXTRAVERSION = -2.5.0sjs). Dadurch können der alte und der neue Kernel gleichzeitig auf Ihrem System verwendet werden.
Erstellen Sie den Kernel mit make bzImage.
Erstellen Sie die von Ihnen konfigurierten Module mit make modules.
Installieren Sie die neuen Module (auch, wenn Sie selbst keine Module erstellt haben) mit make modules_install. Dadurch werden die Kernel-Module im Verzeichnis /lib/modules/ unter Verwendung des in Makefile angegebenen Pfadnamens gespeichert. In unserem Beispiel wäre das /lib/modules/2.2.15-2.5.0sjs/.
Falls Sie einen SCSI-Adapter verwenden und den SCSI-Treiber modularisiert haben, erstellen Sie ein neues initrd-Image (siehe Abschnitt namens Erstellen eines initrd-Images. Beachten Sie aber, dass es kaum praktische Gründe gibt, in einem benutzerdefinierten Kernel den SCSI-Treiber zu modularisieren). Erzeugen Sie kein initrd-Image, es sei denn, Sie haben einen spezifischen Grund dafür. Verzichten Sie ansonsten darauf, und fügen Sie ein solches Image auch niemals zu lilo.conf hinzu.
Es empfiehlt sich, den ursprünglichen Kernel aufzubewahren. So können Sie zum Booten jederzeit auf einen zusätzlichen, funktionierenden Kernel zurückgreifen, falls der neu erstellte Kernel Fehler enthalten sollte. Zum Hinzufügen des Kernels zu LILO benennen Sie den ursprünglichen Kernel in /boot um, kopieren den neuen Kernel nach /boot, fügen einige Zeilen in /etc/lilo.conf ein und führen /sbin/lilo aus. Hier ein Beispiel für eine mögliche standardmäßige Datei /etc/lilo.conf, wie sie im Lieferumfang von Red Hat Linux enthalten ist:
boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 message=/boot/message linear default=linux image=/boot/vmlinuz-2.2.16-12 label=linux initrd=/boot/initrd-2.2.16-12.img read-only root=/dev/hda8 other=/dev/hda1 label=dos |
Als Nächstes müssen Sie /etc/lilo.conf aktualisieren. Wenn Sie ein neues initrd -Image erstellt haben, müssen Sie LILO zuvor die Anweisung geben, das neue Image zu verwenden. Im folgenden Beispiel zu /etc/lilo.conf wurden in der Mitte der Datei vier Zeilen eingefügt, die bewirken, dass ein anderer Kernel beim Booten verwendet wird. Dazu wurde /boot/vmlinuz in /boot/vmlinuz.old umbenannt und das Label auf old gesetzt. Außerdem wurde eine initrd-Zeile für den neuen Kernel eingefügt:
boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 message=/boot/message linear default=linux image=/boot/vmlinuz-2.2.16-12 label=linux initrd=/boot/initrd-2.2.16-12.img read-only root=/dev/hda8 image=/boot/vmlinuz-2.2.16-12.sjs label=test initrd=/boot/initrd-2.2.16-12sjs.img read-only root=/dev/hda8 other=/dev/hda1 label=dos |
Wenn das System jetzt gestartet wird und Sie am Prompt LILO boot: die Tabulatortaste drücken, werden Ihnen die verfügbaren Auswahlmöglichkeiten angezeigt:
LILO boot: linux test dos |
Drücken Sie die Eingabetaste, um mit dem alten Kernel (linux) zu booten. Wenn Sie keine Taste drücken, lädt LILO den alten Kernel nach einer Zeitverzögerung automatisch. Wenn Sie mit dem neuen Kernel (test) booten wollen, geben Sie test ein und drücken die Eingabetaste.
Es folgt eine Zusammenfassung der Schritte:
Kopieren Sie den kompilierten Kernel in Ihr Verzeichnis /boot. Verwenden Sie dabei den Namen, der sich aus früheren Änderungen der Datei Makefile ergab. Dazu ein Beispiel:
cp -p /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.15-2.5.0sjs /usr/src/linux/System.map /boot/System.map-2.2.15-2.5.0sjs |
Bearbeiten Sie die Datei /etc/lilo.conf.
Erstellen Sie bei Bedarf eine neue initiale Ramdisk, initrd-Image (siehe Abschnitt namens Erstellen eines initrd-Images).
Führen Sie /sbin/lilo aus (es empfiehlt sich, /sbin/lilo -t zuerst zu verwenden — dieser Befehl testet Ihre lilo.conf-Datei, ohne einen neuen Boot-Sektor oder eine Map-Datei zu schreiben). Sie können die Option -v zu lilo hinzufügen, um ausführlichere Meldungen anzeigen zu lassen, wenn Sie glauben, es könnte Probleme geben.
Sie können den neuen Kernel testen, indem Sie Ihren Computer neu starten und die Meldungen am Bildschirm verfolgen. Dabei wird angezeigt, ob die Hardware richtig erkannt wird.
Beim Booten wird ein initrd-Image für das Laden der SCSI-Module benötigt. Wenn Sie kein initrd -Image benötigen, erstellen Sie keines, und bearbeiten Sie auch nicht die Datei lilo.conf, um dieses Image einzufügen.
Das Shell-Skript /sbin/mkinitrd kann das richtige initrd-Image für Ihren Computer erstellen, wenn die folgenden Bedingungen erfüllt sind:
Das Loopback-Blockgerät ist verfügbar.
Die Datei /etc/conf.modules enthält eine Zeile für Ihren SCSI-Adapter, zum Beispiel:
alias scsi_hostadapter BusLogic |
Um das neue initrd-Image zu erstellen, führen Sie /sbin/mkinitrd mit den folgenden Parametern aus:
/sbin/mkinitrd /boot/newinitrd-image 2.2.15-2.5.0sjs |
Dabei ist /boot/newinitrd-image die Datei für Ihr neues Image, und 2.2.15 ist der Kernel, dessen Module (aus /lib/modules) im initrd-Image verwendet werden sollen. (Die Versionsnummer dieses Kernels stimmt nicht notwendigerweise mit der Versionsnummer des aktuell verwendeten Kernels überein.)
Um einen monolithischen Kernel zu erstellen, führen Sie - von ein paar Ausnahmen abgesehen - dieselben Schritte aus wie beim Erstellen eines modularen Kernels.
Antworten Sie auf die Fragen bei der Konfiguration des Kernels ausschließlich mit Ja oder Nein (keine Modularisierung). Außerdem müssen Sie bei der Konfiguration bei kmod support und module version (CONFIG_MODVERSIONS) support mit Nein antworten.
Lassen Sie die folgenden Schritte aus:
make modules make modules_install |
Bearbeiten Sie die Datei lilo.conf, und fügen Sie die Zeile append=nomodules hinzu.