ubuntuusers.de

Skripte/Alte_Kernel_entfernen

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |
Dieses Thema ist die Diskussion des Artikels Skripte/Alte_Kernel_entfernen.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9384

Wohnort: Münster

TK87 schrieb:

[…] Nicht wirklich, wenn dem so wäre, könnte man ja auch mit "linux-version list" arbeiten.

Wieso kann man damit nicht arbeiten? Bei mir zeigt

linux-version list | while read ; do dpkg --list "linux-*$REPLY" | grep ^ii ; done 

zuverlässig alle installierten Kernel-Pakete an. Was zeigt dieser Befehl bei Dir und welche Pakete vermisst Du in der Liste dieses Befehls?

Aus dieser Liste muss man nur noch mit etwas Skript-Fu die Pakete entfernen, welche man behalten möchte, die 2. Spalte isolieren und dann die eingedampfte Liste an apt remove übergeben, z.B. (noch Entwurfsstadium!)

#! /bin/bash -e
# Alte Linux Kernel entfernen

shopt -s lastpipe
active=$( uname -r)			# den laufenden Kernel immer behalten
echo Aktiver Kernel ist $active
linux-version list							|
while read Version
  do test $Version = $active || dpkg --list "linux-*$Version" ; done	|
while read ii Packet _
  do case $ii in (ii) echo $Packet ; esac ; done  | readarray
sudo apt remove ${MAPFILE[*]}

Ist zwar kein Einzeiler, kommt aber ohne unübersichtliche reguläre Ausdrücke mit Escape-Orgien aus.

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 234

Wohnort: Aachen

ChickenLipsRfun2eat schrieb:

Find ich die beste Lösung.

Na dann kommen wir der Sache doch schon mal ein Stück näher 😉.

linux-source kann aber weg, wenn es den Kernel eh nicht mehr gibt.

So soll es ja auch sein, nur das source-Paket für den aktuellen Kernels soll erhalten bleiben. Für das aktuelle Beispiel muss da also am Ende

1
grep -v '5.10.0-21'

stehen.

kB schrieb:

Wieso kann man damit nicht arbeiten? Bei mir zeigt

linux-version list | while read ; do dpkg --list "linux-*$REPLY" | grep ^ii ; done 

Ich habe nicht gesagt, dass man mit "linux-version list" nicht arbeiten kann, sondern dass man damit alleine nicht weit kommt. Sieh dir dein Beispiel an, inwiefern ist diese Zeile nun besser als mein Eingangsvorschlag? Zum einen hast DU gesagt, man soll grep meiden, nutzt es nun aber selbst, zum anderen listest du damit weder die source-pakete auf (sofern diese installiert sind), noch wird bei deinem Befehl der aktuelle Kernel ausgelassen.

Gruß Thomas

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9384

Wohnort: Münster

TK87 schrieb:

[…] kB schrieb:

Wieso kann man damit nicht arbeiten? Bei mir zeigt

linux-version list | while read ; do dpkg --list "linux-*$REPLY" | grep ^ii ; done 

Ich habe nicht gesagt, dass man mit "linux-version list" nicht arbeiten kann, sondern dass man damit alleine nicht arbeiten kann. Sieh dir dein Beispiel an, inwiefern ist diese Zeile nun besser als mein Eingangsvorschlag?

Mein von Dir zitierter Befehl war gar nicht als Konkurrenz zu dem von Dir ursprünglich vorgeschlagenen Befehl gemeint, sondern Teil einer konkreten Frage an Dich, welche Du leider nicht beantwortet hast. Ich habe in meinem Beitrag auch dargelegt, dass dies noch nicht die vollständige Lösung ist und was noch zusätzlich geleistet werden müsste.

Und ja, wenn man meinen Befehl in Konkurrenz zu Deinem setzen möchte, dann finde ich meinen besser als Deinen, weil:

  • Statt bei Dir awk und grep und sed verwende ich nur eines, nämlich grep.

  • Ich benötige nicht wie Du komplizierte reguläre Ausdrücke.

  • Mein Programm ist einfacher lesbar als Deines.

Zum einen hast DU gesagt, man soll grep meiden, nutzt es nun aber selbst, zum anderen listest du damit weder die source-pakete auf (sofern diese installiert sind), noch wird bei deinem Befehl der aktuelle Kernel ausgelassen.

  • Kernel-Source-Pakete sind kein Thema für Einsteiger, an die sich der Artikel richtet.

  • Im Artikel geht es um installierte alte Kernel, die man los werden möchte und überhaupt nicht um Source.

  • Wenn Kernel-Source-Pakete installiert sind, dann hat man das manuell und bewusst gemacht und nicht automatisch im Zuge einer Aktualisierung. Manuell installiertes würde ich aber nicht automatisch entfernen lassen wollen.

Es ist daher besser, in Bezug auf diesen Artikel Kernel-Source ganz zu ignorieren.

Siehe Dir bitte mein fertiges Skript an, welches möglicherweise noch verbesserungs- oder ausbaufähig sein könnte, aber aus meiner Sicht alles erfüllt, was ein Skript für diesen Artikel erfüllen sollte und gut lesbar ist.

Der Ve

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 234

Wohnort: Aachen

kB schrieb:

Mein von Dir zitierter Befehl war gar nicht als Konkurrenz zu dem von Dir ursprünglich vorgeschlagenen Befehl gemeint, sondern Teil einer konkreten Frage an Dich, welche Du leider nicht beantwortet hast.

Welche deiner Fragen habe ich denn nicht beantwortet?

Wieso kann man damit nicht arbeiten?

habe ich beantwortet: Das habe ich so nie gesagt.

Was zeigt dieser Befehl bei Dir und welche Pakete vermisst Du in der Liste dieses Befehls?

habe ich auch beantwortet: Es fehlen die Source-Pakete. Darüber hinaus kann es z.B. auch linux-signature-nvidia-Pakete geben, wenn eine nvidia-graka vorhanden ist.

Ich habe in meinem Beitrag auch dargelegt, dass dies noch nicht die vollständige Lösung ist und was noch zusätzlich geleistet werden müsste.

Ja und dennoch ist dein Befehl jetzt schon für einen Anfänger schwer lesbar - vervollständige diesen noch und ein Anfänger wird damit genauso wenig anfangen können.

Und ja, wenn man meinen Befehl in Konkurrenz zu Deinem setzen möchte, dann finde ich meinen besser als Deinen, weil:

  • Statt bei Dir awk und grep und sed verwende ich nur eines, nämlich grep.

  • Ich benötige nicht wie Du komplizierte reguläre Ausdrücke.

Wie gesagt, dann mach deinen Befehl mal vollständig und du muss mindestens noch mal grep (oder wieder Regex) verwenden. Darüber hinaus habe ich auch schon erläutert, dass der Grundgedanke des Artikels niemals war, dass ein Anfänger dies unbedingt im Detail verstehen muss.

  • Kernel-Source-Pakete sind kein Thema für Einsteiger, an die sich der Artikel richtet.

  • Im Artikel geht es um installierte alte Kernel, die man los werden möchte und überhaupt nicht um Source.

  • Wenn Kernel-Source-Pakete installiert sind, dann hat man das manuell und bewusst gemacht und nicht automatisch im Zuge einer Aktualisierung. Manuell installiertes würde ich aber nicht automatisch entfernen lassen wollen.

Es ist daher besser, in Bezug auf diesen Artikel Kernel-Source ganz zu ignorieren.

Ich muss doch erst mal davon ausgehen, dass sich meine Vorredner bei diesem dynamisch gewachsenen Beitrag durchaus was gedacht haben und dies aus gutem Grund so gemacht haben. Ich habe lediglich die vorhandene Version korrigiert. Darüber hinaus sagte ich ja auch nicht das meine Version perfekt war - sonst hätte ich einfach geändert und nicht gefragt, ob es Einwände gibt.

Zurück zum Thema: Wenn du nun sagst, man solle die Source-Pakete nicht berücksichtigen, dann stimmt deine Aussage schon nicht mehr:

- Mein Programm ist einfacher lesbar als Deines.

Denn der Regex kann in dem Fall entfallen. Es bleibt nur noch:

1
dpkg -l "linux-[ih]*" | awk '$1 == "ii" {print $2}' | grep -v "$(uname -r)"

Trotz awk & grep ist dies imho nicht nur leichter lesbar als deines, sondern ist darüber hinaus auch schon fertig. Du hingegen musst immer noch die aktuellen Kernel ausblenden und noch aus der Zeile

ii  linux-image-5.10.0-21-amd64          5.10.162-1   amd64        Linux 5.10 for 64-bit PCs (signed)

die Paketnamen extrahieren.

Gruß Thomas

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9384

Wohnort: Münster

TK87 schrieb:

[…] Welche deiner Fragen habe ich denn nicht beantwortet?

Ich hatte Dich konkret gebeten, die konkrete Ausgabe des Befehls

linux-version list | while read ; do dpkg --list "linux-*$REPLY" | grep ^ii ; done 

auf Deinem System zu zeigen. Dies ist mir wichtig, weil Du offenbar sehr ungebräuchliche Kernel (s.u.) einsetzt, die vielleicht ein anderes als das mir bekannte Benennungssystem für Ubuntu-Kernel verwenden.

Ich hatte Dich zweitens gebeten, mir die konkreten Paketnamen (abgesehen von Source-Pakete) zu benennen, welche Du konkret auf der Ausgabeliste des Befehls vermisst, und nach Deiner Meinung aber im Zuge eines Skripts für diesen Artikel dennoch zu entfernen wären.

Um Missverständnissen vorzubeugen: Dieser Befehl ist in dieser Form nicht als zukünftiger Inhalt des Artikels vorgeschlagen oder zu verstehen. Er soll nur mit Deiner Hilfe mir helfen, die Thematik des Artikels selber besser zu verstehen.

[…]

ii  linux-image-5.10.0-21-amd64          5.10.162-1   amd64        Linux 5.10 for 64-bit PCs (signed)

fleet_street

Top-Wikiautor
Avatar von fleet_street

Anmeldungsdatum:
30. August 2016

Beiträge: 2400

Wohnort: Hunsrück (dunkle Seite)

Schade, dass die Diskussion (beginnend bei 9371639) letztes Jahr hier abgebrochen ist. Nichtsdestotrotz sind wir uns ja einig, dass der bisherige Bandwurm im Wiki unverständlich ist.

Ich habe diese damals und noch mal heute gelesen und fasse hier die Vorschläge, nicht die Argumente zusammen. Alle haben etwas für sich und wieder auch gegen sich. Außerdem gebe ich gleich meinen Senf dazu. (Ohje)

TK87 schrieb:

1
dpkg -l "linux-[ihs]*" | awk '$1 == "ii" {print $2}' | grep -v "$(uname -r |sed -E 's/-[a-z]+[0-9a-z\-]*$//g')"

Bei der Fassung sind bspw. die Metapakete für header und image noch in der Liste. Man könnte auch sed … durch cut -d "-2 -f-2 ersetzen, was ich leichter verständlich halte und m. E. aufgeräumter aussieht.

ChickenLipsRfun2eat schrieb:

dpkg-query --show linux-{headers-[^generic],image-[^generic]}* | grep -Ev $(uname -r)

Bei dem „Dach“ (^) musste ich stutzen. (Nicht antworten, hab's verstanden). 😉

kB schrieb:

linux-version list | while read ; do dpkg --list "linux-*$REPLY" | grep ^ii ; done 

Den Ansatz mit der Schleife finde ich toll. Aber nur um ein mal grep zu sparen, das hinterher, dann doch benötigt wird? Mmmh, …


Ich werfe mal noch meine Vorschläge in die Runde:

dpkg-query -W -f="\${package}\n" "linux-*" | \
  grep "$(linux-version list)" | \
  grep -v $(uname -r) | \
  xargs apt-get remove -s

Dabei habe ich auf einer einfachen Liste nur der Paketnamen ohne Installationsstatus [1] aufgebaut, die ich ausschließlich mit grep filter, ehe sie mittels xargs an apt-get übergeben wird. Natürlich erhält man dann für die nicht installierten Pakete eine Info (keinen Fehler), dass sie nicht installiert sind.

Getestet mit focal, jammy und noble. Auch bei einer VM, die sowohl linux-generic als auch linux-hwe-22.04-generic installiert hat, mit noch einer verbliebenen Version, auf die HWE mal gezeigt hat. Je nachdem mit welchem Kernel gestartet wird, wird der Rest inklusive passendem Metapaket entfernt. Das heißt aber auch, wenn mit der „Zwischenversion“ 6.5.0-40 gebootet wurde, dass beide Metapakete entfernt werden. Das dürfte dann unter Layer-8 verbucht werden. (Nur der installierte Kernel mitsamt seinen Metapaketen bleibt erhalten. Wenn kein Metapaket mehr auf diesen Kernel verweist, dann hat der Benutzer im GRUB falsch ausgewählt. Man kann halt nicht alles abfangen.)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
fleet@street:~$ uname -r
6.8.0-40-generic
fleet@street:~$ linux-version list
5.15.0-121-generic
6.5.0-44-generic
6.8.0-40-generic
fleet@street:~$ 
dpkg-query -W -f="\${package}\n" "linux-*" | \
  grep "$(linux-version list)" | \
  grep -v $(uname -r) | \
  xargs apt-get remove -s
HINWEIS: Dies ist nur eine Simulation!
         apt-get benötigt root-Privilegien für die reale Ausführung.
         Behalten Sie ebenfalls in Hinterkopf, dass die Sperren deaktiviert
         sind, verlassen Sie sich also bezüglich des reellen aktuellen
         Status der Sperre nicht darauf!
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
Paket »linux-image-unsigned-5.15.0-121-generic« ist nicht installiert, wird also auch nicht entfernt.
Paket »linux-image-unsigned-6.5.0-44-generic« ist nicht installiert, wird also auch nicht entfernt.
Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt:
  linux-headers-5.15.0-121 linux-hwe-6.5-headers-6.5.0-44
Verwenden Sie »apt autoremove«, um sie zu entfernen.
Die folgenden Pakete werden ENTFERNT:
  linux-generic linux-headers-5.15.0-121-generic
  linux-headers-6.5.0-44-generic linux-headers-generic
  linux-image-5.15.0-121-generic linux-image-6.5.0-44-generic
  linux-image-generic linux-modules-5.15.0-121-generic
  linux-modules-6.5.0-44-generic linux-modules-extra-5.15.0-121-generic
  linux-modules-extra-6.5.0-44-generic
0 aktualisiert, 0 neu installiert, 11 zu entfernen und 0 nicht aktualisiert.
Remv linux-generic [5.15.0.121.121]
Remv linux-headers-generic [5.15.0.121.121]
Remv linux-headers-5.15.0-121-generic [5.15.0-121.131]
Remv linux-headers-6.5.0-44-generic [6.5.0-44.44~22.04.1]
Remv linux-image-generic [5.15.0.121.121]
Remv linux-modules-extra-5.15.0-121-generic [5.15.0-121.131]
Remv linux-image-5.15.0-121-generic [5.15.0-121.131] [linux-modules-5.15.0-121-generic:amd64 ]
Remv linux-image-6.5.0-44-generic [6.5.0-44.44~22.04.1] [linux-modules-5.15.0-121-generic:amd64 ]
Remv linux-modules-5.15.0-121-generic [5.15.0-121.131]
Remv linux-modules-extra-6.5.0-44-generic [6.5.0-44.44~22.04.1]
Remv linux-modules-6.5.0-44-generic [6.5.0-44.44~22.04.1]
fleet@street:~$ 

Es bleiben in diesem Fall noch zwei Metapakete für header übrig. Möchte man die auch gleich erwischen, wird es etwas umständlicher, weil mit cut ein weiteres Programm beteiligt ist:

dpkg-query -W -f="\${package}\n" "linux-*" | \
  grep "$(linux-version list | \
    grep -v $(uname -r) | \
    cut -d "-" -f-2)" | \
  xargs apt-get remove -s

  • 1: Die uninstallierten herausfiltern halte ich ebenso wie ChickenLipsRfun2eat für unnötige Komplikation (KISS).

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13075

Eigentlich werden alte Kernel sowieso über apt autoremove entfernt. Da muss man eigentlich nicht viel extra machen, oder? Zumindest sollte man das auf der Seite erwähnen, finde ich.

fleet_street

Top-Wikiautor
Avatar von fleet_street

Anmeldungsdatum:
30. August 2016

Beiträge: 2400

Wohnort: Hunsrück (dunkle Seite)

Naja, verlinkt ist es zumindest:

… Zum Entfernen nicht mehr benötigter Kernel gibt es mehrere Möglichkeiten. Wenn die Standard-Methoden nicht zum gewünschten Ergebnis führen …

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13075

fleet_street schrieb:

Naja, verlinkt ist es zumindest:

… Zum Entfernen nicht mehr benötigter Kernel gibt es mehrere Möglichkeiten. Wenn die Standard-Methoden nicht zum gewünschten Ergebnis führen …

Danke! Das hatte ich übersehen. M.E. könnte das prominenter sein. Ich würde auch anfügen, dass das Kommando sudo apt-get autoremove --purge nicht nur obsolete Kernel entfernt.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9384

Wohnort: Münster

rklm schrieb:

fleet_street schrieb:

[…]

… Zum Entfernen nicht mehr benötigter Kernel gibt es mehrere Möglichkeiten. Wenn die Standard-Methoden nicht zum gewünschten Ergebnis führen …

[…] M.E. könnte das prominenter sein.

Ja, bei einer Überarbeitung des Artikels kann man das ja machen. Das ist aber nicht das Hauptproblem mit diesem Artikel, der daran krankt, dass er mit reißerischem Titel ein Skript verspricht, aber nicht liefert. Ich sehe zwei Möglichkeiten:

  • Man macht aus dem gegenwärtigen Artikel ein Howto.

  • Man erstellt tatsächlich ein bequemes Skript für diesen Zweck und veröffentlicht das hier. Ein solches Skript wäre abseits der Standardmethoden sinnvoll, wenn man eben nicht die Standard-Kernel verwendet, sondern z.B. die Mainline-Kernel.

Ich würde auch anfügen, dass das Kommando sudo apt-get autoremove --purge nicht nur obsolete Kernel entfernt.

Das gehört in den Hauptartikel kernel und steht da bereits.

fleet_street

Top-Wikiautor
Avatar von fleet_street

Anmeldungsdatum:
30. August 2016

Beiträge: 2400

Wohnort: Hunsrück (dunkle Seite)

kB schrieb:

rklm schrieb:

Ich würde auch anfügen, dass das Kommando sudo apt-get autoremove --purge nicht nur obsolete Kernel entfernt.

Das gehört in den Hauptartikel kernel und steht da bereits.

Ja, seit heute morgen. 😀

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13075

fleet_street schrieb:

kB schrieb:

rklm schrieb:

Ich würde auch anfügen, dass das Kommando sudo apt-get autoremove --purge nicht nur obsolete Kernel entfernt.

Das gehört in den Hauptartikel kernel und steht da bereits.

Ja, seit heute morgen. 😀

👍

Antworten |