|
Viele Distributionen bieten unter einer grafischen Oberfläche sehr komfortable Möglichkeiten zum Erstellen eines neuen Kernels. Allerdings helfen sie einem wenig, wenn man beispielsweise auf einem dedizierten Server ohne ein X-Window System einen neuen Kernel einspielen möchte. Dann muss dieser Vorgang manuell durchgeführt werden, was in diesem Beitrag erläutert wird.
Ich bitte zu beachten, dass hier vorerst lediglich die native Vorgehensweise zum Erstellen eines neuen Kernels ab Version 2.6 im Zusammenspiel mit dem Bootloader LILO erklärt wird. Eine Aktuallisierung zu GRUB wird in nächster Zeit folgen.
Zu Beginn sollte man sich einen neuen Kernel besorgen. Download von kernel.org
Für den aktuellsten Kernel einfach die höchste und damit aktuellste Versionsnummer suchen. Zum Zeitpunkt der Beitragserstellung wäre es die Datei linux-2.6.17.11.tar.gz und sie hat eine Größe von c.a. 41 MB.
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.11.tar.gz /usr/src/
darauf hin wechselt man in das Donwloadverzeichnis...
entpackt das Archiv...
tar -zxvf linux-2.6.17.11.tar.gz
und wechselt weiter in das automatisch erstellte Verzeichnis mit den neuen Kernel Quelldateien...
Dieser Vorgang kann, je nach Rechnerpreformance und Downloadbandbreite einige Zeit in Anspruch nehmen.
Nun wird das Verzeichnis von Altlasten gesäubert:
Im Normalfall sollte die Ausführung dieses Befehls an dieser Stelle und zum jetzigen Zeitpunkt keine Bildschirmausgaben erzeugen. Der Befehl säubert das Verzeichnis von alten Dateien die übrig bleiben würden, wenn schon einmal aus dem Verzeichnis heraus ein Kernel erstellt worden wäre. Aber das ist zu diesem Zeitpunkt ja nicht der Fall. Wenn man später den Kernel nochmal neu erstellen will ist dieser Befehl allerdings dringend erforderlich. Deshalb gewöhnt man ihn sich direkt an.
Bevor es nun daran geht den neuen Kernel zu konfigurieren, ist es sinnvoll die bestehende Konfiguration des aktuell laufenden Kernels zu übernehmen. Allerdings gibt es hierbei ein potentielles Problem. Zwar wird der aktuell laufende Kernel mit der zugehörigen Konfigurationsdatei mit hoher Wahrscheinlichkeit stabil laufen, allerdings fallen bei größeren Versionssprüngen veraltete Funktionen aus dem Kernel heraus und neue kommen hinzu. Letzteres stellt kein Problem dar, da neuere Funktionen im weiteren Verlauf noch angepasst werden können oder einfach mit ihren Standardwerten übernommen werden. Allerdings kann es bei nicht mehr vorhandenen Funktionen zu Problemen kommen, da der neue Kernel nichts mehr mit der Konfigurationsangabe anzufangen weiß.
Für dieses Problem gibt es den Befehl make oldconfig. Er übernimmt die Angaben aus einer bestehenden Konfiguration und bereitet sie für einen neuen Kernel auf. Um ihn durchführen zu lassen, kopiert man sich zuerst die bestehende Konfigurationsdatei in das Quellverzeichnis des neuen Kernels:
cp /boot/config-2.4.31 /usr/src/linux-2.6.17.11/.config
und führt anschließend den Befehl aus...
Dieses Programm arbeitet die Konfigurationspunkte ab und erwartet bei neu hinzugekommenen Funktonen eine Auswahl. Zum Glück gibt es aber auch hier Vorgabeeinstellungen. Und da man gerade am Anfang mit den meißten Punkten nicht viel anfangen kann, ist es keine Schande an dieser Stelle die Vorgabeeinstellungen mit der Return-Taste zu bestätigen, bis das Programm durchgelaufen ist.
Nach Abschluss von make oldconfig liegt eine kompatible Konfigurationsdatei vor und die deutlich angenehmere Konfigurationsvariante make menuconfig kann gestartet werden.
Das Programm make menuconfig bietet ein einfaches grafisches Menü, in dem man sich mit den Cursortasten bewegt und Konfigurationen direkt ansteuern kann. Des Weiteren kann man zu jedem Punkt in der Konfiguration die Hilfe abrufen. Dort werden die einzelnen Funktionen beschrieben und Auswahlvorschläge angeboten.
Bevor es aber nun an die angepasste Konfiguration geht muss die Frage geklärt werden, ob ein Auswahlelement in den Kernel integriert werden soll oder als Modul abreiten wird, bzw. überhaupt kann (nicht alle Elemente können modularisiert werden!). Der Hauptvorteil des Modulverfahrens ist, dass Elemente wie z.B. Treiber aktuallisiert werden können, ohne dass der Kernel neu kompiliert werden muss.
Man solltet zudem unbedingt darauf achten, dass man essentielle Auswahlelemente die zum Systemstart notwendig sind nicht als Modul konfiguriert. Dazu zählen z.B. SCSI Treiber oder das Dateisystem der Boot Partition. Die sicherere, wenn auch weniger elegante Strategie ist es, alles in den Kernel zu integrieren. Aber das bleibt jedem selbst überlassen.
Exemplarisch nun der Ausschnitt eines Untermenüs mit verschiedenen Auswahlmöglichkeiten:
[*] Network packet debugging Packet socket [ ] Packet socket: mapped IO <*> Unix domain sockets < > IPsec user configuration interface (NEU) PF_KEY sockets [*] TCP/IP networking
Ob ein Menüpunkt überhaupt das Modulverfahren unterstützt, ergibt die erste Spalte:
- [ ] Kann nur in den Kernel integriert werden. Auswahl: Y/N
- < > Kann in den Kernel integriert oder als Modul geladen werden. Auswahl: Y/N oder M/N
- Eine in den Kernel integrierte Auswahl wird mit * markiert, ein Modul mit M.
Nun geht es daran zu entscheiden was man überhaupt benötigt. Eine Pauschallösung gibt es aufgrund der unterschiedlichen Hardware die verwendet wird nicht. Ein erster Ansatz ist immer die im System verwendete Hardware und deren Typenbezeichnung zu ermitteln.
- Prozessor
- Chipsatz des Motherboards
- Controller (IDE/SCSI/SATA)
- Grafikkarte
- Netzwerkkarte
- MODEM/ISDN
Weitere Auswahlemente die berücksichtigt werden müssen.
- Dateisysteme
- Netzwerkprotokolle
Man wird immer wieder auf Auswahlpunkte treffen, die einem im ersten Moment nichts sagen. Dazu kann ich nur wieder die Hilfe ans Herz legen, wo vieles erklärt wird und auch Vorschläge unterbreitet werden, ob man die jeweilge Auswahl in der Regel überhaupt benötigt.
Nachdem man irgendwann alle Einstellungen vorgenommen hat, beendet man das Konfigurationsmenü. Die Abfrage ob die Konfiguration gespeichert werden soll muss man mit "Yes" beantworten, sonst gehen alle Einstellungen verloren! Alternativ kann man die Konfigurationsdatei auch unter einem anderen Namen sichern, z.B. falls man erst noch etwas prüfen will. Aber Vorsicht: Die weiteren Bearbeitungschritte verwenden ausschließlich die Datei config! Deshalb ist unbedingt sicherzustellen, dass die gewünschte Endkonfiguration auch wirklich in der Datei config enthalten ist.
Nun geht es daran den neuen Kernel mit den neuen Einstellungen zu kompilieren.
Durch make wird ein komprimiertes bzImage erzeugt, ein unkomrpimiertes Kernelimage vmlinux und die Module. Falls man den Kernel mit Modulen konfiguriert hat, müssen diese noch installiert werden. Aber auch ohne konfigurierte Module sollte man den folgenden Schritt ausführen, denn in den tiefen der Konfiguration kann man schnell mal ein Modul übersehen. Und schaden tut der Befehl ohnehin nicht.
Jetzt muss der neue Kernel dem System zur Verfügung gestellt werden. Es ist wichtig, dass man die nun folgenden Erklärungen versteht und keine Fehler macht. Es ist ja durchaus möglich, dass man beim neuen Kernel falsche Konfigurationen vorgenommen hat und das System mit ihm nicht richtig booten wird. Das ist keine Schande, aber man muss unbedingt gewährleisten das System wieder mit dem alten Kernel booten zu können.
Dieser Befehl prüft im /boot Verzeichnis nach dem aktuellen Kernel vmlinuz und den zugehörigen Dateien System.map und config und benennt diese jeweils in *.old um, bzw. die Links. Anschließend fügt er die neuen Kernel Dateien in das Verzeichnis ein. Dies sollte überprüft werden:
-rw-r--r-- 1 root root 885062 2006-08-21 17:41 System.map -rw-r--r-- 1 root root 608033 2005-06-06 05:37 System.map-ide-2.4.31 lrwxrwxrwx 1 root root 21 2006-08-21 18:45 System.map.old -> System.map-ide-2.4.31 -rw-r--r-- 1 root root 512 2006-03-24 12:27 boot.0300 -rw-r--r-- 1 root root 168 2006-08-20 23:33 boot_message.txt -rw-r--r-- 1 root root 36742 2006-08-21 16:18 config -rw-r--r-- 1 root root 41760 2005-06-06 05:37 config-ide-2.4.31 lrwxrwxrwx 1 root root 17 2006-08-21 16:19 config.old -> config-ide-2.4.31 -rw-r--r-- 1 root root 5032 2004-05-21 09:19 diag1.img -rw------- 1 root root 49664 2006-08-21 18:45 map -rw-r--r-- 1 root root 2078176 2006-08-21 17:41 vmlinuz -rw-r--r-- 1 root root 1256566 2005-06-06 05:37 vmlinuz-ide-2.4.31 lrwxrwxrwx 1 root root 18 2006-08-21 17:43 vmlinuz.old -> vmlinuz-ide-2.4.31
Essentiel wichtig ist zu erkennen, welche Dateien zu welchem Kernel gehören! In diesem Fall verweisen alle .old Links auf die alten Kernel Dateien mit der Erweiterung -ide-2.4.31 und markieren damit ihre Zusammengehörigkeit.
Eine weitere Prozedur die make install durchgeführt hat, ist der Eintrag des neuen Kernels in den Bootloader, hier LILO. Allerdings kann diese Prozedur nicht alle Varianten eines Systems abdecken und daher ist eine manuelle Prüfung in jedem Fall ratsam. Dazu bearbeitet man die Datei lilo.conf mit einem Editor wie vi.
In der Datei /etc/lilo.conf passt man nun folgenden Eintrag an, falls notwendig:
# Linux bootable partition config begins image = /boot/vmlinuz root = /dev/hda2 label = Linux_6_4 read-only image = /boot/vmlinuz.old root = /dev/hda2 label = Linux_2_4 read-only # Linux bootable partition config ends
Anmerkung: Das root device, hier /dev/hda2, ist das Gerät auf dem sich das Verzeichnis /boot befindet. Da dies in der Regel auch das Boot-Device ist, kann man es mit fdisk -l |grep '*' in Erfahrung bringen.
Nachdem die Anpassung erfolgt ist, müssen diese noch bereitgestellt werden. Dies geschieht beim Bootloader LILO durch einen einfachen Aufruf:
Added Linux_2_6 * Added Linux_2_4
Dabei wird nochmal automatisch überprüft, ob die Einträge in der Datei lilo.conf mit den existierenden Dateien im Verzeichnis /boot übereinstimmen. Damit ist der Installationsvorgang abgeschlossen. Nun kann man das System neu starten und den neuen Kernel auswählen.
Sollte es zu Bootproblemen mit dem neuen Kernel kommen, dann notiert man sich die ausgegebenen Fehlermeldungen, startet das System neu, bootet den alten Kernel und beginnt mit der Fehlerbehebung. Wenn man mit der Fehlermeldung nichts anfangen können, hilft es oft diese einfach als Suchtext in einer Suchmaschine zu verwenden. Die Suchergebnisse führen einen in der Regel schnell zu Lösungen.
Wenn nun aber auch der alte Kernel plötzlich nicht mehr richtig startet, dann liegt dies mit sehr hoher Wahrscheinlichkeit am Bootloader, respektive dessen Konfigurationsdatei. Ein Fehler in den alten Kernel-Dateien selber ist unwahrscheinlich, denn dort wurde ja allenfalls der Name angepasst.
Um evtl. Fehler zu beheben startet man mit einer Linux Installations CD in den Konsolen Modus. Dort mountet man die Systempartition unter Angabe des Dateisystems und mit Schreibrechten in ein beliebiges Verzeichnis:
mount -t ext2 /dev/hda2 /mnt -rw
Damit hat man über das Verzeichnis /mnt Zugriff auf die Boot-Partition. Nun kann man die Einstellungen überprüfen und Änderungen vornehmen. Zu beachten ist, dass alles Pfade nun mit /mnt beginnen. Denn sonst würdet man keine Änderungen auf der Linux Partition vornehmen, sondern auf der "virtuellen" Partiton, die das von CD gebootete Linux erstellt hat.
- /mnt/boot - Das /boot Verzeichnis der Boot-Partition.
- /mnt/etc/lilo.conf - Die lilo.conf auf der Boot-Partition.
- /mnt/sbin/lilo - Der Befehl führt lilo für die Boot-Partition.
Weitere Informationen:
- Die Verwendung von Links im /boot Verzeichnis ist nicht zwingend erforderlich. Sie vereinfachen aber einiges, da man den Orginaldateien aussagekräftige Namen geben kann, die Linknamen aber auf das Nötigste reduziert.
|