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.
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:
Dann brauchen wir die Kernelsourcen von The Linux Kernel Archives:
(derzeit aktueller Kernel ist 2.6.18)
Ggf. Den zum Kernel passenden CK-Patch herrunter laden von The Linux Kernel Archives:
(derzeit aktueller Kernel CK-Patch ist 2.6.18)
Den Source Kernel entpacken:
Den Source Kernel umbenennen:
In das Verzeichnis des Source Kenels wechseln:
Den Source Kernel CK-Patch entpacken:
Zurück in das Verzeichnis mit den Quellen wechseln:
Auf neuen Linux-Kernel zeigen:
Kontrolle ob die Verlingung existiert:
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:
Alte Kernelconfig zumm Source Kernel kopieren:
In das Verzeichnis des Source Kenels wechseln:
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.
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:
Alte Objektdateien löschen:
Kernel kompilieren:
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:
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:
Alten Kernel umbennen:
Den neuen Kernel nach /boot/ kopieren:
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:
Neuen Link zum neuen Kernel setzen:
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
eingeben, womit die aktualisierte lilo.conf in den MBR eingetragen wird.
Einfacher geht´s mit dem Kommando
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:
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):
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:
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
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.
- Lilo durch Grub ersetzen
- Kernel vorbereiten
- Kernel Konfigurieren
- Kernel Kompilieren
- Kernel Installation
- Lilo anpassen
- Grub anpassen
- 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