Verfügbare Kernelversionen ermitteln und installieren

Immer wieder gibt es Situationen wo man bestimmte Kernelversionen installieren bzw. deinstallieren muss. Auch das gelegentliche Entsorgen von alten Kerneln fällt immer wieder in regelmäßigen Abständen auf einem Linuxsystem an. Dazu habe ich ein kurzes Shellscript programmiert das diese Aufgabe teilweise übernimmt.

Was kann bzw. erledigt das Shellscript automatisiert?

Eines vorweg zu meinem selbst entwickelten Script mit dem Namen GetActualKversion.sh. Das Tool (de)installiert nicht automatisch Kernelversionen, sondern zeigt den jeweiligen Befehl zum Installieren oder Deinstallieren so das man ihn per Copy&Paste übernehmen kann.

Aufgerufen wird das Script folgendermaßen:

$ ./GetActualKversion.sh KernelVersion

Zum Beispiel kann man sich alle verfügbaren Versionen des 4.13-Kernel anzeigen lassen.

$ ./GetActualKversion.sh 4.13
Alle verfügbaren Versionen des Kernels 4.13
 
4.13.0-16
4.13.0-17
4.13.0-19
4.13.0-21
4.13.0-25
4.13.0-26
4.13.0-31
4.13.0-32
4.13.0-36
 
Aktuellste Version 4.13.0-36 (de)installieren
 
apt purge linux-headers-4.13.0-36 linux-headers-4.13.0-36-generic linux-image-4.13.0-36-generic linux-image-extra-4.13.0-36-generic
apt install linux-headers-4.13.0-36 linux-headers-4.13.0-36-generic linux-image-4.13.0-36-generic linux-image-extra-4.13.0-36-generic
 
Angegebene Version 4.13.0-36 (de)installieren
 
apt purge linux-headers-4.13.0-36 linux-headers-4.13.0-36-generic linux-image-4.13.0-36-generic linux-image-extra-4.13.0-36-generic
apt install linux-headers-4.13.0-36 linux-headers-4.13.0-36-generic linux-image-4.13.0-36-generic linux-image-extra-4.13.0-36-generic

In der ersten Sektion werden alle 4.13er Kernel aufgelistet die im Repository verfügbar sind danach in der zweiten Sektion (Aktuellste Version …) werden die Pakete des aktuellsten Kernels (im Beispiel 4.13.0-36) angezeigt, die erforderlich sind zu einer Deinstallation (apt purge) bzw. einer Installation (apt install). Diesen Befehl kann direkt per Copy&Paste übernehmen um den Kernel zu (de)installieren.

In der dritten Sektion (Angegebene Version …) wiederholt sich Ausgabe der zweiten Sektion, das ist kein Fehler sondern die Ausgabe unterscheidet sich erst wenn man eine verfügbare Kernelversion komplett beim Aufruf des Shellscripts angibt. Das ist zum Beispiel nützlich um die Kernelpakete eines nicht mehr genutzten Kernels zu ermitteln und zu löschen.

Hier im Beispiel wird die Version 4.13.0-21 als Übergabeparameter angegeben.

$ ./GetActualKversion.sh 4.13.0-21
Alle verfügbaren Versionen des Kernels 4.13.0
 
4.13.0-16
4.13.0-17
4.13.0-19
4.13.0-21
4.13.0-25
4.13.0-26
4.13.0-31
4.13.0-32
4.13.0-36
 
Aktuellste Version 4.13.0-36 (de)installieren
 
apt purge linux-headers-4.13.0-36 linux-headers-4.13.0-36-generic linux-image-4.13.0-36-generic linux-image-extra-4.13.0-36-generic
apt install linux-headers-4.13.0-36 linux-headers-4.13.0-36-generic linux-image-4.13.0-36-generic linux-image-extra-4.13.0-36-generic
 
Angegebene Version 4.13.0-21 (de)installieren
 
apt purge linux-headers-4.13.0-21 linux-headers-4.13.0-21-generic linux-image-4.13.0-21-generic linux-image-extra-4.13.0-21-generic
apt install linux-headers-4.13.0-21 linux-headers-4.13.0-21-generic linux-image-4.13.0-21-generic linux-image-extra-4.13.0-21-generic
 

Nun unterscheiden sich die zweite und dritte Sektion bei der Ausgabe.

Um die Sache noch ein wenig zu vereinfachen kann man sich ein Alias auf dieses Shellscript legen. In meinem Fall habe ich den Namen lskernel gewählt.

Den Alias trägt man in der .bashrc des jeweiligen Users ($HOME) ein.

alias lskernel='/pfad/zum/script/GetActualKversion.sh'

Listing des Shellscript

Wer dieses kleine Helferlein nutzen will kann sich gerne den Quellcode per Copy&Paste aus dem nachfolgenden Listing auf seinem System abspeichern oder den Downloadlink hier nutzen.

#!/bin/bash
KVERS=$1
ONE_KVERS=$(echo ${KVERS/\-*/})
SPECIAL_KVERS=$(echo ${KVERS/*\.*\.*\-* /})

echo "Alle verfügbaren Versionen des Kernels $ONE_KVERS"
echo ""
apt-cache search 'linux-image-'$ONE_KVERS'.*generic' | cut -d" " -f1 | cut -d"-" -f3-4 | sort -V
ACTUAL_KVERS=$(apt-cache search 'linux-image-'$ONE_KVERS'.*generic' | cut -d" " -f1 | cut -d"-" -f3-4 | sort -V | tail -1)
ACTUAL_KVERS2=$(apt-cache search 'linux-image-'$SPECIAL_KVERS'.*generic' | cut -d" " -f1 | cut -d"-" -f3-4 | sort -V | tail -1)

echo ""
echo "Aktuellste Version $ACTUAL_KVERS (de)installieren"
echo ""
echo "apt purge `apt-cache search 'linux-(image(-extra)?|headers)-'$ACTUAL_KVERS'(-generic)?$' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'`"
echo "apt install `apt-cache search 'linux-(image(-extra)?|headers)-'$ACTUAL_KVERS'(-generic)?$' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'`"

echo ""
echo "Angegebene Version $ACTUAL_KVERS2 (de)installieren"
echo ""
echo "apt purge `apt-cache search 'linux-(image(-extra)?|headers)-'$ACTUAL_KVERS2'(-generic)?$' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'`"
echo "apt install `apt-cache search 'linux-(image(-extra)?|headers)-'$ACTUAL_KVERS2'(-generic)?$' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'`"
echo ""

Entwickelt und getestet habe ich das Shellscript auf einen KDE Neon System das als Unterbau Ubuntu LTS nutzt.