Wie man einen Kernel kompiliert - auf CentOS - Seite 2

3 Wie man einen Kernel auf traditionelle Art und Weise baut

Dieses Kapitel beschreibt einen anderen Ansatz, der auf jedem Linux System angewandt werden kann. Da daran nichts CentOS-spezifisch ist, erhältst Du am Ende natürlich auch kein Kernel rpm Paket.

3.1 Die Kernelquellen runter laden

Wir laden unseren gewünschten Kernel nach /usr/src. Gehe zu www.kernel.org und wähle den Kernel aus, den Du installieren möchtest, z.B. linux-2.6.18.3.tar.bz2 (hier findest Du alle 2.6 Kernel: http://www.kernel.org/pub/linux/kernel/v2.6/). Dann kannst Du ihn wie folgt nach /usr/src runter laden:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.3.tar.bz2

Dann entpacken wir die Kernelquellen und erstellen einen Symlink linux zum Kernelquellen Verzeichnis:

tar xjf linux-2.6.18.3.tar.bz2
ln -s linux-2.6.18.3 linux
cd /usr/src/linux

3.2 /etc/modprobe.conf modifizieren

Nun müssen wir das mptscsi Modul in /etc/modprobe.conf auskommentieren, da wir sonst eine Warnung wie diese erhalten:

WARNING: No module mptscsi found for kernel 2.6.18.3, continuing anyway

wenn wir unseren neuen Kernel bauen.

vi /etc/modprobe.conf


alias eth0 pcnet32
alias scsi_hostadapter mptbase # alias scsi_hostadapter1 mptscsi alias scsi_hostadapter2 mptfc alias scsi_hostadapter3 mptspi alias scsi_hostadapter4 mptsas alias scsi_hostadapter5 mptscsih

3.3 Anbringen von Patches in den Kernelquellen (optional)

Manchmal benötigst Du Treiber für Hardware, die von dem neuen Kernel nicht standardmäßig unterstützt wird, oder Du benötigst Unterstützung für Virtualisierungstechniken oder eine andere brandneuen Technologie, die beim Kernel noch nicht angekommen ist. In all diesen Fällen musst Du die Kernelquellen patchen (vorausgesetzt es ist ein Patch verfügbar...).

Gehen wir nun davon aus, dass Du den benötigten Patch (ich nenne ihn in diesem Beispiel patch.bz2 ) nach /usr/src geladen hast. So bringst Du ihn in Deinem Kernelquellen an (immer noch im /usr/src/linux Verzeichnis):

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 und ändert nichts an Deinen Quellen. Wenn er keine Fehler anzeigt, kannst Du den zweiten Befehl ausführen, der den Patch tatsächlich anbringt. Tu das nicht, wenn der erste Befehl Fehler angezeigt hat!

Wenn Deine Patches mit gzip (.gz) anstelle von bzip2 (.bz2) komprimiert sind, dann patchst Du Deinen Kernel wie folgt:

gunzip -c /usr/src/patch.gz | patch -p1 --dry-run
gunzip -c /usr/src/patch.gz | patch -p1

Du kannst auch Kernel Prepatches in Deinen Kernelquellen anbringen. Wenn Du zum Beispiel eine Funktion brauchst, die nur in Kernel 2.6.19-rc6 verfügbar ist, die gesamten Quellen für diesen Kernel aber noch nicht veröffentlicht wurden. Stattdessen ist ein patch-2.6.19-rc6.bz2 verfügbar. Du kannst diesen Patch in den 2.6.18 Kernelquellen anbringen, aber nicht in Kernel 2.6.18.1 oder 2.6.18.2 oder 2.6.28.3 etc. Dies wird auf http://kernel.org/patchtypes/pre.html erklärt:

"Prepatches are the equivalent to alpha releases for Linux; they live in the testing directories in the archives. They should be applied using the patch(1) utility to the source code of the previous full release with a 3-part version number (for example, the 2.6.12-rc4 prepatch should be applied to the 2.6.11 kernel sources, not, for example, 2.6.11.10.)"
Wenn Du also einen 2.6.19-rc6 Kernel kompilieren möchtest, musst Du die 2.6.18 Kernelquellen (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) in Schritt 3.1 anstelles des Kernels 2.6.18.3 runter laden!

So bringst Du den 2.6.19-rc6 Patch in Kernel 2.6.18 an:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1

3.4 Den Kernel konfigurieren

Es ist eine gute Idee, die Kofiguration Deines derzeit funktionstüchtigen Kernels als Basis für Deinen neuen Kernel zu verwenden. Daher kopieren wir die vorhandene Konfiguration nach /usr/src/linux:

make clean && make mrproper
cp /boot/config-`uname -r` ./.config

Dann führen wir dies aus

make menuconfig

was das Kernelkonfigurationsmenü aufruft. Gehe zu Load an Alternate Configuration File und wähle .config (was die Konfiguration des derzeit funktionstüchtigen Kernels enthält) als die Konfigurationsdatei aus:



Durchblättere dann das Kernelkonfigurationsmenü und treffe Deine Auswahl. Wenn Du damit fertig bist und Exit wählst, beantworte folgende Frage (Do you wish to save your new kernel configuration?) mit Yes:

3.5 Den Kernel bauen und installieren

Um den Kernel zu bauen und zu installieren, führe diese drei Befehle aus:

make all
make modules_install
make install

Nun musst Du Geduld haben, da die Kompilierung des Kernels einige Stunden dauern kann, je nach Kernel Konfiguration und Deiner Prozessorgeschwindigkeit. Der letzte Befehl ersellt außerdem automatisch eine Ramdisk und konfiguriert /boot/grub/menu.lst für Dich.

Bearbeite nun /boot/grub/menu.lst. Du solltest am Anfang der Liste eine Zeile für Deinen neuen Kernel finden, aber um sicherzustellen, dass der neue Kernel und nicht der alte gestartet wird, musst Du den Wert von default auf 0 setzen.

vi /boot/grub/menu.lst

Meine menu.lst sieht so aus:
# grub.conf generated by anaconda
# # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18.3) root (hd0,0) kernel /vmlinuz-2.6.18.3 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18.3.img title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img
Starte nun das System neu:

shutdown -r now

Wenn alles klappt, sollte der neue Kernel gestartet werden. Ob wirklich der neue Kernel verwendet wird, kannst Du überprüfen, indem Du dies ausführst

uname -r

Dies sollte etwas in der Art anzeigen

2.6.18.3

Wenn das System nicht startet, starte es neu und wenn Du dies siehst:


drücke irgendeine Taste um zum GRUB Menü zu gelangen:


Wähle Deinen alten Kernel aus und starte das System. Du kannst nun noch einmal versuchen einen funktionstüchtigen Kernel zu kompilieren. Vergiss nicht, die Zeile des defekten Kernels aus /boot/grub/menu.lst zu entfernen.

4 Links

0 Kommentar(e)

Zum Posten von Kommentaren bitte