[HowTo] Linux-Kernel backen - Stand: Sammstag, 11. Oktober 2006

X-tra-X

New Member
Hallo,

Dies is meine kleine Anleitung zum kompilieren eines Linux Kernels.

Ich habe mich duch mehrere andere [HowTo] gelesen um herrauszubekommen wie man ein Linux Kernel funktionsfähig kompilieren kann. Musste leider festellen, dass es solche [HowTo] wie Sand am Meer gibt und dass leider nicht alle funktionieren. Daher habe ich mir einige zur Brust genommen und so lange ausprobiert bis ich mir selber eines zusammen gestellt habe was bei mir funktioniert hat.

Ich habe dieses [HowTo] auf mehreren Rootservern von Server4you.de und Strato erfolgreich getestet.


  1. Lilo durch Grub ersetzen
  2. Kernel vorbereiten
  3. Kernel Konfigurieren
  4. Kernel Kompilieren
  5. Kernel Installation
  6. Lilo anpassen
  7. Grub anpassen
  8. Initrd erstellen

Lilo durch Grub ersetzen

1.) Empfehlenswert, um einen Rechner seinen Aufgaben entsprechend zu optimieren (vorhandene Hardware, Kernel so schmal, dass der Rechner nicht vom Kernel gebremst wird usw.)

2.) Übersetzung eines Kernels geht über einen C-Compiler

3.) Der Kernel liegt unter dem Verzeichnis /boot und heißt vmlinuz

4.) Der Name und die Lage des Kernels sind wiederum prinzipiell beliebig da in der Konfigurationsdatei des Bootloaders (z.B. /etc/lilo.conf) entsprechende Eintragungen gemacht werden können.


Zum Erstellen des Kernels sind folgende Schritte noetig

Kernel vorbereiten

In das Verzeichnis mit den Quellen wechseln:
Code:
cd /usr/src/

Dann brauchen wir die Kernelsourcen von The Linux Kernel Archives:
(derzeit aktueller Kernel ist 2.6.18)
Code:
wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.6.18.1.tar.bz2

Ggf. Den zum Kernel passenden CK-Patch herrunter laden von The Linux Kernel Archives:
(derzeit aktueller Kernel CK-Patch ist 2.6.18)
Code:
wget http://www.kernel.org/pub/linux/kernel/people/ck/patches/cks/patch-2.6.18-cks1.bz2

Den Source Kernel entpacken:
Code:
tar xfvj linux-2.6.18.tar.bz2

Den Source Kernel umbenennen:
Code:
mv linux-2.6.18 linux-2.6.18-cks1

In das Verzeichnis des Source Kenels wechseln:
Code:
cd linux-2.6.18-cks1

Den Source Kernel CK-Patch entpacken:
Code:
bzcat /usr/src/patch-2.6.18-cks1.bz2 | patch -p1

Zurück in das Verzeichnis mit den Quellen wechseln:
Code:
cd /usr/src/

Auf neuen Linux-Kernel zeigen:
Code:
ln -s /usr/src/linux-2.6.18-cks1/ /usr/src/linux

Kontrolle ob die Verlingung existiert:
Code:
ls -n /usr/src/


Kernel Konfigurieren

So nun übernehmen wir die alte Kernelcfg. Durch den Befehl "ls /boot"
siehst du die cfg oder cfgs der vorherigen Kernel. Die musst du natürlich
bei "cp /boot/config-2.6.15" auf deine vorherige cfg abändern.


Bootverzeichnis auflisten:
Code:
ls /boot/

Alte Kernelconfig zumm Source Kernel kopieren:
Code:
cp /boot/config-2.6.15 linux/.config

In das Verzeichnis des Source Kenels wechseln:
Code:
cd linux

Der Kernel kann mit einem der Folgenden Befehlen konfiguriert werden:
make config (Terminal)
make menuconfig (Terminal mit grafischer Unterstützung)
make xconfig (grafische Oberfläche)
make gconfig (GTK+ basierte graphische Konfiguratio)
make oldconfig (alte .config bearbeiten)


Bei make xconfig kann man über das Feld "Language Support" eine andere Sprache
auswählen; dann müsste man erst einmal über Save & Exit gehen und make
xconfig erneut öffnen - mangels Erfahrung mit den grafischen Oberflächen unter
Linux beschränke ich mich auf make menuconfig.
Code:
make menuconfig

Bei make config geht man die Optionen der Reihe nach durch; festlegen tut man
sich mit n = no, y = yes; m = modular, also nach Bedarf laden. Über ? erreicht
man einen Hilfetext zu den einzelnen Optionen. Gelegentlich sind auch
Werteangaben möglich oder nötig ([iso8859-15], z.B.). Die default-Einstellungen erreicht man durch Betätigen der <Enter>-Taste. Unter make menuconfig wählt man mit Y, N oder <Space>-Taste (modular) aus.


Kernel Kompilieren

Abhängigkeit der Quell- und Include-Dateien herstellen:
Code:
make dep

Alte Objektdateien löschen:
Code:
make clean

Kernel kompilieren:
Code:
make && make modules_install


Wie auch immer, auf jeden Fall fängt nun der Computer an zu rattern,
dass man meint er fällt auseinander oder will gleich abheben.
Heutzutage dauert das meist ca. 2-10 Minuten. In den
"Guten Alten Tagen" dauerte es einiges länger:

  • 80386 ca. 18-26h
  • 80486DX66 ca. 1 h
  • 80486DX100 ca. 30 min
  • Pentium133 ca. 15 min
  • AMD K6-2 300 ca. 4 min
  • Dual Pentium II 400 ca. 2 min
  • DEC ALPHA 21264-500 ca. 1 min (mit RAID5)


Kernel Installation

Der neue Kernel liegt jetzt unter
<Aktuelles Verzeichnis>/arch/i386/boot/
und heisst bzImage.

Die verschiedenen Bootkonfigurationen liegen unter /boot.
Dorthin begeben wir uns jetzt, um den bisherigen Kernel
(vmlinuz unter /boot) gegen den neuen umzutauschen.
Zuerst benennt man den alten Kernel in etwas beliebiges um,
hier z.B. von vmlinuz in vmlinuz-alt:


In das Boot-Verzeichnis wechseln:
Code:
cd /boot/

Alten Kernel umbennen:
Code:
mv /boot/vmlinuz /boot/vmlinuz-old

Den neuen Kernel nach /boot/ kopieren:
Code:
mv /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.18-cks1


Lilo anpassen

Die lilo.conf verweist in der Regel noch auf einen Softlink auf der /-Ebene:
image = /vmlinuz

Verfährt man wie oben beschrieben (umbenennen des Kernelimages von vmlinuz auf vmlinuz-2.6.18-cks1), muss man den bisherigen Link löschen und einen neuen anlegen:

lösches des alten Kernels-links:
Code:
rm /vmlinuz

Neuen Link zum neuen Kernel setzen:
Code:
ln -s /boot/vmlinuz-2.6.18-cks1 vmlinuz


Der Eintrag in der lilo.conf muss entsprechend nur angepasst werden,
wenn der neue Kernel einen anderen Namen als der alte hat.
Wenn´s jetzt Stress gäbe mit dem neuen Kernel,
könnten wir durch einen entsprechenden Verweis in /etc/lilo.conf einen
Verweis auf den alten Kernel machen:


Verweis auf alten-Kernel:
image = /boot/vmlinuz.old

Labelname:
label = LinuxAlterKernel

root = (alles wie der andere Eintrag; also z.B. /dev/hda3)

Danach nochmal das Wörtchen
Code:
lilo

eingeben, womit die aktualisierte lilo.conf in den MBR eingetragen wird.
Einfacher geht´s mit dem Kommando
Code:
make bzlilo

Hier gibt es aber das Problem, dass der alte Kernel durch den neuen
überschrieben wird. Die oben beschriebene Methode sollte sicherer sein.



Grub anpassen

Die meisten mir bekannten Systeme kommen heute mit grub als Bootloader.
Welche Kernelversion gebootet wird, entscheidet man in der Datei menu.lst,
die sich unter /boot/grub/ befindet:


Code:
title [I]Destrubtion[/I] GNU/Linux, kernel 2.6.18
root (hd0,0)
kernel /boot/neuer-kernel root=/dev/hda1 ro
initrd /boot/initrd-img-2.6.18
savedefault
boot

Vom ersten eingetragenen Kernel wird gebootet. Durch Eintragen mehrerer
Kernel kann man eine Auswahlliste beim Booten nutzen. In der Regel wird
noch ein recovery mode eingetragen, bei dem die die /-Partition read-only
eingebunden wird (ro single):

Code:
title [I]Destrubtion[/I] GNU/Linux, kernel 2.6.15 (recovery mode)
root (hd0,0)
kernel /boot/vmlinuz-2.6.15 root=/dev/hda1 ro single
initrd /boot/initrd-img-2.6.15
savedefault
boot


Initrd erstellen

Enthält der neue Kernel erst die Module zum Laden des Festplattentreibers
oder sonstiger Hardware, muss eventuell noch ein bootfähiges Image des
Kernels erstellt werden. Das System bootet dann von diesem Kernelimage

mkinitrd für boot-image:
Code:
cd /boot/
mkinitrd -o /boot/initrd-2.6.18-cks1

Anschliessend wird der entsprechende Eintrag der grub-Liste hinzugefügt
(s. oben bei Grub)


Wünsch euch viel Spass damit und würde mich über Kritik, erfolgs/niederlags Berichte freuen, bei ergenzungen oder Verbesserungen Vorschläge editiere ich sie gerne hinein

Mit freundlichen Grüßen,
X-tra-X
 
Hallo,

Musste leider festellen, dass es solche [HowTo] wie Sand am Meer gibt und dass leider nicht alle funktionieren. (...) was bei mir funktioniert hat.
Leider wird Dein schönes HowTo das gleiche Schicksal ereilen: es wird nicht bei allen (genau so) funktionieren. ;)
linux-2.6.18.1.tar.bz2
Der ist zwei Wochen alt, Du kannst schon mal prophylaktisch 2.6.18.2 schreiben. :D (noch ist er nicht da)
Abhängigkeit der Quell- und Include-Dateien herstellen:
make dep
Bei 2.6 nicht mehr erforderlich (wenn man's trotzdem eingibt kommt ein entsprechender Hinweis).
Pentium133 ca. 15 min
AMD K6-2 300 ca. 4 min
Wo hast Du die Werte her?
Bei mir daurt die Compilierung (make und make modules zusammen)
Celeron 2400 ca. 14 min
Athlon 2400 ca. 10 min

Gilt natürlich nur für meine Kernelkonfiguration (und meine Hardware), aber die Unterschiede sind trotzdem extrem.
 
Abhängigkeit der Quell- und Include-Dateien herstellen:
Code:
make dep

Ist beim Kernel der 2.6er-Serie überflüssig ;) Den Schritt kannst du also rausnehmen.

Code:
 make dep
*** Warning: make dep is unnecessary now.

Grüße

Mike
 
Code:
h765712:/usr/src/linux# mkinitrd -o /boot/initrd2.6.19-cks2
/usr/sbin/mkinitrd: /lib/modules/2.6.10: Not a directory
/usr/sbin/mkinitrd: MODULES needs to be set to none?
h765712:/usr/src/linux#

Da ist leider ein fehler keine ahnung was das ist aber wie soll man das lösen ?
 
Hallo
Root mit Os Debian 4.0
Ich habe das problem das ich kein Lilo mitgeliefert bekommen habe
Alles was ich habe in boot:
bzImage-2.6.22.1-amd-smp-14022007-1
und in /boot/grub
menu.Ist

Ich habe versucht den Kernel zu patchen aber es hat nicht funktioniert.
Wenn ich nach kompilierung zum installieren anfange fragt es mich nach
"bootloader"oder es wird nicht funktionieren.
Was kann ich tuhen in diesem fall?

Gruß
TNT
 
Last edited by a moderator:
Back
Top