MiniTipp: Kernel patchen
Inhalt
- Einleitung
- Basisquellen installieren
- Kernel patchen
- Neuen Kernel backen
- Initrd-Image aktualisieren
- 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:
- Letzte Version der 2.4er-Serie (z.Zt.: 2.4.37.6)
- Linux 2.6.27 (z.Zt.: 2.6.27.36)
- Linux 2.6.30 (z.Zt.: 2.6.30.9)
- Aktuelle Version der 2.6er-Serie (z.Zt.: 2.6.31.2)
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
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
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ü.