Ideen - Werkstatt - Projekte - Basteln - Hausbau | ||
Überblick Impressum Hardware Mainboard Gehäuse Kühlung Tasten Scrollrad Festplatte Display (LCD) TFT Touchscreen Fernbedienung Bastelkiste (zu verkaufen) Software Linux Ohne Festplatte Bedienung mittels Webbrowser Software Download Linux Howtos Ohne Festplatte Kernel kompilieren Tagebuch Newsletter Kontakt Links Andere Basteleien Disclaimer Impressum | Linux WegweiserKompilieren des Linux KernelsDieser Artikel erklärt wie und warum ein Linux Kernel kompiliert werden soll.Inhalt1.1 Was ist der Linux Kernel? 1.1 Was ist der Linux Kernel?Der Kernel ist die Schnittstelle zwischen Anwendungsprogrammen und der Hardware des Systems. Er kümmert sich darum, dass die Anwendungsprogramme auf die vorhandene Hardware zugreifen können, und zwar ohne die Details der Hardware zu kennen und ohne Rücksicht auf andere Programme nehmen zu müssen.BeispielDie zuvor erwähnte Schnittstellenfunktion gilt insbesondere für den Arbeitsspeicher und den Prozessor. Jedes Programm soll seinen eigenen Speicherbereich haben, den andere Programme in der Regel weder lesen noch beschreiben sollen. Und was ist, wenn mehr Speicher benötigt wird als physikalisch vorhanden ist? Der Kernel kümmert sich darum. 1.2 Welche Vorteile bringt das eigene Kompilieren?Heutige Linux-Distributionen bringen in der Regel sehr gute "All-round"-Kernel mit: Sie laufen auf praktisch allen PC-Systemen. Dennoch gibt es einige Gründe, den Kernel neu zu erstellen:
1.3 VoraussetzungenZum Kompilieren eines Kernel benötigt man eine ganze Reihe von Softwarepaketen. Die meisten sind in der Regel aber schon bei der Installation des Systems aufgespielt worden. Was unter Umständen übrig bleibt:
2.1 Installation der Kernel-QuellenDie Kernel-Quellen befinden sich normalerweise im Verzeichnis /usr/src/linux, wobei 'linux' lediglich ein symbolischer Link auf das wahre Verzeichnis, z.B. linux-2.6.16.21-0.13 ist. Mehrere Kernel-Versionen können so gleichzeitig installiert sein. Neue Kernel-Quellen sollten nach dem gleichen Schema aufgespielt werden, der Link 'linux' sollte auf die jeweils verwendeten Quellen zeigen. Werden die Kernel-Quellen mittels Paketmanager installiert, so sollten sie automatisch an der richtigen Stelle landen. Nach einem Download einer .tar.bz2 Datei sollte die Datei an der richtigen Stelle entpackt werden. Dazu wechselt man in das /usr/src Verzeichnis und entpackt die heruntergeladene Datei: tar -xjf /Pfad-zur-tar.bz2-Datei/linux-2.x.x.x.tar.bz2Um in das Verzeichnis /usr/src schreiben zu dürfen, sollte man 'root' sein. In jedem Fall sollte es nun ein neues Verzeichnis /usr/src/linux-2.x.x.x (entsprechend der neuen Kernel-Version) geben, in welches man nun wechselt. Achtung: Alle Befehle, die in den folgenden Abschnitten genannt werden, müssen innerhalb dieses Verzeichnisses ausgeführt werden. 2.2 Konfiguration des Kernels vorbereitenNoch bevor der Kernel konfiguriert wird, sollte das Kernel-Verzeichnis mit dem Befehl make mrproper"gesäubert" werden. Dabei werden alle Dateien, die einer neuen Konfiguration im Wege stehen könnten entfernt. Dazu gehört auch die Konfigurationsdatei .config selbst (siehe folgender Abschnitt), die eventuell zuvor gesichert werden sollte. Vor dem Kompilieren muss der Kernel konfiguriert werden. Der Kompiler sucht die Konfiguration in der Datei .config im jeweiligen Kernel-Verzeichnis, z.B. /usr/src/linux-2.6.18.1/.config. Wenn der Quell-Code des Kernels zum ersten Mal kompiliert wird, existiert diese Datei normalerweise noch nicht. Stattdessen findet man eine Defaultkonfiguration in der Datei arch/i386/defconfig, welche man nach .config kopiert. Eine oftmals bessere Alternative ist jedoch die Konfiguration des aktuell laufenden Kernels zu verwenden. Diese findet man gzipped in /proc/config.gz. Das Kommando gzip -d < /proc/config.gz > .configerzeugt daraus wieder eine .config-Datei. Achtung: Wenn die .config-Datei so, also ohne weitere Änderungen, benutzt werden soll, dann muss der Befehlmake oldconfigausgeführt werden, damit der Quellcode entsprechend .config konfiguriert wird. Grundsätzlich ist es empfehlenswert, eine als funktionierend bekannte Konfigurationsdatei an einen sicheren Ort zu kopieren. 2.3 Konfiguration des KernelsJetzt kann man seine eigenen Wünsche einbringen. Dazu sollte man nicht die .config-Datei direkt editieren, sondern mittels make xconfigein graphisches Konfigurationsprogramm oder mittels make menuconfigein Text-basiertes starten. Beide Programme bieten zu jeder Option eine kurze Hilfe an. Die meisten Optionen lassen sich entweder ausschalten/entfernen (es wird ein leeres Kästchen bzw. < > angezeigt), als Modul erstellen (ein Kästchen mit einem Punkt bzw. <M>) oder direkt in den Kernel integrieren (ein Kästchen mit einem Häkchen bzw. <*>). Die Möglichkeiten zur Konfiguration sind sehr umfangreich, und man sollte Änderungen mit großer Vorsicht vornehmen. Vor allem beim Entfernen von Optionen sollte man zu 100% wissen was man tut. Die Zusammenhänge sind oft nicht sofort ersichtlich, und so kann es passieren dass z.B. der USB-Stick oder das CD-Rom nicht mehr funktioniert, weil man mit den SCSI-Einstellungen gespielt hat. Eine Kopie einer funktionierende Kernel-Konfigurationsdatei sollte man immer an einer sicheren Stelle aufbewahren. Wenn man eine bestimmte Option nicht findet, so kann es sein, dass sie "versteckt" wurde, da sie sich noch in einem experimentellen Stadium befindet. Mit der Option "Code maturity level options" (ganz oben) und dann durch entfernen von "Prompt for development and/or incomplete code/drivers" werden alle Optionen angezeigt. 2.3.1 Treiber als Modul oder in den Kernel?Bei Treibern hat man drei Möglichkeiten:
3 KompilierenWenn die Konfiguration erledigt ist, ist das meiste schon geschafft. Das Kompilieren benötigt zwar etwas Zeit ist aber vergleichsweise unkompliziert:
4.1 Installation der ModuleNoch liegen der erzeugten Module innerhalb des Kernel-Quellcodes. Um sie zu verwenden, müssen sie unterhalb von /lib/modules liegen. Da Module verschiedener Kernel-Versionen inkompatibel sind, gibt es für die Module jeder Kernel-Version ein eigenes Unterverzeichnis, z.B. /lib/modules/2.6.18.1. Das Kopieren (was als root erledigt werden muss) übernimmt der folgende Befehl: su 4.2 Installation des KernelsDie Installation des Kernels selbst ist unter Umständen etwas aufwändiger. Beim Booten wird über den Bootloader (z.B. grub) der zu bootende Kernel gewählt und gestartet. Ergo muss der Bootloader über den neuen Kernel Bescheid wissen. Die folgenden Abschnitte beschreiben die Installation für ein SuSE System (mit Versionen 9 und 10 müsste es so klappen). Der neue Kernel befindet sich in arch/i386/boot/bzImage und muss in das /boot Verzeichnis kopiert werden. Dabei sollte der Kernel umbenannt werden, um verschiedene Versionen parallel betreiben zu können: cp arch/i386/boot/bzImage /boot/vmlinuz-KERNEL_VERSIONKERNEL_VERSION sollte den kompilierten Kernel möglichst genau beschreiben, z.B. '2.6.18.1' oder '2.6.18.1-ext3_in_kernel'. 4.3 Installation der Init-RamdiskWenn nicht alle zum Booten notwendigen Treiber in den Kernel integriert wurden (was ich jedoch empfehle) benötigt der Kernel eine Init-Ramdisk. Dies erledigt das Programm mkinitrd, welches je nach Distribution unterschiedliche Parameter benötigt. Genaueres steht in den man-pages von mkinitrd und initrd. mkinitrd -k vmlinuz-KERNEL_VERSION -i initrd-KERNEL_VERSION 4.4 Konfiguration des Bootloaders GrubGrub ist der am häufigsten verwendete Bootloader. Deshalb beschränke ich mich hier auf dessen Konfiguration. Wenn ein neuer Kernel kompiliert wurde, möchte man den Kernel in der Regel erst Testen, und bei Bedarf zum alten Kernel zurückkehren. Dazu muss man lediglich einen zusätzlichen Eintrag in der Konfigurationsdatei von Grub vornehmen. Beim Booten bietet einem Grub dann die Wahl, den alten oder den neuen Kernel zu booten. Die Grub-Konfigurationsdatei /boot/grub/menu.lst erhält für jedes zu bootende System einige Zeilen die das Systembeschreiben. Der Standard-Eintrag könnte wie folgt aussehen: title SUSE Linux 10.1Die erste Zeile enthält das Schlüsselwort 'title' gefolgt vom Namen des Systems wie er beim Booten in der Auswahlliste auftauchen soll. Die legt fest, auf welcher Festplatte und Partition sich das root-Dateisystem befindet. Die dritte Zeile bestimmt den Kernel der gebootet werden soll und die notwendigen Parameter. Die vierte Zeile enthält die init-Ramdisk, auf die verzichtet werden kann, wenn alle zum Booten notwendigen Treiber in den Kernel integriert wurden. Um einen neuen Kernel zu testen, kopiert man diesen Block und ändert 'title', 'kernel' und 'initrd' entsprechend. Welcher Block per default gebootet wird, legt der Parameter default # im Dateikopf fest. default 0 bedeutet, dass der erste Konfigurationsblock als Default gelten soll. title SUSE Linux 10.1Behält man die alte Konfiguration als Default bei, muss bei einem Neustart der neue Eintrag SUSE Linux 10.1 - Test des neuen Kernels ausgewählt werden, um den neuen Kernel zu booten. Wenn alles funktioniert, muss lediglich die default # Zeile angepasst werden. 5 QuellenKernel Rebuild Guide (englisch) |