GästebuchIhr Eintrag in unser Gästebuch KontaktNehmen Sie Kontakt mit den Autoren auf ArchivAlle Unixwerk- Artikel seit 2003
7. Oktober 2009

MiniTipp: Kernel patchen

Inhalt

  1. Einleitung
  2. Basisquellen installieren
  3. Kernel patchen
  4. Neuen Kernel backen
  5. Initrd-Image aktualisieren
  6. Bootloader konfigurieren

1. Einleitung

Wer - wie ich - immer seinen eigenen Kernel aus den sogenannten Vanilla-Quellen baut, muss natürlich auch selbst dafür Sorge tragen, dass der Kernel sicherheitstechnisch auf dem neuesten Stand ist. Dazu muss der Kernel von Zeit zu Zeit gepatcht werden. Zur Zeit werden folgende Kernel-Serien aktiv mit Security-Patches versorgt:

Dieser Artikel beschreibt, wie man seinen Kernel aktuell halten kann ohne Plattenplatz und Bandbreite zu verschenken.

2. Basisquellen installieren

Es gibt zur Zeit mehrere stabile Kernel-Zweige, die aktiv gepflegt werden. Als guter Kompromiss zwischen aktuell und stabil erscheint mir die Serie 2.6.27. Zum Patchen benötigen wir zunächst die kompletten Kernelquellen der Basis 2.6.27 von kernel.org:

# wget http://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2

Im Verzeichnis /usr/src kann der Kernel dann entpackt werden:

root# cd /usr/src
root:/usr/src# tar xvjf /path/to/linux-2.6.27.tar.bz2

3. Kernel patchen

Dazu wird zunächst der Patch benötigt. Diesen erhält man ebenfalls von kernel.org:

# wget http://ftp.kernel.org/pub/linux/kernel/v2.6/patch-2.6.27.36.bz2

Der Patch muss zunächst entpackt werden:

root# bunzip2 patch-2.6.27.36.bz2

Da alle Kernel-Patches auf die Basisquellen angewendet werden müssen, halten wir diese sauber und kopieren sie in ein neues Verzeichnis linux-2.6.27.36. Da die Kernelquellen entpackt mittlerweile um die 400MB Plattenplatz belegen, stößt man auf diese Weise schnell an Kapazitätsgrenzen.

Doch nun kommt der Trick: Wir legen eine Hardlink-Kopie an. Dazu hält der cp-Befehl den Schalter -l parat. Diese Kopie wird dann gepatcht.

root# cd /usr/src
root:/usr/src#  cp -la linux-2.6.27 linux-2.6.27.36 
root:/usr/src#  cd linux-2.6.27.36
root:/usr/src/linux-2.6.27.36#  patch -p1 < /path/to/patch-2.6.27.36

Die gepatchten Quellen belegen nun so gut wie keinen zusätzlichen Plattenplatz:

root:/usr/src# du -ms linux-2.6.27*
404     linux-2.6.27
40      linux-2.6.27.36

4. Neuen Kernel backen

Falls man bereits eine Kernel-Konfiguration einer früheren Version besitzt, kann man diese in das gepatchte Quellverzeichnis kopieren. Entweder aus älteren selbst kompilierten Quellen oder aus dem /boot-Verzeichnis, also etwa so

root# cp /boot/config-2.6.26-1-686 /usr/src/linux-2.6.27.36/.config

Kompiliert wird der neue Kernel dann wie immer:

root# cd /usr/src/linux-2.6.27.36
root:/usr/src/linux-2.6.27.36# make oldconfig
root:/usr/src/linux-2.6.27.36# make
root:/usr/src/linux-2.6.27.36# make modules_install

Das ganze wird dann ins /boot-Verzeichnis kopiert:

root:/usr/src/linux-2.6.27.36#  cp .config /boot/config-2.6.27.36
root:/usr/src/linux-2.6.27.36#  cp System.map /boot/System.map-2.6.27.36
root:/usr/src/linux-2.6.27.36#  cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.27.36

5. Initrd-Image aktualisieren

Die Erstellung der initialen RAM-Disk variiert leider von Distribution zu Distribution. Das folgende Beispiel gilt für Slackware. Dabei wird angenommen, dass das root-Device (aka das Wurzelverzeichnis /) als Logical Volume root in einer Volume Group namens sysvg liegt.

root# mkinitrd -c -m ext3 -f ext3 -k 2.6.27.36 -r /dev/sysvg/root -s /boot/initrd-tree/ -L -o /boot/initrd-2.6.27.36.gz

6. Bootloader konfigurieren

Damit das System den neuen Kernel bootet, muss er den Boot-Managern bekannt gemacht werden:

LILO:

In der Datei /etc/lilo.conf wird folgende Sektion eingetragen:

#
# Boot up Linux by default.
#
default=Linux

image=/boot/vmlinuz-2.6.27.36
    root=/dev/sysvg/root
    label=Linux
    read-only
    initrd=/boot/initrd-2.6.27.36.gz

Der Bootblock muss aktualisert werden:

root# lilo
Warning: LBA32 addressing assumed
Added Linux *

GRUB:

In der Datei /boot/grub/menu.lst wird folgende Sektion eingetragen:

default 0
timeout 8
title Linux 2.6.27.36
    root (hd0,2)
    kernel /boot/vmlinuz-2.6.27.36 root=/dev/sysvg/root vga=0x314 splash=silent showopts
    initrd /boot/initrd-2.6.27.36.gz

Beim Booten erscheint nun der neue Kernel im Bootmenü.