Freekazonid
30.10.04, 14:35
Dieses Howto beschreibt, wie man einen 2.6.x Kernel aus den Sourcen baut, sprich wie man sich seinen eigenen Kernel configurieren und kompilieren kann.
Wozu wenn es bereits fertige Kernels gibt?
Der Kernel laesst sich an eigene Beduerfnisse anpassen
... dadurch kleinerer & ueberschaubarer Kernel
viele Anwendungen oder sonstige Sachen verlangen einen laufenden Kernel der aus installierten Sourcen gebaut wurde
Es laesst sich nachtraeglich immer sehr einfach neue Sachen in den Kernel einbauen & wieder entfernen
Vor den Befehlen steht ein $ falls der folgende Befehl als user ausgefuehrt werden soll, ein # zeigt an das es als root ausgefuehrt werden muss
Content
0.0 Hinweis fuer 2.4 -> 2.6
1.0 Kernel Sourcen
1.1 Installation von kernel.org
1.2 Installation vom Distri spezifischen Packagemanager
1.2.1 SuSE
1.2.2 Fedora Core 2
1.2.3 Debian
1.2.4 Gentoo
2.0 Konfigurieren des Kernels
2.1 Was zu beachten gilt
3.0 Bauen des Kernels
3.1 Backen des neuen Kernels
3.2 Files Kopieren
4.0 Bootmanager anpassen
4.1 GRUB
4.2 LILO
5.0 Neuen Kernel booten
6.0 Abschliessende Worte & Hinweise
7.0 Troubleshooting
8.0 Ergänzungen, Kritik, Hinweise
0.0 Hinweis fuer 2.4 -> 2.6
!GILT NUR FUER LEUTE DIE VON 2.4.x AUF 2.6.x UMSTEIGEN WOLLEN!
!SONST BITTE BEI 1.0 ANFANGEN!
Wenn ihr momentan einen 2.4.x Kernel am laufen habt, und einen 2.6.x auf diesem System einrichten wollt, gibt es eine Besonderheit zu beachten.
Seit 2.6.x werden die Module anders gehandhabt, weshalb eine neuere Version der module-init-tools vonnoeten ist.
HINWEIS
Ihr koennt die module-init-tools auch ueber den Packetmanager eurer Distri installieren, was den Vorteil hat das evtl benoetigte updates automatisch mitinstalliert werden. Wenn ihr also die module-init-tools erfolgreich ueber euren Packetmanager installiert habt, koennt ihr diesen Chapter ueberspringen und bei 1.0 fortfahren
Diese sind hier zu beziehen
http://www.kernel.org/pub/linux/kernel/people/rusty/modules/
und werden wie alle sonstigen Programme, die als Sourcen geliefert werden, installiert.
Entpacken der module-init-tools bei *tar.gz
tar xvzf module-init-tools-3.0.tar.gz #name der file anpassen
Entpacken der module-init-tools bei *tar.bz2
tar xvjf module-init-tools-3.0.tar.bz2 #name der file anpasse
Vorher sollten die alten module-init-tools gesichert werden.
# mv /sbin/modprobe /sbin/modprobe.old
# mv /sbin/insmod /sbin/insmod.old
# mv /sbin/lsmod /sbin/lsmod.old
# mv /sbin/depmod /sbin/depmod.old
# mv /sbin/modinfo /sbin/modinfo.old
# mv /sbin/insmod.static /sbin/insmod.static.old
Anschliessen in das Verzeichnis wechseln, das eben nach dem entpacken der neuen module-init-tools entstanden ist, und die module-init-tools kompilieren&installieren.
$ ./configure
$ make
# make install
damit ist das Sytem bereit fuer 2.6.x
1.0 Kernel Sourcen
Damit wir einen neuen Kernel aus den Sourcen installieren koennen, muessen eben diese auf dem System installiert sein. Die Kernelsourcen kommen nach /usr/src. Dabei wird einmal ein Ordner linux-<versionsnummer> erstellt, sowie ein Symbolischer Link linux, der auf den vorigen erwaehnten Ordner zeigt. Dieser muss evtl. manuell angelegt werden.
Zuerst muessen die Kernelsourcen bezogen werden, was auf verschiedene Art&Weisen passieren kann.
1.1 Installation von kernel.org
Auf www.kernel.org werden aktuelle sowie aeltere Kernel Sourcen gehosted. Ganz oben befindet sich der aktuell verfuegbarste Kernel, den man als Full saugen kann.
Waehlt den Kernel aus, den ihr moechtet, und ladet euch die VOLLEN! Sourcen runter.
Wenn ihr den momentan aktuellen 2.6.9 haben wollt, waere das z.B.
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.9.tar.bz2
Nachdem der fertig runtergeladen wurde, wechselt ihr in das Verzeichnis wo ihr ihn hingespeichert habt. Anschliessend wird er passend kopiert & entpackt
# cp linux-2.6.9.tar.bz2 /usr/src # linux-2.6.9.tar.bz2 evtl anpassen
# cd /usr/src
# tar xvjf linux-2.6.9.tar.bz2 # linux-2.6.9.tar.bz2 evtl anpassen
# ln -s linux-2.6.9 linux # linux-2.6.9 evtl anpassen
Damit sind die Sourcen auf eurem System installiert und ihr koennt mit 2.0 fortfahren
1.2 Installation vom Distri spezifischen Packagemanager
Die meisten Distributionen stellen einen Packetmanager zur verfuegung, mit dem man nun auch die gewuenschten Kernelsourcen installieren kann. Ich gehe hier kurz auf verschiedene Distris ein
1.2.1 SuSE
Hier koennen die Sourcen ueber YaST installiert werden. Einfach bei Software hinzufuegen/entfernen die passenden Kernel sourcen installieren, oder als Suchbegriff 'Kernel', 'Sourcen' oder 'Quellen' benutzen. Der Rest sollte bei YaST selbsterklaerend sein.
Anschliessend sollte geguckt werden ob die Sourcen existieren und ein Link besteht
# ls -lh /usr/src
ist dort nun ein Verzeichnis linux-<versionsnummer> und ein link namens linux, der auf linux-<versionsnummer> zeigt, ist alles in Ordnung und ihr koennt bei 2.0 fortfahren. Ansonsten legen wir den Link jetzt an
# cd /usr/src
# ln -s linux-2.6.9 linux # linux-2.6.9 bitte anpassen
1.2.2 Fedora Core 2
Hier koennen die Sourcen ueber yum eingespielt werden. Unter
# yum list
werden u.a. die verfuegbaren Kernersourcen aufgelistet, die ihr mittels
# yum install <name>
Einspielen koennt.
Anschliessend sollte geguckt werden ob die Sourcen existieren und ein Link besteht
# ls -lh /usr/src
ist dort nun ein Verzeichnis linux-<versionsnummer> und ein link namens linux, der auf linux-<versionsnummer> zeigt, ist alles in Ordnung und ihr koennt bei 2.0 fortfahren. Ansonsten legen wir den Link jetzt an
# cd /usr/src
# ln -s linux-2.6.9 linux # linux-2.6.9 bitte anpassen
1.2.3 Debian
Hier koennen die Sourcen mit apt-get installiert werden. Gesucht kann das passende Packet mittels
# apt-get search <name>
gesucht kann zB nach sources, wo man sich passende Kernelsourcen raussucht. Installiert werden sie mit
# apt-get install <packet-name>
Anschliessend sollte geguckt werden ob die Sourcen existieren und ein Link besteht
# ls -lh /usr/src
ist dort nun ein Verzeichnis linux-<versionsnummer> und ein link namens linux, der auf linux-<versionsnummer> zeigt, ist alles in Ordnung und ihr koennt bei 2.0 fortfahren. Ansonsten legen wir den Link jetzt an
# cd /usr/src
# ln -s linux-2.6.9 linux # linux-2.6.9 bitte anpassen
1.2.4 Gentoo
Hier werden die Sourcen bequem per emerge eingespielt. Mit
# emerge -s sources # nicht alles aufgelistete sind kernelsources!
werden die verfuegbaren Kernel aufgelistet. Auf
http://www.gentoo.org/doc/de/gentoo-kernel.xml
gibt es weitere Informationen ueber die verschiedenen Kernelsourcen, die verfuegbar sind. Die gewuenschten Kernelsourcen werden mit
# emerge die_kernelsourcen_die_du_wilst
installiert, das kann zB so aussehen
# emerge gentoo-sources
Anschliessend sollte geguckt werden ob die Sourcen existieren und ein Link besteht
# ls -lh /usr/src
ist dort nun ein Verzeichnis linux-<versionsnummer> und ein link namens linux, der auf linux-<versionsnummer> zeigt, ist alles in Ordnung und ihr koennt bei 2.0 fortfahren. Ansonsten legen wir den Link jetzt an
# cd /usr/src
# ln -s linux-2.6.9 linux # linux-2.6.9 bitte anpassen
2.0 Konfigurieren des Kernels
Nun kommt der wichtigste Part: Der Kernel wird mittels eines Frontends (wir verwenden menuconfig) konfiguriert, d.h. es wird bestimmt was in den Kernel fest reinkommt, was als Modul bereitgestellt werden soll und was nicht in den Kernel kommt. Diese Informationen wird von dem Frontend in die Datei .config abgelegt, die sich dann in /usr/src/linux befindet. D.h. wir editieren im Prinzip nur die .config, um beim spaeteren compilieren zu bestimmen, wie der Kernel aussehen soll.
Da das allerdings zu muesahm waere, diese Datei per Hand zu bauen, gibt es die bereits erwaehnten Frontends dafuer. Wir verwenden hier 'make menuconfig'.
Wir wechseln also in das Verzeichnis wo die nun neuen Kernelsourcen liegen
# cd /usr/src/linux
und geben dort
# make menuconfig
ein. Bei Bedarf sollte das Konsolen Fenster vorher etwas vergroessert werden.
Nun sollte ein grafisch angehauchtes Menu erscheinen. In diesem Menu wird nun alles eingestellt, d.h. ihr bestimmt was nun in den Kernel schlussendlich reinkommt. Dabei sollte sich bei jedem Eintrag die Frage gestellt werden
Brauche ich dieses Feature?
Muss es Fest in den Kernel oder reicht es als Modul?
Brauche ich es defenitiv nicht?
Brauche ich es vielleicht?
Werde ich es evtl irgendwann mal gebrauchen koennen?
Trifft der letzte Punkt z.B. zu, wuerde ich es nicht in den Kernel packen; es kann bei Bedarf immer noch als Modul reingebracht werden und das Modul gebildet werden (dazu spaeter mehr)
Trifft der vorletzte Punkt zu sollte es als Modul eingebaut werden, trifft der 3. Punkt von oben zu, sollte es garnicht eingebaut werden. Die ersten beiden Punkte sind selbsterklaerend.
Beim ersten Kernel bau sollte man sich wirklich Eintrag fuer Eintrag durcharbeiten und die genannten Punkte abchecken. Die groesste Hilfe ist hierbei der Shortcut 'Shift + ß', also als wuerdet ihr ein '?' eingeben. Dieser Shortcut, ausgeloest bei einem markierten Listeneintrag, zeigt ein neues Hilfefenster, das bereitgestellte Informationen ueber dieses Feature anzeigt. Hier sieht man sehr schnell, ob man dieses Feature braucht oder nicht, bzw lassen sich die Fragepunkte von oben damit leicht beantworten.
Geht also nun durch das gesamte Menu, fangt beim ersten an, und arbeitet euch von oben nach unten durch. Mit der Leertaste wird bei dem aktuelle Markierten Eintrag durch die verschiedenen verfuegbaren moeglichen Implemantionen geschaltet
[ ] - Kommt nicht in den Kernel
[M] - Kommt als Modul in den Kernel
[ * ] - Kommt fest in den Kernel
Einige Sachen lassen sich nicht als Modul einbauen, sondern nur fest oder garnicht.
Mit ESC kommt ihr aus Untermenues raus und geht zum uebergeordneteten Menue
Macht das wenn ihr etwas Zeit ueber habt, das sollte nicht hektisch geschehen. VORHER aber bitte folgende Hinweise lesen:
2.1 Was zu beachten gilt
Es gibt bestimme Sachen die ihr auf jeden Fall braucht. Unter File systems zB muesst ihr alle Filesystems fest in den Kernel bauen, die ihr auf jeden Fall braucht. Verwendet ihr zB ext2 auf /boot und auf / reiserfs muss ext2 und reiserfs support FEST im kernel sein. Mounted ihr aber zB auch mal NTFS oder FAT Windows Laufwerke, reicht es den Support dafuer als Modul in den Kernel zu machen
Achtet auf die Hardware! Hardware erkennung&Unterstuetzung geschieht nicht direkt durch eine Distri, sondern durch den Kernel. Seid sicher, das ihr den Support fuer auf jeden Fall&staendig verwendete Hardware FEST in den Kernel einbaut. Der Support fuer Prepherie und externen Stuff kann dabei aber als Modul eingebunden sein
Unter Code maturity level options sollten alle Eintraege markiert werden!
Unter Executable file formats sollten ebenfalls alle Eintraege als Fest in den Kernel gekennzeichnet sein
Bei vielen Help-sites steht am Ende "If unsure, say Y". Dem solltet ihr meistens Folge leisten
Wenn ihr fertig seid, ESC im Hauptmenu druecken, und yes waehlen, damit die Kernel konfiguration im .config gespeichert wird. Sichert euch am besten die File .config, z.B. so
# cp .config /root
damit liegt die .config nochmal im /root verzeichnis
3.0 Bauen des Kernels
Nun wird der neue Kernel gebaut.
3.1 Backen des neuen Kernels
Der neue Kernel kann nun gebaut werden. Wir befinden uns noch im /usr/src/linux Verzeichnis, wo folgende Commands die Backprozeduren ausfueren
make && make modules_install
nun etwas geduld haben & warten
TIP
Ihr koennt den auch Kernel mittels
# make && make install && make modules_install
backen, womit, nachdem der Kernel gebacken ist, die entsprechenden Files automatisch richtig kopiert werden.
Bitte vorher sicher stellen ob /boot gemounted ist; ist dies nicht der fall bitte vorher
# mount /boot
ausfuehren.
Ebenfalls vorher sicherstellen, das die Zeile
export INSTALL_PATH=/boot
in der Datei
/usr/src/linux/Makefile
nicht auskommentiert ist, d.h. vor der Zeile darf kein # stehen.
Zudem werden automatisch die richtigen Links angelegt. Der Name des neuen Kernels ist dann
vmlinuz-<kernel-version>
und liegt in /boot
Wenn ihr den Kernel mittels make install gemacht habt, koennt ihr den Abschnitt 3.2 ueberspringen
3.2 Files Kopieren
Ist der Kernel gebaut, muss er passend kopiert werden. Dabei wollen wir das man nachwievor den alten Kernel booten kann, falls mit dem neuen was nicht in Ordnung ist, was beim ersten backen nicht selten vorkommt.
# cp arch/i386/boot/bzImage /boot/linux-2.6.9 # linux-2.6.9 bitte anpassen falls noetig
# cp System.map /boot/System.map-2.6.9 # 2.6.9 bitte anpassen falls noetig
HINWEIS
evtl muss vorher /boot gemounted werden.
Ist dem so, vor den beiden obigen Befehlen ein
# mount /boot
ausfuehren.
Gingen beide Befehle von oben ohne Murren,
und ein ls /boot liefert etwas an Output,
diesen Hinweis bitte ueberlesen
Nun sind die neuen Files, sprich der neue Kernel, an ihren passenden Positionen
4.0 Bootmanager anpassen
Jetzt muss der Bootmanager entsprechend konfiguriert werden, damit er uns die moeglichkeit bietet, den neuen Kernel zu booten.
HINWEIS
Habt ihr den Kernel mit 'make install' installiert, so heisst euer kernel vmlinuz-<versionsnummer>, und nicht kernel-<versionsnummer>, wie er hier in den Beispielen immer genannt wird.
4.1 GRUB
Verwendet ihr GRUB, muss die /boot/grub/grub.conf bzw die /boot/grub/menu.lst angepasst werden.
Gibt folgender Command
# ls -lh /boot/grub/menu.lst
am Ende der angezeigte Zeile folgenden Output
menu.lst -> grub.conf
, ist menu.lst nur ein Link auf grub.conf, d.h. es ist egal, ob ihr die /boot/grub/grub.conf oder die /boot/grub/menu.lst bearbeitet.
Erscheint am Ende jedoch einfach
menu.lst
, also kein -> grub.conf, muesst ihr die /boot/grub/menu.lst bearbeiten, und nicht die /boot/grub/grub.conf
Um GRUB nun fuer den neuen Kernel zu konfigurieren, wird ein neuer Eintrag angelegt, der es moeglicht macht den neuen Kernel zu booten. Die Syntax des neuen Eintrags sieht so aus:
title = name des neuen eintrags # das wird der name, unter dem es bei GRUB auftaucht
root (hdX,Y) # Sagt GRUB welches Device das root Device ist
kernel /path/to/new-kernel root=/dev/hdpQ # Sagt GRUB wo der Kernel liegt
Sagen wir euer voriger GRUB Eintrag sieht so aus
title=2.6.7
root (hd0,0)
kernel (hd0,0)/kernel-2.6.7 root=/dev/hda3
, dann wuerde ein entsprechnder Eintrag drangehaengt und es wuerde so aussehen
# ALTER KERNEL
title=2.6.7
root (hd0,0)
kernel (hd0,0)/kernel-2.6.7 root=/dev/hda3
#NEUER KERNEL
title=2.6.9
root (hd0,0)
kernel (hd0,0)/kernel-2.6.9 root=/dev/hda3
unter
/boot/grub/
liegt meoglicherweise noch die File
grub.conf.sample
, wo einige verschiedene moegliche Konfigurationen aufgelistet werden. Ansonsten mal
/usr/share/doc/grub/examples/menu.lst
bzw
/usr/share/doc/grub/examples/grub.conf
checken, falls vorhanden, ansonsten sind im gepackten format unter
/usr/share/doc/grub-<version>/
noch examples&Dokus zu finden.
HINWEIS FUER FC USER ODER ANDERE, WO LABEL=/ O.AE. IN DER GRUB.CONF STEHT
Wenn dem so ist, und der Eintrag z.B. so oder so aehnlich aussieht
title=2.6.5
root LABEL=/
kernel /kernel-2.6.9 root=LABEL=/
, verwendet euer System ein initrd Image. Da wir nun ein solches nicht haben, soll der Eintrag trotzdem in dem Format sein wie oben angegeben, und nicht mit LABEL.
Dies kann zu Problemen fuehren, falls euer /boot NICHT mit ext2 formatiert wurde.
Alternativ kann ein initrd image erstellt werden, wie es zB hier erfolgreich durchgefuehrt wurde
http://www.linuxforen.de/forums/showthread.php?t=154194
Nun ist GRUB konfiguriert, fortfahren bei 5.0
4.2 LILO
Hier muss die
/etc/lilo.conf
angepasst werden.
Ein typischer LILO Eintrag hat folgende Pseudo Syntax:
image=/pfad/zum/kernel
label=name_von_dem_eintrag
read-only # option das zuerst ro gemounted wird
append="irgendwelche append optionen,zB fuer SCSI emu"
Wenn euer alter Eintrag zB so aussieht
image=/boot/kernel-2.4.18-14
label=linux
read-only
sieht der neue Eintrag so aus
image=/boot/2.6.9
label=kernel-2.6.9
read-only
HINWEIS
Falls in euer lilo.conf etwas wie LABEL auftaucht, habt ihr ein Problem falls /boot nicht seperat mit ext2 formatiert wurde. Ist dem so, koennt ihr einfach die Syntax von oben uebernehmen, ein LABEL DARF nicht auftauchen.
Ist dem NICHT so, muesst ihr ein initrd image erstellen, die SuFu benutzen oder googlen; diese Faelle sind nie ganz einfach.
Schaut auch nochmal bei 7.0 Troubleshooting
Habt ihr die lilo.conf entsprechend angepasst, muss noch ein
# /sbin/lilo
ausgefuehrt werden.
5.0 Neuen Kernel booten
Nun kann der neue Kernel gebooted werden. Dabei neustarten und im GRUB/LILO bootmenu den neuen Kernel booten. Laeuft er durch und startet sauber: Glueckwunsch!
Kommen hingegen Fehler, bitte bei Troubleshooting nachschauen
6.0 Abschliessende Worte & Hinweise
Jetzt laeuft endlich euer (erster?) selbstgebackener Kernel, den ihr aus den Sourcen gebaut habt, die in /usr/src/linux liegen und geniesst nun die eingangs erwaehnten Vorzuege.
Die meisten Module werden bei Bedarf geladen, manuell koennt ihr Module mit
# modprobe modul_name
laden. Falls ihr den Modul namen nicht mehr wisst, schaut unter make menuconfig unter den passenden Eintrag die Helppage an, oft steht dort der Modul nahme.
Wenn ihr nachtraeglich neue Module zum Kernel hinzufuegt, reicht ein
[ M ]
bei dem passenden Eintrag in make menuconfig und einem make modules_install. Ab sofort steht euch ohne reboot das neue Modul zur verfuegung.
Baut ihr neu was fest in den Kernel, muss der ganz Kernel wie unter 3.0 neu gebacken werden.
7.0 Troubleshooting
Beim Kernel bauen kann auch einiges Schiefgehen. Im Prinzip sind es immer 2 Sachen
Es wurde etwas wichtiges bei make menuconfig vergessen
Der alte Kernel verwendete eine initrd und es wurde LABEL benutzt
Meist reicht es den passenden Fehler Output in google.de oder hier in der SuFu zu pasten, es tauchen immer passende Ergebnisse auf.
Taucht ein Fehler wie folgt o.ae. auf
VFS: Cannot open root device 03:07
Kernel panic: unable to mount root fs on 03:07
Habt ihr entweder vergessen, passende IDE/SCSI und eure benutzten Filesystems _FEST_ in den Kernel einzubauen, oder ihr habt ein initrd Problem.
Checkt also nochmal, ob alles relevante im Kernel ist, und schaut euch mal um bezueglich des initrd Problems.
8.0 Ergänzungen, Kritik, Hinweise
... entweder direkt in den Thread schreiben oder mir per PN schicken.
Fuer Fragen im passenden Subforum einen Thread aufmachen, nicht hier fragen.
Vorher die SuFu benutzen und bei Google.de suchen!
Dank geht schonmal an carnil, der anmerkte das moeglicherweise die menu.lst statt der grub.conf editiert werden muss und dadrauf hinwies das bei anderen Distris die examples nicht existieren bzw woanders liegen. Ausserdem brachte er den Tipp, das die module-init-tools auch ueber den Packatmanager der jeweiligen Distri installiert werden koennen.
Dank geht ebenfalls an Indy500, welcher den Tipp brachte den Kernel mit 'make install' automatisch einrichten zu lassen.
Wozu wenn es bereits fertige Kernels gibt?
Der Kernel laesst sich an eigene Beduerfnisse anpassen
... dadurch kleinerer & ueberschaubarer Kernel
viele Anwendungen oder sonstige Sachen verlangen einen laufenden Kernel der aus installierten Sourcen gebaut wurde
Es laesst sich nachtraeglich immer sehr einfach neue Sachen in den Kernel einbauen & wieder entfernen
Vor den Befehlen steht ein $ falls der folgende Befehl als user ausgefuehrt werden soll, ein # zeigt an das es als root ausgefuehrt werden muss
Content
0.0 Hinweis fuer 2.4 -> 2.6
1.0 Kernel Sourcen
1.1 Installation von kernel.org
1.2 Installation vom Distri spezifischen Packagemanager
1.2.1 SuSE
1.2.2 Fedora Core 2
1.2.3 Debian
1.2.4 Gentoo
2.0 Konfigurieren des Kernels
2.1 Was zu beachten gilt
3.0 Bauen des Kernels
3.1 Backen des neuen Kernels
3.2 Files Kopieren
4.0 Bootmanager anpassen
4.1 GRUB
4.2 LILO
5.0 Neuen Kernel booten
6.0 Abschliessende Worte & Hinweise
7.0 Troubleshooting
8.0 Ergänzungen, Kritik, Hinweise
0.0 Hinweis fuer 2.4 -> 2.6
!GILT NUR FUER LEUTE DIE VON 2.4.x AUF 2.6.x UMSTEIGEN WOLLEN!
!SONST BITTE BEI 1.0 ANFANGEN!
Wenn ihr momentan einen 2.4.x Kernel am laufen habt, und einen 2.6.x auf diesem System einrichten wollt, gibt es eine Besonderheit zu beachten.
Seit 2.6.x werden die Module anders gehandhabt, weshalb eine neuere Version der module-init-tools vonnoeten ist.
HINWEIS
Ihr koennt die module-init-tools auch ueber den Packetmanager eurer Distri installieren, was den Vorteil hat das evtl benoetigte updates automatisch mitinstalliert werden. Wenn ihr also die module-init-tools erfolgreich ueber euren Packetmanager installiert habt, koennt ihr diesen Chapter ueberspringen und bei 1.0 fortfahren
Diese sind hier zu beziehen
http://www.kernel.org/pub/linux/kernel/people/rusty/modules/
und werden wie alle sonstigen Programme, die als Sourcen geliefert werden, installiert.
Entpacken der module-init-tools bei *tar.gz
tar xvzf module-init-tools-3.0.tar.gz #name der file anpassen
Entpacken der module-init-tools bei *tar.bz2
tar xvjf module-init-tools-3.0.tar.bz2 #name der file anpasse
Vorher sollten die alten module-init-tools gesichert werden.
# mv /sbin/modprobe /sbin/modprobe.old
# mv /sbin/insmod /sbin/insmod.old
# mv /sbin/lsmod /sbin/lsmod.old
# mv /sbin/depmod /sbin/depmod.old
# mv /sbin/modinfo /sbin/modinfo.old
# mv /sbin/insmod.static /sbin/insmod.static.old
Anschliessen in das Verzeichnis wechseln, das eben nach dem entpacken der neuen module-init-tools entstanden ist, und die module-init-tools kompilieren&installieren.
$ ./configure
$ make
# make install
damit ist das Sytem bereit fuer 2.6.x
1.0 Kernel Sourcen
Damit wir einen neuen Kernel aus den Sourcen installieren koennen, muessen eben diese auf dem System installiert sein. Die Kernelsourcen kommen nach /usr/src. Dabei wird einmal ein Ordner linux-<versionsnummer> erstellt, sowie ein Symbolischer Link linux, der auf den vorigen erwaehnten Ordner zeigt. Dieser muss evtl. manuell angelegt werden.
Zuerst muessen die Kernelsourcen bezogen werden, was auf verschiedene Art&Weisen passieren kann.
1.1 Installation von kernel.org
Auf www.kernel.org werden aktuelle sowie aeltere Kernel Sourcen gehosted. Ganz oben befindet sich der aktuell verfuegbarste Kernel, den man als Full saugen kann.
Waehlt den Kernel aus, den ihr moechtet, und ladet euch die VOLLEN! Sourcen runter.
Wenn ihr den momentan aktuellen 2.6.9 haben wollt, waere das z.B.
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.9.tar.bz2
Nachdem der fertig runtergeladen wurde, wechselt ihr in das Verzeichnis wo ihr ihn hingespeichert habt. Anschliessend wird er passend kopiert & entpackt
# cp linux-2.6.9.tar.bz2 /usr/src # linux-2.6.9.tar.bz2 evtl anpassen
# cd /usr/src
# tar xvjf linux-2.6.9.tar.bz2 # linux-2.6.9.tar.bz2 evtl anpassen
# ln -s linux-2.6.9 linux # linux-2.6.9 evtl anpassen
Damit sind die Sourcen auf eurem System installiert und ihr koennt mit 2.0 fortfahren
1.2 Installation vom Distri spezifischen Packagemanager
Die meisten Distributionen stellen einen Packetmanager zur verfuegung, mit dem man nun auch die gewuenschten Kernelsourcen installieren kann. Ich gehe hier kurz auf verschiedene Distris ein
1.2.1 SuSE
Hier koennen die Sourcen ueber YaST installiert werden. Einfach bei Software hinzufuegen/entfernen die passenden Kernel sourcen installieren, oder als Suchbegriff 'Kernel', 'Sourcen' oder 'Quellen' benutzen. Der Rest sollte bei YaST selbsterklaerend sein.
Anschliessend sollte geguckt werden ob die Sourcen existieren und ein Link besteht
# ls -lh /usr/src
ist dort nun ein Verzeichnis linux-<versionsnummer> und ein link namens linux, der auf linux-<versionsnummer> zeigt, ist alles in Ordnung und ihr koennt bei 2.0 fortfahren. Ansonsten legen wir den Link jetzt an
# cd /usr/src
# ln -s linux-2.6.9 linux # linux-2.6.9 bitte anpassen
1.2.2 Fedora Core 2
Hier koennen die Sourcen ueber yum eingespielt werden. Unter
# yum list
werden u.a. die verfuegbaren Kernersourcen aufgelistet, die ihr mittels
# yum install <name>
Einspielen koennt.
Anschliessend sollte geguckt werden ob die Sourcen existieren und ein Link besteht
# ls -lh /usr/src
ist dort nun ein Verzeichnis linux-<versionsnummer> und ein link namens linux, der auf linux-<versionsnummer> zeigt, ist alles in Ordnung und ihr koennt bei 2.0 fortfahren. Ansonsten legen wir den Link jetzt an
# cd /usr/src
# ln -s linux-2.6.9 linux # linux-2.6.9 bitte anpassen
1.2.3 Debian
Hier koennen die Sourcen mit apt-get installiert werden. Gesucht kann das passende Packet mittels
# apt-get search <name>
gesucht kann zB nach sources, wo man sich passende Kernelsourcen raussucht. Installiert werden sie mit
# apt-get install <packet-name>
Anschliessend sollte geguckt werden ob die Sourcen existieren und ein Link besteht
# ls -lh /usr/src
ist dort nun ein Verzeichnis linux-<versionsnummer> und ein link namens linux, der auf linux-<versionsnummer> zeigt, ist alles in Ordnung und ihr koennt bei 2.0 fortfahren. Ansonsten legen wir den Link jetzt an
# cd /usr/src
# ln -s linux-2.6.9 linux # linux-2.6.9 bitte anpassen
1.2.4 Gentoo
Hier werden die Sourcen bequem per emerge eingespielt. Mit
# emerge -s sources # nicht alles aufgelistete sind kernelsources!
werden die verfuegbaren Kernel aufgelistet. Auf
http://www.gentoo.org/doc/de/gentoo-kernel.xml
gibt es weitere Informationen ueber die verschiedenen Kernelsourcen, die verfuegbar sind. Die gewuenschten Kernelsourcen werden mit
# emerge die_kernelsourcen_die_du_wilst
installiert, das kann zB so aussehen
# emerge gentoo-sources
Anschliessend sollte geguckt werden ob die Sourcen existieren und ein Link besteht
# ls -lh /usr/src
ist dort nun ein Verzeichnis linux-<versionsnummer> und ein link namens linux, der auf linux-<versionsnummer> zeigt, ist alles in Ordnung und ihr koennt bei 2.0 fortfahren. Ansonsten legen wir den Link jetzt an
# cd /usr/src
# ln -s linux-2.6.9 linux # linux-2.6.9 bitte anpassen
2.0 Konfigurieren des Kernels
Nun kommt der wichtigste Part: Der Kernel wird mittels eines Frontends (wir verwenden menuconfig) konfiguriert, d.h. es wird bestimmt was in den Kernel fest reinkommt, was als Modul bereitgestellt werden soll und was nicht in den Kernel kommt. Diese Informationen wird von dem Frontend in die Datei .config abgelegt, die sich dann in /usr/src/linux befindet. D.h. wir editieren im Prinzip nur die .config, um beim spaeteren compilieren zu bestimmen, wie der Kernel aussehen soll.
Da das allerdings zu muesahm waere, diese Datei per Hand zu bauen, gibt es die bereits erwaehnten Frontends dafuer. Wir verwenden hier 'make menuconfig'.
Wir wechseln also in das Verzeichnis wo die nun neuen Kernelsourcen liegen
# cd /usr/src/linux
und geben dort
# make menuconfig
ein. Bei Bedarf sollte das Konsolen Fenster vorher etwas vergroessert werden.
Nun sollte ein grafisch angehauchtes Menu erscheinen. In diesem Menu wird nun alles eingestellt, d.h. ihr bestimmt was nun in den Kernel schlussendlich reinkommt. Dabei sollte sich bei jedem Eintrag die Frage gestellt werden
Brauche ich dieses Feature?
Muss es Fest in den Kernel oder reicht es als Modul?
Brauche ich es defenitiv nicht?
Brauche ich es vielleicht?
Werde ich es evtl irgendwann mal gebrauchen koennen?
Trifft der letzte Punkt z.B. zu, wuerde ich es nicht in den Kernel packen; es kann bei Bedarf immer noch als Modul reingebracht werden und das Modul gebildet werden (dazu spaeter mehr)
Trifft der vorletzte Punkt zu sollte es als Modul eingebaut werden, trifft der 3. Punkt von oben zu, sollte es garnicht eingebaut werden. Die ersten beiden Punkte sind selbsterklaerend.
Beim ersten Kernel bau sollte man sich wirklich Eintrag fuer Eintrag durcharbeiten und die genannten Punkte abchecken. Die groesste Hilfe ist hierbei der Shortcut 'Shift + ß', also als wuerdet ihr ein '?' eingeben. Dieser Shortcut, ausgeloest bei einem markierten Listeneintrag, zeigt ein neues Hilfefenster, das bereitgestellte Informationen ueber dieses Feature anzeigt. Hier sieht man sehr schnell, ob man dieses Feature braucht oder nicht, bzw lassen sich die Fragepunkte von oben damit leicht beantworten.
Geht also nun durch das gesamte Menu, fangt beim ersten an, und arbeitet euch von oben nach unten durch. Mit der Leertaste wird bei dem aktuelle Markierten Eintrag durch die verschiedenen verfuegbaren moeglichen Implemantionen geschaltet
[ ] - Kommt nicht in den Kernel
[M] - Kommt als Modul in den Kernel
[ * ] - Kommt fest in den Kernel
Einige Sachen lassen sich nicht als Modul einbauen, sondern nur fest oder garnicht.
Mit ESC kommt ihr aus Untermenues raus und geht zum uebergeordneteten Menue
Macht das wenn ihr etwas Zeit ueber habt, das sollte nicht hektisch geschehen. VORHER aber bitte folgende Hinweise lesen:
2.1 Was zu beachten gilt
Es gibt bestimme Sachen die ihr auf jeden Fall braucht. Unter File systems zB muesst ihr alle Filesystems fest in den Kernel bauen, die ihr auf jeden Fall braucht. Verwendet ihr zB ext2 auf /boot und auf / reiserfs muss ext2 und reiserfs support FEST im kernel sein. Mounted ihr aber zB auch mal NTFS oder FAT Windows Laufwerke, reicht es den Support dafuer als Modul in den Kernel zu machen
Achtet auf die Hardware! Hardware erkennung&Unterstuetzung geschieht nicht direkt durch eine Distri, sondern durch den Kernel. Seid sicher, das ihr den Support fuer auf jeden Fall&staendig verwendete Hardware FEST in den Kernel einbaut. Der Support fuer Prepherie und externen Stuff kann dabei aber als Modul eingebunden sein
Unter Code maturity level options sollten alle Eintraege markiert werden!
Unter Executable file formats sollten ebenfalls alle Eintraege als Fest in den Kernel gekennzeichnet sein
Bei vielen Help-sites steht am Ende "If unsure, say Y". Dem solltet ihr meistens Folge leisten
Wenn ihr fertig seid, ESC im Hauptmenu druecken, und yes waehlen, damit die Kernel konfiguration im .config gespeichert wird. Sichert euch am besten die File .config, z.B. so
# cp .config /root
damit liegt die .config nochmal im /root verzeichnis
3.0 Bauen des Kernels
Nun wird der neue Kernel gebaut.
3.1 Backen des neuen Kernels
Der neue Kernel kann nun gebaut werden. Wir befinden uns noch im /usr/src/linux Verzeichnis, wo folgende Commands die Backprozeduren ausfueren
make && make modules_install
nun etwas geduld haben & warten
TIP
Ihr koennt den auch Kernel mittels
# make && make install && make modules_install
backen, womit, nachdem der Kernel gebacken ist, die entsprechenden Files automatisch richtig kopiert werden.
Bitte vorher sicher stellen ob /boot gemounted ist; ist dies nicht der fall bitte vorher
# mount /boot
ausfuehren.
Ebenfalls vorher sicherstellen, das die Zeile
export INSTALL_PATH=/boot
in der Datei
/usr/src/linux/Makefile
nicht auskommentiert ist, d.h. vor der Zeile darf kein # stehen.
Zudem werden automatisch die richtigen Links angelegt. Der Name des neuen Kernels ist dann
vmlinuz-<kernel-version>
und liegt in /boot
Wenn ihr den Kernel mittels make install gemacht habt, koennt ihr den Abschnitt 3.2 ueberspringen
3.2 Files Kopieren
Ist der Kernel gebaut, muss er passend kopiert werden. Dabei wollen wir das man nachwievor den alten Kernel booten kann, falls mit dem neuen was nicht in Ordnung ist, was beim ersten backen nicht selten vorkommt.
# cp arch/i386/boot/bzImage /boot/linux-2.6.9 # linux-2.6.9 bitte anpassen falls noetig
# cp System.map /boot/System.map-2.6.9 # 2.6.9 bitte anpassen falls noetig
HINWEIS
evtl muss vorher /boot gemounted werden.
Ist dem so, vor den beiden obigen Befehlen ein
# mount /boot
ausfuehren.
Gingen beide Befehle von oben ohne Murren,
und ein ls /boot liefert etwas an Output,
diesen Hinweis bitte ueberlesen
Nun sind die neuen Files, sprich der neue Kernel, an ihren passenden Positionen
4.0 Bootmanager anpassen
Jetzt muss der Bootmanager entsprechend konfiguriert werden, damit er uns die moeglichkeit bietet, den neuen Kernel zu booten.
HINWEIS
Habt ihr den Kernel mit 'make install' installiert, so heisst euer kernel vmlinuz-<versionsnummer>, und nicht kernel-<versionsnummer>, wie er hier in den Beispielen immer genannt wird.
4.1 GRUB
Verwendet ihr GRUB, muss die /boot/grub/grub.conf bzw die /boot/grub/menu.lst angepasst werden.
Gibt folgender Command
# ls -lh /boot/grub/menu.lst
am Ende der angezeigte Zeile folgenden Output
menu.lst -> grub.conf
, ist menu.lst nur ein Link auf grub.conf, d.h. es ist egal, ob ihr die /boot/grub/grub.conf oder die /boot/grub/menu.lst bearbeitet.
Erscheint am Ende jedoch einfach
menu.lst
, also kein -> grub.conf, muesst ihr die /boot/grub/menu.lst bearbeiten, und nicht die /boot/grub/grub.conf
Um GRUB nun fuer den neuen Kernel zu konfigurieren, wird ein neuer Eintrag angelegt, der es moeglicht macht den neuen Kernel zu booten. Die Syntax des neuen Eintrags sieht so aus:
title = name des neuen eintrags # das wird der name, unter dem es bei GRUB auftaucht
root (hdX,Y) # Sagt GRUB welches Device das root Device ist
kernel /path/to/new-kernel root=/dev/hdpQ # Sagt GRUB wo der Kernel liegt
Sagen wir euer voriger GRUB Eintrag sieht so aus
title=2.6.7
root (hd0,0)
kernel (hd0,0)/kernel-2.6.7 root=/dev/hda3
, dann wuerde ein entsprechnder Eintrag drangehaengt und es wuerde so aussehen
# ALTER KERNEL
title=2.6.7
root (hd0,0)
kernel (hd0,0)/kernel-2.6.7 root=/dev/hda3
#NEUER KERNEL
title=2.6.9
root (hd0,0)
kernel (hd0,0)/kernel-2.6.9 root=/dev/hda3
unter
/boot/grub/
liegt meoglicherweise noch die File
grub.conf.sample
, wo einige verschiedene moegliche Konfigurationen aufgelistet werden. Ansonsten mal
/usr/share/doc/grub/examples/menu.lst
bzw
/usr/share/doc/grub/examples/grub.conf
checken, falls vorhanden, ansonsten sind im gepackten format unter
/usr/share/doc/grub-<version>/
noch examples&Dokus zu finden.
HINWEIS FUER FC USER ODER ANDERE, WO LABEL=/ O.AE. IN DER GRUB.CONF STEHT
Wenn dem so ist, und der Eintrag z.B. so oder so aehnlich aussieht
title=2.6.5
root LABEL=/
kernel /kernel-2.6.9 root=LABEL=/
, verwendet euer System ein initrd Image. Da wir nun ein solches nicht haben, soll der Eintrag trotzdem in dem Format sein wie oben angegeben, und nicht mit LABEL.
Dies kann zu Problemen fuehren, falls euer /boot NICHT mit ext2 formatiert wurde.
Alternativ kann ein initrd image erstellt werden, wie es zB hier erfolgreich durchgefuehrt wurde
http://www.linuxforen.de/forums/showthread.php?t=154194
Nun ist GRUB konfiguriert, fortfahren bei 5.0
4.2 LILO
Hier muss die
/etc/lilo.conf
angepasst werden.
Ein typischer LILO Eintrag hat folgende Pseudo Syntax:
image=/pfad/zum/kernel
label=name_von_dem_eintrag
read-only # option das zuerst ro gemounted wird
append="irgendwelche append optionen,zB fuer SCSI emu"
Wenn euer alter Eintrag zB so aussieht
image=/boot/kernel-2.4.18-14
label=linux
read-only
sieht der neue Eintrag so aus
image=/boot/2.6.9
label=kernel-2.6.9
read-only
HINWEIS
Falls in euer lilo.conf etwas wie LABEL auftaucht, habt ihr ein Problem falls /boot nicht seperat mit ext2 formatiert wurde. Ist dem so, koennt ihr einfach die Syntax von oben uebernehmen, ein LABEL DARF nicht auftauchen.
Ist dem NICHT so, muesst ihr ein initrd image erstellen, die SuFu benutzen oder googlen; diese Faelle sind nie ganz einfach.
Schaut auch nochmal bei 7.0 Troubleshooting
Habt ihr die lilo.conf entsprechend angepasst, muss noch ein
# /sbin/lilo
ausgefuehrt werden.
5.0 Neuen Kernel booten
Nun kann der neue Kernel gebooted werden. Dabei neustarten und im GRUB/LILO bootmenu den neuen Kernel booten. Laeuft er durch und startet sauber: Glueckwunsch!
Kommen hingegen Fehler, bitte bei Troubleshooting nachschauen
6.0 Abschliessende Worte & Hinweise
Jetzt laeuft endlich euer (erster?) selbstgebackener Kernel, den ihr aus den Sourcen gebaut habt, die in /usr/src/linux liegen und geniesst nun die eingangs erwaehnten Vorzuege.
Die meisten Module werden bei Bedarf geladen, manuell koennt ihr Module mit
# modprobe modul_name
laden. Falls ihr den Modul namen nicht mehr wisst, schaut unter make menuconfig unter den passenden Eintrag die Helppage an, oft steht dort der Modul nahme.
Wenn ihr nachtraeglich neue Module zum Kernel hinzufuegt, reicht ein
[ M ]
bei dem passenden Eintrag in make menuconfig und einem make modules_install. Ab sofort steht euch ohne reboot das neue Modul zur verfuegung.
Baut ihr neu was fest in den Kernel, muss der ganz Kernel wie unter 3.0 neu gebacken werden.
7.0 Troubleshooting
Beim Kernel bauen kann auch einiges Schiefgehen. Im Prinzip sind es immer 2 Sachen
Es wurde etwas wichtiges bei make menuconfig vergessen
Der alte Kernel verwendete eine initrd und es wurde LABEL benutzt
Meist reicht es den passenden Fehler Output in google.de oder hier in der SuFu zu pasten, es tauchen immer passende Ergebnisse auf.
Taucht ein Fehler wie folgt o.ae. auf
VFS: Cannot open root device 03:07
Kernel panic: unable to mount root fs on 03:07
Habt ihr entweder vergessen, passende IDE/SCSI und eure benutzten Filesystems _FEST_ in den Kernel einzubauen, oder ihr habt ein initrd Problem.
Checkt also nochmal, ob alles relevante im Kernel ist, und schaut euch mal um bezueglich des initrd Problems.
8.0 Ergänzungen, Kritik, Hinweise
... entweder direkt in den Thread schreiben oder mir per PN schicken.
Fuer Fragen im passenden Subforum einen Thread aufmachen, nicht hier fragen.
Vorher die SuFu benutzen und bei Google.de suchen!
Dank geht schonmal an carnil, der anmerkte das moeglicherweise die menu.lst statt der grub.conf editiert werden muss und dadrauf hinwies das bei anderen Distris die examples nicht existieren bzw woanders liegen. Ausserdem brachte er den Tipp, das die module-init-tools auch ueber den Packatmanager der jeweiligen Distri installiert werden koennen.
Dank geht ebenfalls an Indy500, welcher den Tipp brachte den Kernel mit 'make install' automatisch einrichten zu lassen.