Installation von einem zusätzlichen Kernel per grafischen KDE Dialog

Teilen:

Auf der Suche nach einen benutzerfreundlichen und komfortablen Weg weitere Kernel im System zu installieren, bin ich über den ersten Artikel meiner Serie Grafische Kernel-Tools, auch auf die Idee gekommen ein KDialog-Script für diesen Zweck zu entwickeln. Ziel sollte sein, eine einfache Installation eines zusätzlichen Kernels, auch für nicht so versierte Anwender, ohne spezielles Vorwissen bewerkstelligen zu können. Also für Benutzer sein, die die Kommandozeile und das Terminal eher meiden.

Im ersten Schritt (siehe ersten Screenshot) wählt man die Kernelversion aus, die man installieren möchte. Sollte man keinen Eintrag aus der Liste aktiv anklicken und den OK-Button sofort drücken, wird er letzte Kernel in dieser Liste installiert (hier im Beispiel 5.8.0-48). Danach öffnet sich ein Passwortdialog zur Eingabe des User-Passwortes um den Kernel installieren zu können. Hierzu ist die sudo-Berechtigung (Systemadmin) für den Benutzer zwingend vorausgesetzt.

Im dritten Dialog werden die zugehörigen Pakete des ausgewählten Kernels aufgelistet und die Bestätigung zum Fortgang eingefordert. Bis zu dieser Stelle kann der Scriptablauf abgebrochen bzw. gestoppt werden, danach erfolgt die automatische Installation.

In der gewählten Kernelversion werden die folgenden Pakete vom KDialog-Script installiert:

  • linux-image[Version]-generic
  • linux-headers[Version]-generic
  • linux-hwe-[Major-Version]-headers-[Version]
  • linux-modules-[Version]
  • linux-modules-extra-[Version]

Im weiteren Verlauf wird eine Fortschrittsanzeige einblendet. Ein Hinweis am Ende, über die erfolgreiche oder nicht erfolgreiche Installation der Kernelpakete, zeigt eine entsprechende KDE Benachrichtigung an.

Die Logdatei des Scriptes befindet sich unter $HOME/tmp/run_kernel_installer.sh.log, sowie eine Kopie mit einem Zeitstempel am Ende des Dateinamens, zB. run_kernel_installer.sh.log.20210325-132406 im gleichem Verzeichnis, da die Erstere bei jedem Scriptlauf überschrieben wird.



Screenshots

Kernel-Installer - Kernelauswahl

Kernel-Installer - Passworteinagbe

Kernel-Installer - Bestätigungsdialog

Kernel-Installer - Fortschrittsanzeige 1

Kernel-Installer - Fortschrittsanzeige 2

Kernel-Installer - Fortschrittsanzeige 3

Kernel-Installer - KDE Benachrichtigung



Scriptlisting

Das Script ist mit der Linuxdistribution KDE Neon oder auf einen Ubuntu Linux mit dem KDE Desktop lauffähig, aber auch auf einer anderen debianbasierten Distribution (nicht getestet) sollte dies möglich sein. Wenn kdialog nicht installiert ist kann dies per Paketverwaltung nachinstalliert werden, da dieses Paket die Grundlage für mein Script ist.

$ sudo apt install kdialog


  1#!/bin/bash
  2#
  3#######################
  4#  Variablenbelegung
  5#######################
  6#
  7USER_TMP_DIR="/home/$USER/tmp"
  8KERNEL_MAJOR_VERS=$(uname -r|awk -F"-" '{print $1}')
  9KERNEL_MAJOR_SHORT=$(uname -r|cut -d"." -f1-2)
 10TIME_STAMP=$(date '+%Y%m%d-%H%M%S')
 11LOGFILE_INSTALL=/home/$USER/tmp/$(basename $0).log
 12
 13################
 14#  Funktionen
 15################
 16#
 17
 18get_all_available_kernel()
 19{
 20	# Verfügbare kernel ermitteln
 21	echo "[$(date '+%H:%M:%S')] All available Kernel" >> $LOGFILE_INSTALL
 22	for ROW in $(apt-cache search linux-image-$KERNEL_MAJOR_VERS-.*-generic|awk -F"-" '{print $3"-"$4}')
 23		do
 24		ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]=$ROW
 25		echo ${ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]} >> $LOGFILE_INSTALL
 26		INDEX_AVAILABLE_KERNEL=$[INDEX_AVAILABLE_KERNEL+1]
 27	done
 28}
 29
 30get_mark_kernel()
 31{
 32	# Kernelversionen kennzeichnen ob installiert oder nicht
 33	echo "[$(date '+%H:%M:%S')] All installed Kernel" >> $LOGFILE_INSTALL
 34	ROW=0
 35	INDEX_AVAILABLE_KERNEL=0
 36	for ROW in ${ARRAY_AVAILABLE_KERNEL[@]}
 37		do
 38      IS_INSTALLED=$(dpkg -l | egrep $ROW | awk '{print $1}')
 39      if [ "$IS_INSTALLED" ]
 40			then
 41			ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]=$ROW"#yes_installed"
 42			echo ${ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]} >> $LOGFILE_INSTALL
 43			INDEX_AVAILABLE_KERNEL=$[INDEX_AVAILABLE_KERNEL+1]
 44		else
 45			ARRAY_AVAILABLE_KERNEL[$INDEX_AVAILABLE_KERNEL]=$ROW"#not_installed"
 46			INDEX_AVAILABLE_KERNEL=$[INDEX_AVAILABLE_KERNEL+1]
 47		fi
 48	done
 49}
 50
 51get_installable_kernel()
 52{
 53	# Installierbare Kernel ermitteln
 54	echo "[$(date '+%H:%M:%S')] All installable Kernel" >> $LOGFILE_INSTALL
 55	ROW=0
 56	INDEX_AVAILABLE_KERNEL=0
 57	for ROW in ${ARRAY_AVAILABLE_KERNEL[@]}
 58		do
 59      INSTALLABLE_KERNEL=$(echo $ROW | egrep "not_installed")
 60      if [ "$INSTALLABLE_KERNEL" ]
 61			then
 62			ARRAY_INSTALLABLE_KERNEL[$INDEX_INSTALLABLE_KERNEL]=$ROW
 63			echo ${ARRAY_INSTALLABLE_KERNEL[$INDEX_INSTALLABLE_KERNEL]} >> $LOGFILE_INSTALL
 64			INDEX_INSTALLABLE_KERNEL=$[INDEX_INSTALLABLE_KERNEL+1]
 65		fi
 66	done
 67}
 68
 69debug_print_array1()
 70{
 71	# Funktion für die Fehlersuche (nicht genutzt)
 72	echo ""
 73	echo "---------- Start Debug ARRAY_AVAILABLE_KERNEL ----------"
 74	for ROW in ${ARRAY_AVAILABLE_KERNEL[@]}
 75		do
 76      echo $ROW
 77	done
 78	echo "---------- Ende Debug ARRAY_AVAILABLE_KERNEL  ----------"
 79	echo ""
 80}
 81
 82debug_print_array2()
 83{
 84	# Funktion für die Fehlersuche (nicht genutzt)
 85	echo ""
 86	echo "---------- Start Debug ARRAY_INSTALLABLE_KERNEL ----------"
 87	for ROW in ${ARRAY_INSTALLABLE_KERNEL[@]}
 88		do
 89      echo $ROW
 90	done
 91	echo "---------- Ende Debug ARRAY_INSTALLABLE_KERNEL  ----------"
 92	echo ""
 93}
 94
 95debug_var()
 96{
 97	# Funktion für die Fehlersuche (nicht genutzt)
 98	echo ""
 99	echo "---------- Start Debug Variablen ----------"
100	echo "KERNEL_MAJOR_VERS="$KERNEL_MAJOR_VERS
101	echo "---------- Ende Debug Variablen  ----------"
102	echo ""
103}
104
105print_timestamp()
106{
107	# Timestamp (Start und Ende) ins Logfile schreiben
108	TS_VALUE=$1
109	if [ "$TS_VALUE" = "start" ]
110		then
111		echo "[$(date '+%H:%M:%S')] ------------------------------ Start ------------------------------" >> $LOGFILE_INSTALL
112	elif [ "$TS_VALUE" = "end" ]
113		then
114		echo "[$(date '+%H:%M:%S')] ------------------------------ Ende -------------------------------" >> $LOGFILE_INSTALL
115	fi
116}
117
118create_log()
119{
120	# ggf. temporäres tmp Verzeichnis im $HOME erstellen 
121	if [ ! -d "$USER_TMP_DIR" ]
122		then
123		mkdir "$USER_TMP_DIR"
124	fi
125	
126	# Altes Logfile löschen und neues erstellen
127	if [ -e "$LOGFILE_INSTALL" ]
128		then
129		rm $LOGFILE_INSTALL
130		touch $LOGFILE_INSTALL
131		print_timestamp start
132		echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von $USER angelegt (1)" >> $LOGFILE_INSTALL
133	else
134		touch $LOGFILE_INSTALL
135		print_timestamp start
136		echo "[$(date '+%H:%M:%S')] Logfile $LOGFILE_INSTALL von $USER angelegt (2)" >> $LOGFILE_INSTALL
137	fi
138}
139
140copy_log()
141{
142	# altes Logfile sichern
143	echo "[$(date '+%H:%M:%S')] cp $LOGFILE_INSTALL $LOGFILE_INSTALL.$TIME_STAMP" >> $LOGFILE_INSTALL
144	print_timestamp end
145	cp $LOGFILE_INSTALL $LOGFILE_INSTALL"."$TIME_STAMP
146}
147
148show_passive_popup()
149{
150	# Popup anzeigen bei (nicht)erfolgreicher Kernelinstallation
151	POP_TEXT=$1
152	echo "[$(date '+%H:%M:%S')] $POP_TEXT" >> $LOGFILE_INSTALL
153	kdialog --passivepopup "$POP_TEXT" 5
154}
155
156init_progressbar()
157{
158	# initieren der Fortschrittsanzeige
159	progress=$(kdialog --title "Kernel-Installer" --progressbar "XXXX" 4)
160	qdbus $progress showCancelButton false
161}
162
163run_progressbar()
164{
165	# Fortschrittsanzeige aktualisieren bei jedem Schritt
166	VALUE="$1"
167	TEXT="$2"
168	qdbus $progress Set "" value $VALUE > /dev/null
169	qdbus $progress setLabelText "$VALUE. Schritt:   $TEXT" > /dev/null
170}
171
172close_progressbar()
173{
174	# Fortschrittsanzeige am Scriptende schließen
175	qdbus $progress close > /dev/null
176}
177
178
179##################
180#  Hauptprogramm
181##################
182#
183create_log
184get_all_available_kernel
185get_mark_kernel
186get_installable_kernel
187
188# Dialogbox zur Auswahl des Kernels der installiert werden soll
189ANZ=${#ARRAY_INSTALLABLE_KERNEL[@]}
190KERNEL_SELECTION=$(kdialog --geometry 350x600 --title "Kernel-Installer" --menu "<br>Alle verfügbaren und installierbaren Kernel der Version<h3>"$KERNEL_MAJOR_VERS"</h3>\n\nsind unten aufgelistet.<br><br>Bereits lokal installierte Kernel der Versionsreihe  $KERNEL_MAJOR_VERS <br>werden nicht angezeigt. Bitte wählen Sie ihre <br>gewünschte Kernelversion zur Installation aus.<br>" $(for ((I=0;I<=$ANZ;I++)); do echo $I; echo ${ARRAY_INSTALLABLE_KERNEL[I]} | awk -F"#" '{print $1}'; done))
191KERNEL_SELECTION_CHECK=$?
192
193# Logmeldung schreiben
194if [ "$KERNEL_SELECTION_CHECK" = "0" ]
195	then
196	echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK=$KERNEL_SELECTION_CHECK" >> $LOGFILE_INSTALL
197elif [ "$KERNEL_SELECTION_CHECK" = "1" ]
198	then
199	echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_CHECK=$KERNEL_SELECTION_CHECK" >> $LOGFILE_INSTALL
200	print_timestamp end
201	exit 1
202fi
203
204# Progress initieren und starten
205init_progressbar
206run_progressbar "1" "Vorbereitungen zur Installation des Kernels"
207sleep 1
208
209# zweite Spalte des Arrays entfernen, so dass nur noch die Version bleibt
210KERNEL_SELECTION_SHORT=${ARRAY_INSTALLABLE_KERNEL[$KERNEL_SELECTION]%#not_installed}
211echo "[$(date '+%H:%M:%S')] KERNEL_SELECTION_SHORT=$KERNEL_SELECTION_SHORT" >> $LOGFILE_INSTALL
212
213# Dialogbox zur Passwortabfrage, da sudo Rechte benötigt werden
214PASSWD_DIALOG=$(kdialog --title "Kernel-Installer (Passwort)" --password "Bitte das Passwort (sudo) eingeben")
215PASSWD_DIALOG_CHECK=$?
216
217# Logmeldung schreiben
218if [ "$PASSWD_DIALOG_CHECK" = "0" ]
219	then
220	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG_CHECK=$PASSWD_DIALOG_CHECK" >> $LOGFILE_INSTALL
221fi
222
223# zu installierende Kernelpakete Variablen zuweisen
224KERNEL_PACKAGES=$(apt-cache search 'linux-(image(-extra)?|hwe-'$KERNEL_MAJOR_SHORT'-headers|headers|modules|modules-extra)-'$KERNEL_SELECTION_SHORT'(-generic)?$' | cut -d" " -f1)
225echo "[$(date '+%H:%M:%S')] KERNEL_PACKAGES="$KERNEL_PACKAGES >> $LOGFILE_INSTALL
226
227# Test ob Passwort korrekt ist via sudo mit "apt-cache search"
228echo "$PASSWD_DIALOG" | sudo -S apt-cache search $KERNEL_PACKAGES
229PWD_CHECK=$?
230
231# Auswertung der Tastendrücke des Passwortdialogs und des Passwortchecks
232if [ "$PASSWD_DIALOG_CHECK" = "0" -a "$PWD_CHECK" = "0" ]
233	then
234	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG_CHECK=$PASSWD_DIALOG_CHECK" >> $LOGFILE_INSTALL
235	echo "[$(date '+%H:%M:%S')] PWD_CHECK="$PWD_CHECK >> $LOGFILE_INSTALL
236elif [ "$PASSWD_DIALOG_CHECK" = "1" -o "$PWD_CHECK" = "1" ]
237	then
238	echo "[$(date '+%H:%M:%S')] PASSWD_DIALOG_CHECK=$PASSWD_DIALOG_CHECK Abbrechen gedrückt" >> $LOGFILE_INSTALL
239	echo "[$(date '+%H:%M:%S')] PWD_CHECK=$PWD_CHECK Passwort falsch ($PASSWD_DIALOG)" >> $LOGFILE_INSTALL
240	show_passive_popup "Das Passwort wurde falsch eingegeben bzw. der ABBRECHEN-Button wurde gedrückt"
241	print_timestamp end
242	close_progressbar
243	exit 10
244fi
245
246# Dialogbox mit Bestätigungsdialog ob Kernel wirklich installiert werden soll
247INSTALL_DIALOG=$(kdialog --title "Kernel-Installer (Bestätigung)" --warningyesnocancel "Kernelversion $KERNEL_SELECTION_SHORT mit den angegebenen Paketen wirklich installieren?\n\n$KERNEL_PACKAGES\n\n\nLogfile unter $LOGFILE_INSTALL\n")
248INSTALL_DIALOG_CHECK=$?
249
250#echo "Auswahl Array="${ARRAY_INSTALLABLE_KERNEL[$KERNEL_SELECTION]}
251#echo "Auswahl gekürzt="${ARRAY_INSTALLABLE_KERNEL[$KERNEL_SELECTION]%#not_installed}
252
253# Logmeldung schreiben
254if [ "$INSTALL_DIALOG_CHECK" = "0" ]
255	then
256	echo "[$(date '+%H:%M:%S')] INSTALL_DIALOG_CHECK=$INSTALL_DIALOG_CHECK" >> $LOGFILE_INSTALL
257	# Fortschrittsanzeige aktualisieren
258	run_progressbar "2" "Ausgewählter Kernel wird jetzt installiert"
259elif [ "$INSTALL_DIALOG_CHECK" = "1" ]
260	then
261	# nein gedrückt
262	echo "[$(date '+%H:%M:%S')] INSTALL_DIALOG_CHECK=$INSTALL_DIALOG_CHECK Nein gedrückt" >> $LOGFILE_INSTALL
263	show_passive_popup "Kernelversion $KERNEL_SELECTION_SHORT wurde nicht installiert, NEIN-Button wurde gedrückt"
264	print_timestamp end
265	close_progressbar
266	exit 2
267elif [ "$INSTALL_DIALOG_CHECK" = "2" ]
268	then
269	# abbrechen gedrückt
270	echo "[$(date '+%H:%M:%S')] INSTALL_DIALOG_CHECK=$INSTALL_DIALOG_CHECK Abbrechen gedrückt" >> $LOGFILE_INSTALL
271	show_passive_popup "Kernelversion $KERNEL_SELECTION_SHORT wurde nicht installiert, ABBRECHEN-Button wurde gedrückt"
272	print_timestamp end
273	close_progressbar
274	exit 3
275fi
276
277# Zum testen den Optionsparameter "--yes" (Pakete installieren ohne Nachfrage) von "apt install" durch "--simulate" (Ausführung des Kommandos nur simulieren) ersetzen
278#echo "$PASSWD_DIALOG" | sudo -S apt install --simulate $KERNEL_PACKAGES 1>> $LOGFILE_INSTALL 2>> $LOGFILE_INSTALL
279echo "$PASSWD_DIALOG" | sudo -S apt install --yes $KERNEL_PACKAGES 1>> $LOGFILE_INSTALL 2>> $LOGFILE_INSTALL
280INSTALLATION_CHECK=$?
281echo "[$(date '+%H:%M:%S')] INSTALLATION_CHECK=$INSTALLATION_CHECK" >> $LOGFILE_INSTALL
282
283# Logmeldung schreiben
284if [ "$INSTALLATION_CHECK" = "0" ]
285	then
286	show_passive_popup "Die Kernelversion $KERNEL_SELECTION_SHORT konnte erfolgreich installiert werden"
287else
288	show_passive_popup "Achtung Fehler! Die Kernelversion $KERNEL_SELECTION_SHORT konnte nicht erfolgreich installiert werden"
289fi
290
291# Fortschrittsanzeige aktualisieren
292run_progressbar "3" "Logfile sichern"
293sleep 1
294copy_log
295close_progressbar
296#EOF

Fazit

Wenn man sich dieses Script noch als Icon noch am KDE-Desktop hinterlegt, hat man einen einfachen und effizienten Weg zur Installation eines zusätzlichen Kernels, ohne die Kommandozeile zu bemühen.

Im dritten Teil der Serie werde ich das grafisches KDialog-Script Kernel-Remover vorstellen, das einzelne Kernelversionen aus dem System entfernen kann.



Weiterführende Informationen



Quelle Teaser-Logo: Photo by Shahadat Rahman on Unsplash