PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bauen eines 2.6.x aus den Sourcen



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.