Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Grafisches Dialogscript für den KDE Desktop (kdialog) zum löschen alter Kernelversionen. Aktuell kann nur ein Kernel pro Aufruf gelöscht werden.
Im Script werden die installierten Kernelversionen in einer Auswahlbox zur Löschung aufgelistet. Der aktuell laufende Kernel wird angezeigt, kann aber nicht gelöscht werden (siehe dazu auch Screenshot 1).
Im zweiten Schritt wird das Passwort des Benutzers abgefragt, der natürlich die entsprechenden Systemverwalterrechte besitzen muss (siehe Screenshot 2). Ab hier wird eine Fortschrittsanzeige angezeigt um den weiteren Scriptablauf optisch aufzuwerten.
Wurde das Passwort korrekt eingegeben erscheint eine Dialogbox (Screenshot 3) der nochmals eine Sicherheitsabfrage stellt mit einer Abbruchmöglichkeit. Bestätigt man die Löschung der ausgewählten Kernelversion it dem Button Ja, dann wird im Hintergrund die Kernelversion gelöscht.
Das Ergebnis (positiv oder negativ) der Deinstalltion der ausgewählten Kernelversion wird in einem Passiv-Popup dem Anwender angezeigt. Der Scriptlauf wird in einem Logfile protokolliert unter /tmp/run_kernel_remover.log und /tmp/run_kernel_remover.log.<JJJJMMTT-SSMMss>.
Screenshots
Scriptlisting
- run_kernel_remover.sh
#!/bin/bash # # Version: 20210520 # ####################### # Variablenbelegung ####################### # TIME_STAMP=$(date '+%Y%m%d-%H%M%S') USER_TMP_DIR="/home/$USER/tmp" LOGFILE_PURGE="$USER_TMP_DIR/run_kernel_remover.log" LOGFILE_KERNEL_LIST="$USER_TMP_DIR/kernel_list.txt" KERNEL_ACTUAL=$(uname -r|awk -F"-" '{print $1"-"$2}') KERNEL_MAJOR_VERSION=$(uname -r|awk -F"." '{print $1"."$2}') # # ################ # Funktionen ################ # # show_passive_popup_button_push() { if [ "$1" = "0" ] then echo "[$(date '+%H:%M:%S')] DEL_DIALOG YES=$1" >> $LOGFILE_PURGE elif [ "$1" = "1" ] then echo "[$(date '+%H:%M:%S')] DEL_DIALOG NO=$1" >> $LOGFILE_PURGE kdialog --passivepopup "[Kernel Remover]\nKernel $KERNEL_SELECTION konnte nicht gelöscht werden, da Button NEIN gedrückt wurde!" 5 close_progressbar del_log exit 3 elif [ "$1" = "2" ] then echo "[$(date '+%H:%M:%S')] DEL_DIALOG CANCEL=$1" >> $LOGFILE_PURGE kdialog --passivepopup "[Kernel Remover]\nKernel $KERNEL_SELECTION konnte nicht gelöscht werden, da Button ABBRECHEN gedrückt wurde!" 5 close_progressbar del_log exit 4 fi } show_passive_popup_kernel_del() { if [ "$1" = "0" ] then echo "[$(date '+%H:%M:%S')] PURGE RC="$1 >> $LOGFILE_PURGE kdialog --passivepopup "[Kernel Remover]\nKernel $KERNEL_SELECTION konnte erfolgreich gelöscht werden" 5 elif [ "$1" != "0" ] then echo "[$(date '+%H:%M:%S')] PURGE RC="$1 >> $LOGFILE_PURGE kdialog --passivepopup "[Kernel Remover]\nAchtung, Kernel $KERNEL_SELECTION konnte nicht gelöscht werden!" 5 fi } show_passive_popup_pwd() { if [ "$PASSWD_DIALOG_CHECK" = "1" ] then kdialog --passivepopup "[Kernel Remover]\nAchtung, Abbruch da im Passwortdialog der Button ABBRECHEN gedrückt wurde!" 5 elif [ "$PWD_CHECK" = "1" ] then kdialog --passivepopup "[Kernel Remover]\nAchtung, Abbruch da das Passwort (sudo) falsch eingegeben wurde!" 5 fi } init_progressbar() { # initieren der Fortschrittsanzeige progress=$(kdialog --title "Kernel-Remover" --progressbar "Ausgewählte alte Kernelpakete löschen" 4) qdbus $progress showCancelButton false } run_progressbar() { # Fortschrittsanzeige aktualisieren bei jedem Schritt VALUE="$1" TEXT="$2" qdbus $progress Set "" value $VALUE > /dev/null qdbus $progress setLabelText "$VALUE. Schritt: $TEXT" > /dev/null } close_progressbar() { # Fortschrittsanzeige am Scriptende schließen qdbus $progress close > /dev/null } print_timestamp() { # Timestamp (Start und Ende) ins Logfile schreiben TS_VALUE=$1 if [ "$TS_VALUE" = "start" ] then echo "[$(date '+%H:%M:%S')] ----------------------------------------------- Start -----------------------------------------------" >> $LOGFILE_PURGE elif [ "$TS_VALUE" = "end" ] then echo "[$(date '+%H:%M:%S')] ----------------------------------------------- Ende ------------------------------------------------" >> $LOGFILE_PURGE fi } del_log() { # Löschen des Logfiles mit der Kernelliste if [ -e "$LOGFILE_KERNEL_LIST" ] then echo "[$(date '+%H:%M:%S')] DELETE $LOGFILE_KERNEL_LIST" >> $LOGFILE_PURGE rm "$LOGFILE_KERNEL_LIST" fi echo "[$(date '+%H:%M:%S')] cp $LOGFILE_PURGE $LOGFILE_PURGE.$TIME_STAMP" >> $LOGFILE_PURGE print_timestamp end cp $LOGFILE_PURGE $LOGFILE_PURGE"."$TIME_STAMP } create_log() { # ggf. temporäres tmp Verzeichnis im $HOME erstellen if [ ! -d "$USER_TMP_DIR" ] then mkdir "$USER_TMP_DIR" fi # Altes Logfile löschen und neues erstellen if [ -e "$LOGFILE_PURGE" ] then rm $LOGFILE_PURGE touch $LOGFILE_PURGE touch $LOGFILE_KERNEL_LIST print_timestamp start echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von User $USER am $(date '+%d.%m.%Y') angelegt (1)" >> $LOGFILE_PURGE else touch $LOGFILE_PURGE touch $LOGFILE_KERNEL_LIST print_timestamp start echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von User $USER am $(date '+%d.%m.%Y') angelegt (2)" >> $LOGFILE_PURGE fi } ################## # Hauptprogramm ################## # # # Logile erstellen create_log # Aktuelle Kernel-Majorversion und Kernelversion ins Logfile schreiben echo "[$(date '+%H:%M:%S')] KERNEL_MAJOR_VERSION="$KERNEL_MAJOR_VERSION >> $LOGFILE_PURGE echo "[$(date '+%H:%M:%S')] KERNEL_ACTUAL="$KERNEL_ACTUAL >> $LOGFILE_PURGE # Alle installierten Kernel ermitteln und in Datei schreiben (LOGFILE_KERNEL_LIST) dpkg -l | egrep linux-image-[0-9] | awk -F'-' '{printf("%s%s%s\n", $3,"-",$4)}' >> $LOGFILE_KERNEL_LIST # Aktuell laufenden Kernel aus oben erzeugter Datei wieder entfernen sed -i '/'$KERNEL_ACTUAL'/d' $LOGFILE_KERNEL_LIST # löschbare Kernel ins Logfile schreiben echo "[$(date '+%H:%M:%S')] BEGIN DELETABLE KERNEL" >> $LOGFILE_PURGE cat $LOGFILE_KERNEL_LIST >> $LOGFILE_PURGE echo "[$(date '+%H:%M:%S')] END DELETABLE KERNEL" >> $LOGFILE_PURGE # Dialogbox anzeigen mit allen installierten Kernel außer dem aktuell laufenden KERNEL_SELECTION=$(kdialog --geometry 400x300 --title "Kernel-Remover" --menu "\nAktuell laufende und damit nicht entfernbare Kernelversion:<h3>$KERNEL_ACTUAL</h3>Bitte die Kernelversion für die Deinstallation auswählen:<br>" $(while read ROW; do MP=$ROW; echo $ROW; echo $MP; done < $LOGFILE_KERNEL_LIST) "9999") KERNEL_SELECTION_CHECK=$? if [ "$KERNEL_SELECTION_CHECK" -eq 0 ] then echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK="$KERNEL_SELECTION >> $LOGFILE_PURGE elif [ "$KERNEL_SELECTION_CHECK" -eq 1 ] then echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK="$KERNEL_SELECTION >> $LOGFILE_PURGE del_log exit 1 fi # Dialogbox zur Passwortabfrage, da sudo Rechte benötigt werden PASSWD_DIALOG=$(kdialog --title "Kernel-Remover (Passwort)" --password "Bitte das Passwort (sudo) eingeben") PASSWD_DIALOG_CHECK=$? init_progressbar run_progressbar "1" "Vorbereitungen zum Löschen des Kernels" sleep 1 # Test ob Passwort korrekt ist via simulierten "apt purge" echo "$PASSWD_DIALOG" | sudo -S apt purge --simulate `apt-cache search 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_VERSION'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION'(-generic){0,1}' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'` PWD_CHECK=$? # Auswertung der Tastendrücke des Passwortdialogs und des Passwortchecks if [ "$PASSWD_DIALOG_CHECK" = "0" -a "$PWD_CHECK" = "0" ] then echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG RC="$PASSWD_DIALOG_CHECK >> $LOGFILE_PURGE echo "[$(date '+%H:%M:%S')] PWD_CHECK="$PWD_CHECK >> $LOGFILE_PURGE elif [ "$PASSWD_DIALOG_CHECK" = "1" -o "$PWD_CHECK" = "1" ] then echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG RC="$RC >> $LOGFILE_PURGE echo "[$(date '+%H:%M:%S')] PWD_CHECK="$PWD_CHECK >> $LOGFILE_PURGE close_progressbar show_passive_popup_pwd del_log exit 2 fi # Zu löschende Kernelpakete errmitteln für Bestätigungsdialog KERNEL_PACKAGES=$(dpkg -l | egrep 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_VERSION'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION'(-generic){0,1}'| awk '{print $2}') # Dialogbox mit Bestätigungsdialog ob Kernel wirklich gelöscht werden soll DEL_DIALOG=$(kdialog --title "Kernel-Remover (Bestätigung)" --warningyesnocancel "Kernelversion $KERNEL_SELECTION mit den angegebenen Paketen wirklich löschen?\n\n$KERNEL_PACKAGES\n\nLogdatei unter $LOGFILE_PURGE\n\n") DEL_DIALOG_CHECK=$? show_passive_popup_button_push $DEL_DIALOG_CHECK run_progressbar "2" "Ausgewählter Kernel wird jetzt gelöscht" # Löschen der Kernelpakete # # Zum testen den Optionsparameter "--yes" (Pakete löschen ohne Nachfrage) von "apt purge" durch "--simulate" (Ausführung des Kommandos nur simulieren) ersetzen echo "$PASSWD_DIALOG" | sudo -S apt purge --yes `apt-cache search 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_VERSION'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION'(-generic){0,1}' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'` >> $LOGFILE_PURGE PURGE=$? # Testsimmulation (ggf. aktivieren) #echo "$PASSWD_DIALOG" | sudo -S apt purge --simulate `apt-cache search 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_VERSION'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION'(-generic){0,1}' | cut -d" " -f1 | awk '{printf("%s ",$0)}END {print "\n"}'` >> $LOGFILE_PURGE #PURGE=$? run_progressbar "3" "Temporäre Log-Dateien löschen" sleep 1 show_passive_popup_kernel_del $PURGE # zum testen auf der Kommandozeile nachfolgende Zeile entkommentieren (#-Zeichen entfernen), damit das Logfile sofort angezeigt wird #cat $LOGFILE_PURGE # Aufruf Funktion del_log close_progressbar #EOF
Logfile
Typisches Logfile nach erfolgreichen Löschung eines Kernels.
[11:47:58] ----------------------------------------------- Start ----------------------------------------------- [11:47:58] Logfile von User michael am 21.05.2021 angelegt (1) [11:47:58] KERNEL_MAJOR_VERSION=5.8 [11:47:58] KERNEL_ACTUAL=5.8.0-53 [11:47:59] BEGIN DELETABLE KERNEL 5.8.0-48 5.8.0-50 [11:47:59] END DELETABLE KERNEL [11:48:01] KERNEL_SELECTION_CHECK=5.8.0-48 [11:48:09] PASSWD_DIALOG RC=0 [11:48:09] PWD_CHECK=0 [11:48:25] DEL_DIALOG YES=0 Paketlisten werden gelesen... Abhängigkeitsbaum wird aufgebaut.... Statusinformationen werden eingelesen.... Paket »linux-headers-5.8.0-48-lowlatency« ist nicht installiert, wird also auch nicht entfernt. Paket »linux-image-5.8.0-48-lowlatency« ist nicht installiert, wird also auch nicht entfernt. Paket »linux-modules-5.8.0-48-lowlatency« ist nicht installiert, wird also auch nicht entfernt. Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt: amd64-microcode cracklib-runtime gconf2 gtk3-engines-breeze haveged intel-microcode iucode-tool kde-style-breeze-qt4 kde-style-qtcurve-qt4 kde-style-qtcurve-qt5 kf5-kdepim-apps-libs-data libccid libcrack2 libgeoclue-2-0 libgrantlee-textdocument5 libhavege1 libkdecorations2private7 libkf5emoticons-bin libkf5emoticons-data libkf5emoticons5 libkf5jsembed-data libkf5jsembed5 libkf5kaddressbookgrantlee5 libkf5kaddressbookimportexport5 libkf5kdegamesprivate1 libkf5libkdepimakonadi5 libkf5parts-plugins libkf5syndication5 libkf5xmlrpcclient-data libkf5xmlrpcclient5 libkimageannotator0.4.0 libllvm10 libpipewire-0.2-1 libpoppler87 libpwquality-common libpwquality1 libqrencode3 libqt4-dbus libqt4-declarative libqt4-network libqt4-script libqt4-sql libqt4-svg libqt4-xml libqt4-xmlpatterns libqtcore4 libqtcurve-utils2 libqtdbus4 libqtgui4 libvpx5 libzip4 phonon-backend-gstreamer phonon-backend-vlc qdbus qml-module-qtwebkit qtcore4-l10n thermald xserver-xorg-video-intel-arbiter xserver-xorg-video-intel-native-modesetting Verwenden Sie »sudo apt autoremove«, um sie zu entfernen. Die folgenden Pakete werden ENTFERNT: linux-headers-5.8.0-48-generic* linux-hwe-5.8-headers-5.8.0-48* linux-image-5.8.0-48-generic* linux-modules-5.8.0-48-generic* linux-modules-extra-5.8.0-48-generic* 0 aktualisiert, 0 neu installiert, 5 zu entfernen und 0 nicht aktualisiert. Purg linux-headers-5.8.0-48-generic [5.8.0-48.54~20.04.1] Purg linux-hwe-5.8-headers-5.8.0-48 [5.8.0-48.54~20.04.1] Purg linux-modules-extra-5.8.0-48-generic [5.8.0-48.54~20.04.1] Purg linux-image-5.8.0-48-generic [5.8.0-48.54~20.04.1] Purg linux-modules-5.8.0-48-generic [5.8.0-48.54~20.04.1] [11:48:46] PURGE RC=0 [11:48:46] DELETE /home/michael/tmp/kernel_list.txt [11:48:46] cp /home/michael/tmp/run_kernel_remover.log /home/michael/tmp/run_kernel_remover.log.20210521-114758 [11:48:46] ----------------------------------------------- Ende ------------------------------------------------