20.4.2006

Das Kernel

default

Hier steht nicht, wie man ein Kernel kompiliert. Das haben andere schon viel besser und ausführlicher geschrieben:

Hier steht das Drumherum: Wie man den Source-Tarball herunterlädt, wie man die PGP-Signatur prüft, wie man sein Kernel auf eine höhere Version hochpatcht, wo man nachsieht, ob man für das neuere Kernel auch neuere Tools und Utilities braucht, wo man sie herbekommt, wie man ihre Signaturen prüft, und was man machen muß, um das neue Kernel zu booten. Das steht zwar - im Prinzip - auch schon woanders, aber verstreut

 

Kernel herunterladen

Wenn man seinen Internetzugang in Deutschland hat, nimmt man http://www.kernel.org/ nur, um sich die Informationen anzusehen, zum Download empfiehlt sich dann aber http://www.kernel.org/mirrors/countries/html/DE.html (Links: /pub/linux).

Von dort lädt man das Kernel und seine Signatur herunter, z.B.:

  • linux-2.6.0.tar.bz2
  • linux-2.6.0.tar.bz2.sign

 

Nimmt man .tar.gz oder .tar.bz2

  • Für .tar.gz (oder .tgz) Archive braucht man gzip/gunzip,
  • für .tar.bz2 Archive braucht man bzip2/bunzip2.

Wenn man bzip2/bunzip2 hat, sollte man die .tar.bz2 Archive nehmen, weil sie deutlich kleiner sind.

 

Kernel Updates herunterladen

Wenn man bereits ein Kernel hat, z.B. Version 2.6.0 und man möchte auf Version 2.6.7 updaten, dann muß man nicht noch einmal viele Megabytes an Traffic erzeugen (die irgendein freundlicher Sponsor ja schließlich bezahlen muß), sondern man lädt sich patch-2.6.1.bz2 bis patch-2.6.7.bz2 (und ihre Signaturen) herunter (Kernel patchen, siehe weiter unten).

 

Kernel Archive Verification Key herunterladen:

Die Dateien zum Herunterladen sind (endlich) alle signiert. Es ist notwendig, diese Signaturen zu prüfen, auch und gerade dann, wenn man eigentlich zu faul ist. Wenn einem nämlich eine geänderte Datei untergeschoben wird, die irgend etwas Böses tut, z.B. Paßworte ausspionieren, dann wird das Reparieren des Schadens sehr viel mehr Arbeit machen als das Prüfen der Signatur gewesen wäre. Für das Kernel ist eine Anleitung auf http://www.kernel.org/signature.html

Ein Keyserver ist z.B. wwwkeys.pgp.net. Es gibt mehrere Möglichkeiten, z.B.:

0x517D0F0E ist die "Identity" des aktuellen "Kernel Archive Verification Key". Soweit ich es verstanden habe, ist die Identity ein Hash-Value (eine Art Quersumme), der aus dem Key berechnet wird.

 

Den Key importieren

Wie man den heruntergeladenen Key in sein Schlüsselbund (pubring.gpg) übernimmt, steht auf http://kai.iks-jena.de/pgp/gpg/gpg4.html#a3

Ich mache es bei mir so:

  • in /home/joern/.gnupg sind:
    • pubring.gpg,
    • secring.gpg und
    • options,
    • mein eigener exportierter Key und
    • sein Revocation Certificate
  • in /home/joern/.gnupg/pubkeys sind:
    • heruntergeladene Keys

Alles einmal neu importieren:

  • gpg --import /home/joern/.gnupg/pubkeys/*

 

Signatur prüfen

  • In das Verzeichnis gehen, wo der Tarball und seine Signatur liegen
  • Dann: gpg --verify linux-2.6.0.tar.bz2.sign

 

Kernel entpacken

  • Den Tarball nach /usr/src kopieren
  • Dann: tar -xjf linux-2.6.0.tar.bz2
  • Bzw.: tar -xzf linux-2.6.0.tar.gz
  • Bzw.: bzcat linux-2.6.0.tar.bz2 | tar -x

(Die letzte Möglichkeit muß man dann nehmen, wenn man zwar bzip2 hat, aber wenn tar nicht dafür gepatcht ist, bzip2 zu benutzen.)

 

Kernel updaten / Kernel patchen

Angenommen, man hat Kernel 2.6.0 und die Patches 2.6.1 bis 2.6.7. Dann kann man sich daraus Kernel 2.6.7 generieren. Dabei sollte man am besten die vorhandenen Kernel-Sourcen (/usr/src/linux-2.6.0) in Ruhe lassen und nur in einem neuen Directory /usr/src/linux-2.6.7 arbeiten.

Man entpackt den vorhandenen Tarball noch einmal "ganz frisch" z.B. in /tmp/ und verschiebt dann /tmp/linux-2.6.0/ nach /usr/src/linux-2.6.7/

  • cp linux-2.6.0.tar.bz2 /tmp/
  • cd /tmp
  • tar -xjf linux-2.6.0.tar.bz2
  • rm linux-2.6.0.tar.bz2
  • mkdir -p /usr/src/linux-2.6.7
  • cp -a linux-2.6.0/* /usr/src/linux-2.6.7
  • rm -R linux-2.6.0

Zum Patchen benutzt man das Skript linux-2.6.7/scripts/patch-kernel (man beachte die Pünktchen in der letzten Zeile, die gehören zum Befehl mit dazu):

  • cp patch-2.6.1.bz2 /usr/src
  • cp patch-2.6.2.bz2 /usr/src
  • cp patch-2.6.3.bz2 /usr/src
  • cp patch-2.6.4.bz2 /usr/src
  • cp patch-2.6.5.bz2 /usr/src
  • cp patch-2.6.6.bz2 /usr/src
  • cp patch-2.6.7.bz2 /usr/src
  • cd /usr/src/linux-2.6.7
  • ./scripts/patch-kernel . ..

 

Oder wenn man die Patches lieber einzeln von Hand anwenden möchte:

Die normalen Versions-Patches sind alle so gemacht, daß man zwei Kernel-Trees hatte, z.B. 2.6.11 und 2.6.11.5 und dann z.B. aufgerufen hat:

diff -Naur linux-2.6.11/ linux-2.6.11.5/ > patch-2.6.11.5

Dann stehen in der Patchdatei ganz oben diese beiden Directory-Trees drin, und dann wendet man den Patch normalerweise so an, daß man in das oberste Kernel-Directory wechselt, also z.B.

cd /usr/src/linux-2.6.11

und dann dem Patch beim Aufruf sagt, daß man jetzt eine Ebene tiefer drin ist, und er den ersten Pfadanteil (also "linux-2.6.11/") weglassen soll:

patch -Np1 -i ../patch-2.6.11.5

(Wenn man den Patch später rückgängig machen will, muß es statt "-N" heißen: "-R".)

 

Wie kommt man von 2.6.16.7 nach 2.6.16.9

Downloadadressen:

http://www.kernel.org/mirrors/countries/html/DE.html

dort jeweils z.B.:

/pub/linux/kernel/v2.6/patch-2.6.16.7

und

/pub/linux/kernel/v2.6/patch-2.6.16.9

nach:

/usr/src/

Kernel-Tree sei:

/usr/src/linux-2.6.16/

Kommandos:

cd /usr/src/linux-2.6.16
patch -Rp1 -i ../patch-2.6.16.7
patch -Np1 -i ../patch-2.6.16.9

Man patcht also von 2.6.16.7 zurück nach 2.6.16 und dann nach 2.6.16.9

 

Das Kernel kompilieren

Das ist sehr häufig und sehr ausführlich beschrieben worden, z.B.:

Nur ganz kurz:

  • Für "make menuconfig" braucht man die Headerfiles von ncurses. Wenn man eine Distribution hat, sind die häufig in einem Extra-Paket "ncurses-develop" oder ähnlich
  • Beim ersten Mal, nach dem Herunterladen:
    • ab 2.6.x: make mrproper && make menuconfig && make && make modules_install
    • bis 2.4.x: make mrproper && make menuconfig && make dep && make bzImage && make modules && make modules_install
  • ab dem zweiten Mal:
    • ab 2.6.x: make menuconfig && make clean && make && make modules_install
    • bis 2.4.x: make menuconfig && make clean && make bzImage && make modules && make modules_install

Hinterher läßt man sich den Returncode ausgeben: echo $? Da muß 0 angezeigt werden, dann sind keine Fehler aufgetreten.

 

Das Kernel bootfähig machen

Man kopiert 3 Dinge aus dem Kernel-Source-Tree heraus:

  • arch/i386/boot/bzImage --> /boot/vmlinuz-2.6.7
  • System.map --> /boot/System.map-2.6.7
  • .config --> /boot/.config-2.6.7

(.config ist zwar zum Booten nicht nötig, aber es ist praktisch, zu jedem Kernel auch seine Konfiguration aufzubewahren.)

Dann schreibt man eine Strophe in /etc/lilo.conf für das neue Kernel:

image=/boot/vmlinuz-2.6.7
label=2.6.7
read-only
optional

und ruft /sbin/lilo auf.

 

Wenn die Kiste nicht mehr bootet

Manchmal hat man eben Pech. Im Kernel-Howto steht, wie man dann eine Bootdiskette macht. Meistens geht es aber einfacher. Mir ist es z.B. schon ein paarmal passiert, daß ich den Lilo-Aufruf vergessen hatte, und daß dann aber auch das alte Kernel nicht mehr gebootet hat, weil die neuen Module in das gleiche Verzeichnis installiert wurden wie die alten, aber bei den neuen fehlte leider eins, weil ich es diesmal fest einkompiliert hatte. Und schon bleibt die Kiste beim Booten irgendwo hängen. Es gibt noch mehr solche Möglichkeiten, wo man dann nur den Lilo-Aufruf nachholen muß.

Meistens reicht es dann, wenn man ein Rettungssystem von Diskette bootet, und dann (angenommen, die Rootpartition ist hda3):

  • mount /dev/hda3 /mnt
  • chroot /mnt
  • /sbin/lilo
  • exit

und neu booten. Zur Not kann man das "exit" auch noch weglassen, dann funktioniert umount nicht: "device busy" wegen des noch aktiven chroot. Dann prüft er das Dateisystem beim nächsten Booten, kein Beinbruch. Also nur drei Worte:

mount  chroot  lilo

Fertig. Die Befehle, um eine Bootdiskette zu machen, mit "rdev" usw., wer kann sich sowas schon auswendig merken, und in der Situation, wenn die Kiste nicht bootet, kann man immer so schlecht nachsehen. Man sollte sich übrigens angewöhnen, alle Kernels in lilo.conf als "optional" einzutragen, so daß man bei solchen Rettungsversuchen - unter Streß - nicht erst noch alles Mögliche mounten muß, sondern daß nur das eine, wichtige Hauptkernel gefunden werden muß.

Als Rettungssystem kann man z.B. "Toms Root Boot" nehmen: http://www.toms.net/rb/ , oder auch die Installationsdisketten bzw. die CD der Distribution, oder auch "Knoppix": http://www.knopper.net/knoppix/

 

Anmerkungen zu Kernel 2.6.x

Im Kernel-Source-Tree, in Documentation/Changes findet man eine Liste von Tools und Utilities mit den benötigten Versionsnummern, und mit den Kommandos, um die vorhandenen Versionsnummern zu ermitteln. Zur Zeit sieht die Liste so aus:

Tool                             benötigt   vorhanden                                                             Download URL (so weit ich sie wußte)
                                                                                                                               
Gnu C                           2.95.3       gcc --version                                                     http://freshmeat.net/projects/gcc/
Gnu make                     3.79.1       make --version                                                   http://freshmeat.net/projects/gnumake
binutils                     2.12           ld -v                                                                     http://freshmeat.net/projects/binutils/
util-linux                 2.10o         fdformat --version                                           http://freshmeat.net/projects/util-linux/
module-init-tools   0.9.10       depmod -V                                                             http://www.fht.lkams.kernel.org/pub/linux/utils/kernel/module-init-tools/
e2fsprogs                   1.29           tune2fs                                                                 http://freshmeat.net/projects/e2fsprogs/
jfsutils                     1.1.3         fsck.jfs -V                                                          
reiserfsprogs           3.6.3         reiserfsck -V 2>&1|grep reiserfsprogs    
xfsprogs                     2.6.0         xfs_db -V                                                              
pcmcia-cs                   3.1.21       cardmgr -V                                                            
quota-tools               3.09           quota -V                                                                
PPP                               2.4.0         pppd --version                                                   http://freshmeat.net/projects/pppd/
isdn4k-utils             3.1pre1     isdnctrl 2>&1|grep version                          
nfs-utils                   1.0.5         showmount --version                                         http://freshmeat.net/projects/nfs-utils/
procps                         3.2.0         ps --version                                                       http://freshmeat.net/projects/procps/
oprofile                     0.5.3         oprofiled --version                                         http://freshmeat.net/projects/oprofile/
abatz.de Jörn Abatz - Technische Software Impressum