ABSTRACT: compilieren und installieren eines neuen linux kernels wird erklaert AUDIENCE: junior admin SYSTEM: linux SECTION: basic unix commands AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt was tun wenn wir mit den kernel modulen des standard kernels nicht mehr auskommen? dann brauchen wir einen neuen kernel. wie wir den auf einem linux system machen lernen wir heute. wo bekommen wir unsere kernel sourcen her? es gibt viel wo man die kernel sourcen downloaden kann. z.b. ftp.xx.kernel.org wobei xx der ISO country code ist. fuer oesterreich z.b.: ftp ftp.at.kernel.org dort dann: cd /pub/linux/kernel/ 2.2er kernels findet man dann in: cd v2.2 2.4er kernels in: cd v2.4 bei der nummerierung von kernel hat linux folgende convention: ist die 2te zahl ungerade dann ist der kernel in entwicklung (z.b. 2.5) ist die 2te zahl gerade dann sollte der kernel "stabil" sein. natuerlich haben auch die stabilen immer wieder kleine unzulaenglichkeiten..darum gibt es ja mehrere davon.. mit stand 14.jaenner.2002 ist der lezte 2.2er kernel: 2.2.20 und der aktuellst 2.4er kernel: 2.4.17 was gerade aktuell ist sieht man mit einem ls am ftp server. oder mit dem befehl: finger @kernel.org hat man sich die kernel sourcen downgeladen muss man sie entpacken. das kann man im prinzip ueberall machen. per convention tut man ueblicherweise seine kernel sourcen unterhalb von /usr/src dort exisitert eventuell schon ein symlink auf die momentan aktuellen sourcen. (am besten mit ls -l kontrollieren) also: cd /usr/src ls -l rm linux nun entpacken wir die sourcen z.b. mit: tar xfvz /root/linux-2.2.20.tar.gz (oder flag I oder j falls wir ein bz2 komprimierte archiv haben.) der kernel entpackt sich unterhalb von verzeichnis "linux". damit wir spaeter wissen welcher kernel welcher war falls wir mehere downloaden vershiebn wir die sourcen auf linux-2.2.20 und machen wieder einen symlink.) also z.b.: mv linux linux-2.2.20 (natuerlich nur wenn es ein 2.2.20 war) ln -s linux-2.2.20 linux und dann ein cd linux der naechste schritt ist den kernel zu konfigurieren. dafuer gibt es verschiedene interfaces. am praktischten ist das "menuconfig" interface. uebersichtlich aber funktioniert auch in der console. make menuconfig damit make menuconfig mal funktioniert muss man natuerlich alle entwicklungswerkzeuge installiert haben (gcc, make, ..). (was beim debian oft fehlt ist die entwicklungsversion der bibliothek fuer die ncurses oberflaeche: apt-get install libncurses5-dev ) nun kann man auswaehlen wie man denn seinen kernel haette. mehr dazu spaeter. ist man fertig speichert man seine configuration ab. es empfiehlt sich eine kopie der einstellungen auch wo anders abzulegen (z.b. /usr/src/namedesrechners-kernelbezichnung.conf mittels "Save Configuration to an Alternate File") die einstellungen kann man dann spaeter fuer einen anderen (neueren) kernel weiter benutzen und muss nicht immer alle sachen neu auswaehlen nur weil man z.b. einen extra treiber fuer eine bestimmte netzwerkkarte dazu haben will etc... und es ist spaeter nachvollziehbar mit welchen einstellungen der kernel compiliert wurde.) ist man mit dem make menuconfig fertig so muss man den kernel uebersetzen. dazu gibt es verschiedenste moeglichkeiten... einige davon machen die folgenden schritte alle automatisch aber ich will hier die stufen einzeln besprechen: make dep clean bzImage macht (wenn keine fehler auftreten ..was ueblicherweise nicht passiert und wenn man sich auf einem intel/amd system befindet:) ein file in arch/i386/boot mit dem namen bzImage: ls -l arch/i386/boot/bzImage sollte also das datum und die groesse des neuen kernels zeigen. unser kernel image. (das file ist ein selbstentpackendes.. der kernel enpackt sich beim starten..) man kann den kernel natuerlich nicht einfach starten sondern kann ihn nur zum booten verwenden. als naechstes machen wir die module: make modules erzeugt alle module. die wollen wir unterhalb von /lib/modules/2.xx.xx installieren. das geht mit: make modules_install (achtung: will man module eines 2.4er kernels auf aelteren systemen verwenden benoetigt man eine neue version des "modutils" packets. das findet man auch auf den kernel mirror ftp servern) find /lib/modules/2.x.x. zeigt uns jetzt also unsere gerade compilierten module. als naechstes installieren wir den kernel. wohin das haengt davon ab wie wir booten. zum booten gibt es sehr viele verschiedene moeglichkeiten ueblicherweise aber wird mit LILO gebootet: wir compieren unseren kernel z.b. auf: cp arch/i386/boot/bzImage /boot/bzim2220meinersterkernel damit dieser kernel vom lilo verwendet ist tragen wir das in /etc/lilo.conf ein: image=/boot/bzim2220meinersterkernel label=Linux (dort gibt es meist auch einen abschnitt mit "label=old" dort tragen wir den bis jetzt verwendeten kernel ein. falls der neue nicht so funktioniert wie wir wollen koennen wir dann beim booten immer noch durch auswahl von "old" mit dem vorherigen kernel booten... und alles funktioniert wie bisher.) durch eingabe des befehles: lilo wird dann ein neuer bootsektor geschrieben der den neuen kernel verwendet. man kann ein kernel image file uebrigens auch ganz ohne jeglichen bootloader direkt auf eine floppy schreiben die dann bootbar ist. z.b.: cat arch/i386/boot/bzImage > /dev/fd0 (da man in diesem falle dem kernel keine parameter uebergeben kann man mit dem befehl rdev das root device umaendern: rdev /dev/fd0 zeigt das root device des kernels an den wir eben auf die floppy geschrieben haben. rdev /dev/fd0 /dev/hdb2 wuerde das root device auf /dev/hdb2 setzen.. jetzt eine kurze uebersicht ueber einige wichtige einstellungen: (hier von 2.4er kernel abber 2.2er ist aehnlich): (mit auswahl von bekommt man zu den meisten punkten eine kurze erklaerung) Code maturity level options ---> [*] Prompt for development and/or incomplete code/drivers sollte man einschalten. man bekommt damit auch punkte zu auswahl die noch nicht ganz so getestet sind..aber die muss man ja nicht anwaehlen wenn man nicht will.. Loadable module support ---> [*] Enable loadable module support [*] Set version information on all module symbols [*] Kernel module loader schaltet man ueblicherweise ein. Processor type and features ---> da waehlt man seinen prozessor aus. welchen man hat sieht man mit cat /proc/cpuinfo [ ] Symmetric multi-processing support braucht man erst wenn man mehrere prozessoren in einem computer hat.. also ueblicherweise nicht.. unter Block devices ---> kann man loopback oft gebrauchen. RAM disk und initrd support sind notwendig fuer distributionen die mit initrd booten (neuere suse, redhat, etc..) (ueber den bootvorgang lernen wir demnaechst mehr) unter den networking options empfiehtl sich "firewalling" support zu compilieren. eventuell als modul. Network device support ---> hier sollte man sicherheitshalber PPP dabeihaben (reicht meist als modul) und die wichtigsten netzwerkarten: 3com 3c59x RealTek RTL-8139 PCI NE2000 and clones und ISA NE2000 aufjedenfall mitdabei haben... andere bei bedarf.. bei Console drivers --> empfiehlt sich: [*] Video mode selection support bei manchen distributionen ist inzwischen die unsitte ausgebrochen mit einer grafischen oberflaeche zu booten die schon im console modus einen "framebuffer" benoetigt. in so einem falle muss man auch "framebuffer" support auswaehlen. EXERCISES: * schau nach ob du die kernel sourcen zu deinem aktuellen kernel auf deiner maschine findest. wenn ja sieh dir die einstellungen mit make menuconfig an. speichere aenderungen nicht ab. * hohl dir aktuelle kernel sourcen (wenn du bist jetzt 2.2 verwendest dann am besten einen neueren 2.2er wenn du schon 2.4 verwendest dann den letzten 2.4er) installiere sie unterhalb von /usr/src ACHTUNG: beim entpacken nicht bestehende kernels ueberschreiben d.h. es darf kein link oder verzeichniss existieren das schon linux heisst..) configuriere den kernel und compilieren ihn. mach dir module. versuch mit dem neuen kernel zu booten. (eventuell zuerst mal von floppy) REFERENCES: Kernel-HOWTO.txt /usr/src/linux/Documentation