Heute habe ich mal wieder Kernel-Update gemacht. Normalerweise habe ich alles manuell gemacht, heute werde ich ihn auf “Debian-Art” bauen. Ausgangskonfiguration des Servers

  • Debian 3.1
  • Kernel 2.6
  • AMD 3000+ (Kein 64-Bit, Kein Dual-Core)

Zunächst müssen ein paar Packete geholt werden, damit der Kernel überhaupt kompiliert werden kann.

1
apt-get install bzip2 libncurses5-dev kernel-package module-init-tools binutils

Es gibt ein paar vorbestimmte Dinge beim Kernelbauen, eins davon ist, dass alles in /usr/src/ stattfindet, wo wir nun erstmal hinwechseln:

1
cd /usr/src/

Anschließend brauchen wir einen aktuellen Kernel. Diesen bekommt man, wenn man auf Kernel.org geht und dort in der obersten Zeile (“The latest stable version of the Linux kernel is:”) den link des Buchstaben “F” (Full Source) kopiert. Momentan ist Kernel 2.6.16.16 aktuell:

1
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.16.tar.bz2

Anmerkung: Besser ist es hier den Kernel rauszusuchen und herunterzuladen, der Speed ist deutlich besser. Dieser muss nun entpackt werden:

1
tar xvfj linux-2.6.16.16.tar.bz2

Je nach dem ob man schon mal einen Kernel gebaut hat befindet sich nun ein Symbolischer Link auf die Kernelquellen namens “linux” im Verzeichnis, welcher zunächst entfernt werden muss:

1
rm linux

Nun muss der aktuelle Link gelegt werden:

1
ln -s linux-2.6.16.16 linux

Damit sind zunächst die Vorarbeiten abgeschlossen.

Nachdem wir bereits im ersten Teil des Tutorials alle Vorarbeiten zum Kernelbau geleistet haben, können wir ihn nun konfigurieren und kompilieren. Wir wechseln in das Kernel-Verzeichnis:

1
cd /usr/src/linux/

Und räumen dort erst mal auf (Mr Proper ;) ) (Dies sollte auch gemacht werden, wenn man bereits kompiliert hatte und man den Vorgang auf sauberer Basis nochmals durchführen möchte)

1
make mrproper

Jetzt kommt ein wichtiger Schritt, das Einfügen der alten Kernel-Config in das Verzeichnis. Damit wir nicht alle Optionen für einen neuen Kernel nochmals manuell setzen müssen, können wir die alte Config verwenden. Diese findet man normalerweise unter /boot/ Bei mir heisst der Befehl dann:

1
cp /boot/config-2.6.15 .config

Nun startet man das Configurationsprogramm für den Kernel(wobei die alte Config berücksichtigt wird):

1
make menuconfig

Meine persönliche Erfahrung: So wenig wie nötig in den Kernel einbauen, jedoch so viel wie nötig. SCSI braucht man nicht einkompilieren, wenn man kein SCSI nutzt. Auch nicht als Modul. ACHTUNG SATA = SCSI, wer also S-ATA Festplatten hat, muss SCSI einschalten.Ich habe bei mir alles, was ich brauchte, fest einkompiliert, und Module abgeschalten.

Wenn alle Einstellungen getroffen sind, dann gibt man nicht den Vorschlag den der Kernel macht, ein, sondern den folgenden Befehl:

1
make-kpkg kernel_image --revision uli.0

Wobei das letzte “uli.0” nur zur unterscheidung zwischen verschiedenen Kernel-Versionen dient. Das wird später dem Debian-Paket angefügt und man hat dann den besseren Ãœberblick über verschiedene Kompilierungsversuche. Je nachdem wie schnell der Rechner ist, kann das eine Weile dauern. Bei mir dauerts auf einem AMD2500+ ca 20 Minuten, auf einem AMD3000+ ca 15 Minuten.

Wenn der Vorgang abgeschlossen ist, dann findet man den neuen Kernel in /usr/src, wohin wir nun wechseln und den Kernel anschließend installieren:

1
2
cd /usr/src/
dpkg -i kernel-image-2.6.16.16_uli.0_i386.deb

Wenn dies erfolgreich verlaufen ist, dann ist nun der Kernel eingebaut. Nach einem Reboot ist der Kernel dann auch aktiv, was man mit:

1
uname -r

überprüfen kann.

Normalerweise wird der Bootloader auch direkt konfiguriert, sodass man rein theoretisch nichts mehr machen müssen, sofern man direkten Rechnerzugang hat. Denn wenn der Rechner nicht hochkommen sollte, kann man ja bei physikalischen Zugriff den alten Kernel im Bootloader wieder auswählen. Wenn man jedoch so wie ich nur Serverkernel austauscht, sollte man ein paar arbeiten am Bootloader mehr vornehmen, was im dritten Teil des Tutorials erklärt wird.

Nachdem wir nun in den beiden ersten Teilen den Kernel kompiliert haben, führen wir nun einige Änderungen am Bootloader durch.

Normalerweise wird der Bootloader auch direkt konfiguriert, sodass man rein theoretisch nichts mehr machen müssen, sofern man direkten Rechnerzugang hat. Denn wenn der Rechner nicht hochkommen sollte, kann man ja bei physikalischen Zugriff den alten Kernel im Bootloader wieder auswählen.

Da ich aber ausschließlich mit Servern zu tun habe, sollte der folgende Vorgang durchgeführt werden, um ein “nicht-hochkommen” der Servers zu verhindern bzw ohne Rescue-System wieder zum laufen zu bekommen. Ich gehe dabei ausschließlich auf den Boot-Loader LILO ein! Zunächst wird die Konfiguration des Bootloaders editiert:

1
nano /etc/lilo.conf

Darin findet man die Konfigurationen die LILO benötigt, in meinem Fall sieht dies so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
lba32
boot=/dev/sda
root=/dev/sda2
install=/boot/boot-menu.b
map=/boot/map
delay=5
vga=normal
append="noapic acpi=off"
default=Linux

image=/vmlinuz
 label=Linux
 read-only

image=/vmlinuz.old
 label=LinuxOLD
 read-only
 optional

Hierbei ist das schon die neue Konfiguration wie sie von Debian nach der Kernelinstallation geschrieben wurde. “Linux” ist hierbei Kernel 2.6.16.16 und “LinuxOLD” der alte, aber sicher funktionstüchtige Kernel. Nun ändert man die folgende Zeile:

1
default=Linux

in die Version des alten Kernels:

1
default=LinuxOLD

und speichert. Nun muss man noch einmal:

1
lilo

eingeben um dann folgendes zu sehen:

1
2
3
server:~# lilo
Added Linux
Added LinuxOLD *

Der Eintrag wo nun das Sternchen ist, ist hierbei dann der Default-Boot-Kernel. Nun fragen sie sich sicher schon, warum ich einen neuen Kernel baue und dann aber doch den alten booten möchte. Der Trick kommt nun:

1
lilo -R (NEUERKERNELEINTRAG)

wobei (NEUERKERNELEINTRAG) durch das Label, das verwendet wurde (hier: “label=Linux”, also “Linux”) ersetzt werden muss (also in diesem Fall: “lilo -R Linux”) Nun wird NUR beim nächsten Neustart der neue Kernel gebootet. Sollte dieser Boot fehlschlagen(server kommt nach Wartezeit nicht online), so kann mit einem Remote-Reset der Server neu gebootet werden, woraufhin dieser in den alten Kernel bootet. Wenn dies eintritt, so sollte der Fehler zunächst in der Network-Konfiguration gesucht werden(Aktivert mit dem korrekten Treiber?). Sollte der Start erfolgreich verlaufen sein, so muss nun die LILO-Config zurückgeändert werden, die Zeile “default=Linux” sollte wieder statt “default=LinuxOLD” eingesetzt werden. Nun nicht vergessen wieder “lilo” in der Kommandozeile einzugeben um dem Bootloader die neue Config bekannt zu geben. Die Ausgabe sollte dann wieder so aussehen:

1
2
3
server:~# lilo
Added Linux *
Added LinuxOLD

Gratulation, der Server-Kernel ist nun auf dem neuesten Stand!