Auf dieser Seite
- 1 Vorbemerkung
- 2 Erstellen eines Kernel-.deb-Pakets
- 2.1 Erforderliche Pakete für die Kernel-Kompilierung installieren
- 2.2 Laden Sie die Kernelquellen herunter
- 2.3 Patches auf die Kernelquellen anwenden (optional)
- 2.4 Den Kernel konfigurieren
- 2.5 Erstellen Sie den Kernel
- 2.6 Den neuen Kernel installieren
- 3.1 Erforderliche Pakete für die Kernel-Kompilierung installieren
- 3.2 Laden Sie die Kernelquellen herunter
- 3.3 Patches auf die Kernelquellen anwenden (optional)
- 3.4 Den Kernel konfigurieren
- 3.5 Erstellen und Installieren des Kernels
- 3.6 Schritte nach der Installation
Jede Distribution verfügt über einige spezifische Tools zum Erstellen eines benutzerdefinierten Kernels aus den Quellen. In diesem Artikel geht es um das Kompilieren eines Kernels auf einem Debian (Etch)-System. Es beschreibt, wie Sie einen benutzerdefinierten Kernel unter Verwendung der neuesten unveränderten Kernel-Quellen von www.kernel.org (Vanilla-Kernel) erstellen, sodass Sie unabhängig von den von Ihrer Distribution bereitgestellten Kerneln sind. Es zeigt auch, wie die Kernel-Quellen gepatcht werden, wenn Sie Funktionen benötigen, die dort nicht enthalten sind.
Ich gebe keine Garantie dafür, dass dies bei Ihnen funktioniert!
1 Vorbemerkung
Ich werde zwei Möglichkeiten beschreiben, einen neuen Kernel zu kompilieren. Bei der ersten Methode erhalten Sie ein Kernel-.deb-Paket, das auf dem System installiert werden kann und das Sie mit anderen teilen und auf anderen Debian Etch-Systemen installieren können.
Die zweite Methode besteht darin, einen Kernel auf "traditionelle" Weise zu kompilieren. Dieser Weg funktioniert auf jeder Linux-Distribution, aber natürlich erhalten Sie am Ende kein Kernel-.deb-Paket.
2 Erstellen eines .deb-Kernelpakets
Dieses Kapitel zeigt, wie man einen Kernel baut und am Ende ein .deb-Paket hat, das man installieren und mit anderen teilen kann.
2.1 Erforderliche Pakete für die Kernel-Kompilierung installieren
Zuerst aktualisieren wir unsere Paketdatenbank:
apt-get update
Dann installieren wir alle benötigten Pakete wie folgt:
apt-get install kernel-package ncurses-dev fakeroot wget bzip2 build-essential
2.2 Laden Sie die Kernelquellen herunter
Als nächstes laden wir unseren gewünschten Kernel nach /usr/src herunter. Gehen Sie zu www.kernel.org und wählen Sie den Kernel aus, den Sie installieren möchten, z. linux-2.6.21.3.tar.bz2 (Sie finden alle 2.6-Kernel hier:http://www.kernel.org/pub/linux/kernel/v2.6/). Dann können Sie es wie folgt nach /usr/src herunterladen:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2
Dann entpacken wir die Kernelquellen und erstellen einen Symlink Linux zum Kernelquellenverzeichnis:
tar xjf linux-2.6.21.3.tar.bz2
ln -s linux-2.6.21.3 linux
cd /usr/src/linux
2.3 Anwenden von Patches auf die Kernelquellen (optional)
Manchmal benötigen Sie Treiber für Hardware, die standardmäßig nicht vom neuen Kernel unterstützt wird, oder Sie benötigen Unterstützung für Virtualisierungstechniken oder eine andere hochmoderne Technologie, die es noch nicht in den Kernel geschafft hat. In all diesen Fällen müssen Sie die Kernel-Quellen patchen (sofern ein Patch verfügbar ist...).
Nehmen wir nun an, Sie haben den benötigten Patch (ich nenne ihn in diesem Beispiel patch.bz2) nach /usr/src heruntergeladen. So wenden Sie es auf Ihre Kernel-Quellen an (Sie müssen sich immer noch im /usr/src/linux-Verzeichnis befinden):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Der erste Befehl ist nur ein Test, er ändert nichts an Ihren Quellen. Wenn keine Fehler angezeigt werden, können Sie den zweiten Befehl ausführen, der den Patch tatsächlich anwendet. Tun Sie es nicht, wenn der erste Befehl Fehler anzeigt!
Sie können auch Kernel-Prepatches auf Ihre Kernel-Quellen anwenden. Wenn Sie beispielsweise eine Funktion benötigen, die nur in Kernel 2.6.22-rc3 verfügbar ist, aber die vollständigen Quellen für diesen Kernel noch nicht veröffentlicht wurden. Stattdessen ist ein Patch-2.6.22-rc3.bz2 verfügbar. Sie können diesen Patch auf die 2.6.21-Kernelquellen anwenden, aber nicht auf Kernel 2.6.21.1 oder 2.6.21.2 usw. Dies wird auf http://kernel.org/patchtypes/pre.html erklärt:
Prepatches sind das Äquivalent zu Alpha-Versionen für Linux; sie leben in den Testverzeichnissen in den Archiven. Sie sollten mit dem Dienstprogramm patch(1) auf den Quellcode der vorherigen Vollversion mit einer dreiteiligen Versionsnummer angewendet werden (zum Beispiel sollte der 2.6.12-rc4-Prepatch auf die 2.6.11-Kernelquellen angewendet werden, nicht , zum Beispiel 2.6.11.10.)
Wenn Sie also einen 2.6.22-rc3-Kernel kompilieren möchten, müssen Sie die 2.6.21-Kernelquellen herunterladen (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21. tar.bz2) in Schritt 3 statt Kernel 2.6.21.3!
So wenden Sie den 2.6.22-rc3-Patch auf Kernel 2.6.21 an:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1
2.4 Den Kernel konfigurieren
Es ist eine gute Idee, die Konfiguration Ihres aktuell funktionierenden Kernels als Grundlage für Ihren neuen Kernel zu verwenden. Dazu kopieren wir die bestehende Konfiguration nach /usr/src/linux:
make clean && make mrproper
cp /boot/config-`uname -r` ./.config
Dann laufen wir
make menuconfig
wodurch das Kernel-Konfigurationsmenü aufgerufen wird. Gehen Sie zu Load an Alternate Configuration File und wählen Sie .config (das die Konfiguration Ihres aktuell funktionierenden Kernels enthält) als Konfigurationsdatei:
Blättern Sie dann durch das Kernel-Konfigurationsmenü und treffen Sie Ihre Auswahl. Wenn Sie fertig sind und Beenden wählen, beantworten Sie die folgende Frage (Möchten Sie Ihre neue Kernelkonfiguration speichern?) mit Ja:
2.5 Erstellen Sie den Kernel
Um den Kernel zu bauen, führen Sie diese beiden Befehle aus:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
Nach --append-to-version=können Sie einen beliebigen String schreiben, der Ihnen hilft, den Kernel zu identifizieren, aber er muss mit einem Minuszeichen (-) beginnen und darf keine Leerzeichen enthalten.
Seien Sie nun geduldig, die Kernel-Kompilierung kann einige Stunden dauern, abhängig von Ihrer Kernel-Konfiguration und Ihrer Prozessorgeschwindigkeit.
2.6 Installieren Sie den neuen Kernel
Nach dem erfolgreichen Kernel-Build finden Sie zwei .deb-Pakete im /usr/src-Verzeichnis.
cd /usr/src
ls -l
Auf meinem Testsystem hießen sie linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (das den eigentlichen Kernel enthält) und linux-headers-2.6.21.3-custom_2.6.21.3- custom-10.00.Custom_i386.deb (enthält Dateien, die benötigt werden, wenn Sie später zusätzliche Kernel-Module kompilieren möchten). Ich installiere sie wie folgt:
dpkg -i linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb
(Sie können die beiden .deb-Dateien jetzt sogar auf andere Debian-Etch-Systeme übertragen und dort genauso installieren, was bedeutet, dass Sie den Kernel dort nicht erneut kompilieren müssen.)
Das ist es. Die GRUB-Bootloader-Konfigurationsdatei /boot/grub/menu.lst wurde automatisch modifiziert, und eine Ramdisk für den neuen Kernel wurde in /boot erstellt.
Starten Sie nun das System neu:
shutdown -r now
Wählen Sie am Boot-Prompt Ihren neuen Kernel aus (sollte standardmäßig ausgewählt sein):
Wenn alles gut geht, sollte es mit dem neuen Kernel kommen. Sie können überprüfen, ob es wirklich Ihren neuen Kernel verwendet, indem Sie
ausführenuname -r
Dies sollte so etwas wie
anzeigen2.6.21.3-custom
Wenn das System nicht startet, starten Sie es neu und wählen Sie am Boot-Prompt Ihren alten Kernel aus. Sie können jetzt erneut versuchen, einen funktionierenden Kernel zu kompilieren. Vergessen Sie nicht, die Zeilen des nicht funktionierenden Kernels aus /boot/grub/menu.lst zu entfernen.
3 Erstellung eines Kernels auf traditionelle Weise
Dieses Kapitel beschreibt einen anderen Ansatz, der auf jedem Linux-System verwendet werden kann (abgesehen von Details wie dem Erstellen einer Ramdisk oder dem Aktualisieren des Bootloaders). Natürlich werden Sie am Ende kein Kernel-.deb-Paket haben.
3.1 Erforderliche Pakete für die Kernel-Kompilierung installieren
Zuerst aktualisieren wir unsere Paketdatenbank:
apt-get update
Dann installieren wir alle benötigten Pakete wie folgt:
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential
3.2 Laden Sie die Kernelquellen herunter
Als nächstes laden wir unseren gewünschten Kernel nach /usr/src herunter. Gehen Sie zu www.kernel.org und wählen Sie den Kernel aus, den Sie installieren möchten, z. linux-2.6.21.3.tar.bz2 (Sie finden alle 2.6-Kernel hier:http://www.kernel.org/pub/linux/kernel/v2.6/). Dann können Sie es wie folgt nach /usr/src herunterladen:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2
Dann entpacken wir die Kernelquellen und erstellen einen Symlink Linux zum Kernelquellenverzeichnis:
tar xjf linux-2.6.21.3.tar.bz2
ln -s linux-2.6.21.3 linux
cd /usr/src/linux
3.3 Anwenden von Patches auf die Kernelquellen (optional)
Manchmal benötigen Sie Treiber für Hardware, die standardmäßig nicht vom neuen Kernel unterstützt wird, oder Sie benötigen Unterstützung für Virtualisierungstechniken oder eine andere hochmoderne Technologie, die es noch nicht in den Kernel geschafft hat. In all diesen Fällen müssen Sie die Kernel-Quellen patchen (sofern ein Patch verfügbar ist...).
Nehmen wir nun an, Sie haben den benötigten Patch (ich nenne ihn in diesem Beispiel patch.bz2) nach /usr/src heruntergeladen. So wenden Sie es auf Ihre Kernel-Quellen an (Sie müssen sich immer noch im /usr/src/linux-Verzeichnis befinden):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Der erste Befehl ist nur ein Test, er ändert nichts an Ihren Quellen. Wenn keine Fehler angezeigt werden, können Sie den zweiten Befehl ausführen, der den Patch tatsächlich anwendet. Tun Sie es nicht, wenn der erste Befehl Fehler anzeigt!
Sie können auch Kernel-Prepatches auf Ihre Kernel-Quellen anwenden. Wenn Sie beispielsweise eine Funktion benötigen, die nur in Kernel 2.6.22-rc3 verfügbar ist, aber die vollständigen Quellen für diesen Kernel noch nicht veröffentlicht wurden. Stattdessen ist ein Patch-2.6.22-rc3.bz2 verfügbar. Sie können diesen Patch auf die 2.6.21-Kernelquellen anwenden, aber nicht auf Kernel 2.6.21.1 oder 2.6.21.2 usw. Dies wird auf http://kernel.org/patchtypes/pre.html erklärt:
Prepatches sind das Äquivalent zu Alpha-Releases für Linux; sie leben in den Testverzeichnissen in den Archiven. Sie sollten mit dem Dienstprogramm patch(1) auf den Quellcode der vorherigen Vollversion mit einer dreiteiligen Versionsnummer angewendet werden (zum Beispiel sollte der 2.6.12-rc4-Prepatch auf die 2.6.11-Kernelquellen angewendet werden, nicht , zum Beispiel 2.6.11.10.)
Wenn Sie also einen 2.6.22-rc3-Kernel kompilieren möchten, müssen Sie die 2.6.21-Kernelquellen herunterladen (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21. tar.bz2) in Schritt 3 statt Kernel 2.6.21.3!
So wenden Sie den 2.6.22-rc3-Patch auf Kernel 2.6.21 an:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1
3.4 Den Kernel konfigurieren
Es ist eine gute Idee, die Konfiguration Ihres aktuell funktionierenden Kernels als Grundlage für Ihren neuen Kernel zu verwenden. Dazu kopieren wir die bestehende Konfiguration nach /usr/src/linux:
make clean && make mrproper
cp /boot/config-`uname -r` ./.config
Dann laufen wir
make menuconfig
wodurch das Kernel-Konfigurationsmenü aufgerufen wird. Gehen Sie zu Load an Alternate Configuration File und wählen Sie .config (das die Konfiguration Ihres aktuell funktionierenden Kernels enthält) als Konfigurationsdatei:
Blättern Sie dann durch das Kernel-Konfigurationsmenü und treffen Sie Ihre Auswahl. Wenn Sie fertig sind und Beenden wählen, beantworten Sie die folgende Frage (Möchten Sie Ihre neue Kernelkonfiguration speichern?) mit Ja:
3.5 Den Kernel erstellen und installieren
Um den Kernel zu bauen, führen Sie diese Befehle aus:
make all
make modules_install
make install
Seien Sie nun geduldig, die Kernel-Kompilierung kann einige Stunden dauern, abhängig von Ihrer Kernel-Konfiguration und Ihrer Prozessorgeschwindigkeit.
3.6 Schritte nach der Installation
Der neue Kernel ist jetzt installiert, aber wir brauchen noch eine Ramdisk für unseren neuen Kernel (sonst bootet das System höchstwahrscheinlich nicht!) und wir müssen dem GRUB-Bootloader unseren neuen Kernel mitteilen.
Zuerst machen wir das:
depmod 2.6.21.3
apt-get install yaird
Dann erstellen wir eine Ramdisk mit folgendem Befehl:
mkinitrd.yaird -o /boot/initrd.img-2.6.21.3 2.6.21.3
Die GRUB-Konfiguration ist auf Debian Etch sehr einfach. Alles, was wir tun müssen, ist laufen
update-grub
Dies erkennt den neuen Kernel und die Ramdisk und aktualisiert /boot/grub/menu.lst für uns.
Starten Sie nun das System neu:
shutdown -r now
Wählen Sie am Boot-Prompt Ihren neuen Kernel aus (sollte standardmäßig ausgewählt sein). Wenn alles gut geht, sollte es mit dem neuen Kernel kommen. Sie können überprüfen, ob es wirklich Ihren neuen Kernel verwendet, indem Sie
ausführenuname -r
Dies sollte so etwas wie
anzeigen2.6.21.3
Wenn das System nicht startet, starten Sie es neu und wählen Sie Ihren alten Kernel am Boot-Prompt aus. Sie können jetzt erneut versuchen, einen funktionierenden Kernel zu kompilieren. Vergessen Sie nicht, die Zeilen des nicht funktionierenden Kernels aus /boot/grub/menu.lst zu entfernen.
4 Links
- Debian:http://www.debian.org
- Das Linux-Kernel-Archiv:http://www.kernel.org