ubuntuusers.de

Skripte/Kernel_entfernen

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

Mylin

Avatar von Mylin

Anmeldungsdatum:
23. Juli 2024

Beiträge: 561

Kleine Korrektur zum systemd-service weil:

1
2
3
4
$ sudo journalctl | grep remove-old-kernel
Mär 27 14:03:16 mario-Vivobook systemd[1]: multi-user.target: Found ordering cycle on remove-old-kernel.service/start
Mär 27 14:03:16 mario-Vivobook systemd[1]: multi-user.target: Job remove-old-kernel.service/start deleted to break ordering cycle starting with multi-user.target/start
$

Jetzt ist es schick.

[Unit]
Description=Entfernen des alten Kernels nach dem Booten
After=graphical.target

[Service]
User=root
ExecStart=/usr/local/bin/remove-old-kernel
Restart=on-failure
RemainAfterExit=true

[Install]
WantedBy=boot-complete.target

Ruth-Wies

Avatar von Ruth-Wies

Anmeldungsdatum:
12. April 2023

Beiträge: 1011

Wohnort: im Exil ;(

Mylin schrieb:

Was ist mit manuell installierten?

Wer macht denn sowas? (nicht antworten) 😉 In dem Fall würde ich mit apt-mark alle manuell installierten Kernelpakete auf auto setzen und schon klappt es wieder mit autoremove. (Aber jeder wie er mag.)

Berlin_1946 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10867

Hallo in die Runde

was spricht gegen die Erweiterung des Befehls

dpkg -l 'linux-[ihs]*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\([-0-9]*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | tee zu_entfernende_Kernel 

mit ihmst

dpkg -l 'linux-[ihmst]*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\([-0-9]*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | tee zu_entfernende_Kernel 

aasche ist leider nicht mehr aktiv, den kann ich nicht fragen.

Nach meinem Kenntnisstand würde das dem Befehl

sudo apt autoremove --purge 

entsprechen.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 10393

Wohnort: Münster

Berlin_1946 schrieb:

[…] was spricht gegen die Erweiterung des Befehls […]

Das macht aus einem für den durchschnittlichen Leser völlig unverständlichen „1000-Tatzelwurm-Befehl“ einen „1002-Tatzelwurm-Befehl“. Verbessert also nicht die Verständlichkeit des Artikels.

Gegenfrage: Was spricht gegen die Entwicklung eines Skripts, welches statt des Tatzelwurms das Verfahren in mehreren kürzere Befehle auflöst, die dann auch dem Leser erklärt werden könnten?

Wenn jemand schon Arbeit in diesen Artikel investieren möchte, wäre m.E. das der bessere Ansatz zur Verbesserung der Qualität des Wikis.

Da ich den „1000-Tatzelwurm-Befehl“ nicht verstehe (dazu müsste ich geschätzt einen Arbeitstag verschwenden, um ihn in allen Teilen zu testen – wozu ich nicht bereit bin), kann ich auch nicht beurteilen, ob die von Dir vorgeschlagene, geringfügig erscheinende Erweiterung schädlich oder nützlich wäre und empfehle daher eine Beibehaltung der originalen Fassung.

Ruth-Wies

Avatar von Ruth-Wies

Anmeldungsdatum:
12. April 2023

Beiträge: 1011

Wohnort: im Exil ;(

Berlin_1946 schrieb:

was spricht gegen die Erweiterung des Befehls

Gegenfrage: Was sprich dafür?

Ein Beispiel: Wenn man die Abfrage um „m“ erweitert – m für bspw. modules – dann sind die in der Liste, die der Einzeiler verarbeitet. Ja, aber: Jedes nutzbare Modul hat als Abhängigkeit einen expliziten Kernel. Wenn der ursprüngliche Einzeiler also den Kernel entfernt, dann wird auch das passende, nutzbare Modul entfernt, weil dessen Abhängigkeit nicht mehr erfüllt ist. → Im Sinne der Aufgabenstellung ist die Erweiterung unnötig.

Die Frage ist eher, was mit Metapaketen, die mit „linux-[mt]“ beginnen, angestellt wird, wenn die mit in die Liste zur Verarbeitung aufgenommen werden. Werden die von dem Einzeiler dann auch entfernt oder belassen? Und das darf nicht nur auf einem System getestet sein, sondern soll für alle denkbaren Konstellationen gelten. Da wird's schwierig. [1]

Berlin_1946 schrieb:

Nach meinem Kenntnisstand würde das dem Befehl

sudo apt autoremove --purge 

entsprechen.

Klares Nein, weil autoremove auch andere, nicht mehr benötigte Abhängigkeiten entfernt. Man darf nicht von einem aufgeräumten System ausgehen. Nicht alle sind so vorbildlich wie du. 😇


  • 1: Ich verstehe das Kommando auch nur zum Teil. Zudem sitze ich vor einem debian; Dort funktioniert die Kolonne eh nicht. Und auf meinem altersschwachen Notebook können auch nur 32-bit Systeme in einer VM laufen; Da müsste ich in einer chroot-Umgebung testen. Aber ob ich da an alle möglichen Fälle denke?

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 10393

Wohnort: Münster

Ruth-Wies schrieb:

[…] Und das darf nicht nur auf einem System getestet sein, sondern soll für alle denkbaren Konstellationen gelten. Da wird's schwierig.

Sehr richtig!!!

Auf meinem System liefert der 1000-Tatzelwurm:

linux-headers-7.0.0-38-generic
linux-hwe-7.0-headers-7.0.0-38
linux-image-7.0.0-38-generic

Ich halte das für unvollständig, also falsch. Richtiger (aber ohne Garantie für die volle Wahrheit) wäre wohl:

dpkg -l 'linux-*7.0.0-38*' | grep ^ii
ii  linux-headers-7.0.0-38-generic                   7.0.0-38.38~24.04.4 amd64        Linux kernel headers for version 7.0.0
ii  linux-hwe-7.0-headers-7.0.0-38                   7.0.0-38.38~24.04.4 all          Header files related to Linux kernel version 7.0.0
ii  linux-image-7.0.0-38-generic                     7.0.0-38.38~24.04.4 amd64        Signed kernel image generic
ii  linux-main-modules-v4l2loopback-7.0.0-38-generic 7.0.0-38.38~24.04.4 amd64        Signed v4l2loopback module for 7.0.0-38
ii  linux-main-modules-zfs-7.0.0-38-generic          7.0.0-38.38~24.04.4 amd64        Signed zfs module for 7.0.0-38
ii  linux-modules-7.0.0-38-generic                   7.0.0-38.38~24.04.4 amd64        Linux kernel modules for version 7.0.0

Gerade bei solchen „Operationen am offenen Herzen“ darf man sich keine Risiken durch Unverständnis leisten. Ich neige jetzt dazu, den Artikel als fehlerhaft zu markieren und mit einer Warnung zu versehen.

Ruth-Wies

Avatar von Ruth-Wies

Anmeldungsdatum:
12. April 2023

Beiträge: 1011

Wohnort: im Exil ;(

kB schrieb:

Ich halte das für unvollständig, also falsch.

Es nur ein anderer Ansatz. Du würdest die komplette Liste ermitteln und übergeben; Ginge auch.

Wie bereits geschrieben, sind die Module vom Kernel abhängig. Wenn der entfernt wird, dann werden auch die Module entfernt. – Bei dir würde also das Entfernen der gefundenen drei Pakete – sozusagen als Serviceleistung – auch alle von dir gefundenen Module entfernen. Damit wäre der Sinn erfüllt.

apt-get remove --simulate linux-headers-7.0.0-38-generic linux-hwe-7.0-headers-7.0.0-38 linux-image-7.0.0-38-generic

Berlin_1946 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10867

Ruth-Wies schrieb:

Man darf nicht von einem aufgeräumten System ausgehen.

Ok da gebe ich dir Recht.

Wenn ich aber unterstelle, dass der User vllt mal aufräumen will/muss kommt er auch hier vorbei.

Ruth-Wies schrieb:

Ja, aber: Jedes nutzbare Modul hat als Abhängigkeit einen expliziten Kernel.

Da fehlt mir das Wissen, so wie ich es mir vorstelle.

  • es wird oder muss aufgeräumt werden.

  • -Skripte/Alte_Kernel_entfernen- wird benutzt

  • es bleiben die Module, die Tools und die main-modules-zfs- der alten Kernel erhalten.

  • können oder sollten diese "Reste" dann auch entsorgt werden?

Damit wird dann noch NUR halb aufgeräumt. Somit kann ich in der Version dieses Wikis keinen richtigen Sinn erkennen.

Auch mein Vorschlag hinterlässt auch die Tools, was sudo apt autoremove --purge nicht macht.

Ich bin vllt zu übervorsichtig, aber bevor ich sudo apt autoremove --purge benutze, mache ich erst mal das sudo apt autoremove --dry-run und schaue mir an, was gelöscht werden würde.

Diesen Post finde ich im Bezug zum Thema Aufräumen super: alte Kernel deinstallieren.

Dank eurer Posts (Ruth-Wies und kB) bin ich der Meinung der Beitrag sollte ins Archiv.

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 9283

Berlin_1946 schrieb:

Diesen Post finde ich im Bezug zum Thema Aufräumen super: alte Kernel deinstallieren.

Sinnvoller: >> Systempflege <<

Berlin_1946 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10867

Hallo schwarzheit

dpkg --list | grep "^rc"

Das finde ich so interessant. Habe ich noch nicht als Tipp im Wiki gefunden.

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 9283

Braucht es explizit auch nicht. Weil wenn man alte Kernel mit --purge entfernt bleiben keine Konfigurationen (rc) zurück. Und wenn doch dann putzt man mit purge ~c gleich alles auch Konfigs von deinstallierten Programmen (aber nichts aus /home). Und all das steht in dem Artikel.

Berlin_1946 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10867

@schwarzheit,

was ist dein Vorschlag?

Archiv oder nicht Archiv, das ist die Frage (an die Literatur angelehnt) ☺

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 9283

Archiv und / oder Verlinkung zu Systempflege.

Ruth-Wies

Avatar von Ruth-Wies

Anmeldungsdatum:
12. April 2023

Beiträge: 1011

Wohnort: im Exil ;(

Versuch einer Erklärung:

dpkg -l 'linux-[ihs]*'

Mit dpkg -l werden alle Pakete angezeigt, die auf das Suchmuster 'linux-[ihs]*' passen. Dabei stehen innerhalb der eckigen Klammern Buchstaben, die jeweils einzeln ausgewertet werden. Es wird also effektiv gesucht nach:

  • linux-i*

  • linux-h*

  • linux-s*

Das heißt auch, dass Pakete angezeigt werden können, die nicht installiert sind. Zudem enthält die Ausgabe eine Erklärung im Kopf und Spalten, die nicht benötigt werden. Daher wird im folgenden mit sed aussortiert.

| sed …

Die gesamte bisherige Ausgabe wird über die sogenannte Pipe („|“) an das nachfolgende Kommando übergeben. Die einzelnen Kommandos von sed sind in einzelne Anführungszeichen eingeschlossen und mit Semikolon („;“) voneinander getrennt.

/^ii/!d

Innerhalb von zwei Schrägstrichen wird ein Suchmuster angegeben. Es wird als erstes nach „^ii“ gesucht. Dabei steht „^“ für den Zeilenanfang und „ii“ steht innerhalb der Ausgabe von dpkg -l für den geplanten und erreichten Status einer Installation; „ii“ steht also für erfolgreich installiert. Unmittelbar nach dem zweiten Schrägstrich steht die Anweisung, was mit dem Fund gemacht werden soll. Dabei steht „!“ für nicht und „d“ für entfernen. Es werden anders ausgedrückt nur die Zeilen der erfolgreichen Installationen stehen gelassen.

/'"$(uname -r | sed "s/\([-0-9]*\)-\([^0-9]\+\)/\1/")"'/d

Hier wird wieder ein Suchmuster zwischen Schrägstrichen angewendet, allerdings diesmal entfernt (d). Das Suchmuster wurde in einfache (single quotes) und doppelte (double quotes) Anführungszeichen gepackt, damit es innerhalb der Schrägstriche funktioniert. Für die Suche wird nämlich eine Kommandosubstitution (command substitution) innerhalb eine subshell bemüht; erkennbar an „$(…)“.

uname -r zeigt die Version des installierten Kernels an, der ja nicht entfernt werden soll. Deshalb wird diese Suche auch entfernt, sprich für die weitere Verarbeitung ausgenommen. Aber die Versionsangabe enthält noch „-generic“ (früher ggf. auch „-lowlatency“). Deshalb wird die Ausgabe von uname wieder über eine Pipe an sed weitergeleitet, das mit „s“ angewiesen wird ein Suchmuster zu ersetzen. Das erste Zeichen, das auf „s“ folgt, muss also drei mal vorhanden sein; Vor und nach dem Suchmuster sowie abschließend nach dem, wodurch das Suchmuster ersetzt werden soll. Dies gilt es erst mal zu finden, sonst kann man nichts verstehen.

sed "s/\([-0-9]*\)-\([^0-9]\+\)/\1/"

Im Suchmuster sind zudem Teilmuster enthalten. Diese werden durch maskierte Klammern „\(“ bzw. „\)“ begrenzt.

Das führende „-” innerhalb der eckigen Klammer des ersten Teilmusters gibt an, dass neben den Ziffern null bis neun auch ein Minuszeichen als gültiger Fund akzepiert werden kann; Es muss aber keines dieser Zeichen enthalten sein (Was in diesem Zusammenhang aber nie der Fall sein wird). In der Ausgabe wird also zunächst nach Ziffern („\([-0-9]*\)“) gesucht und zwar beliebig viele nacheinander, wofür der Asterix („*“) steht.

Es wird eingeschränkt durch die weitere Angabe, dass auf die Ziffern ein „-“ folgt. Im nächsten Teilmuster wird durch ^ innerhalb der eckigen Klammern angegeben, dass nach dem „-“ eben keine Ziffern gesucht sind (Ist also definitiv etwas anders zu dem oben genannten „^“ für den Zeilenanfang.). Durch das maskierte Plus „\+“ wird gewährleistet, dass mindestens ein Zeichen dem Muster entsprechen muss.

Die Ersetzung folgt hier noch mal eine Besonderheit: „\1“ gibt an, dass der erste Teil des erfolgreichen Fund als Ausgabe verwendet wird. (Je nach Anzahl der Einzelmuster im Gesamtsuchmuster könnte die Zahl auch höher sein (maximal neun).)

s/^[^ ]* [^ ]* \([^ ]*\).*/\1/

… hier Erklärung einfügen …

Den Teil verstehe ich noch nicht. Aber ich weiß, was er macht. Aus den vier Spalten der Ausgabe von dpkg wird die zweite Spalte extrahiert. Für die Kernelliste ist dies wesentlich, aber für das Gesamtverständnis nachrangig.

/[0-9]/!d

Abschließend noch ein Suchmuster, das nach allen Zeilen sucht, die Ziffern enthalten, und diese werden nicht löscht. Damit sollen vermutlich Metapakete wie „linux-image-generic“ aus der Liste entfernt werden.

Was eine Umleitung in eine Datei ist, habe ich hier verlinkt. → Shell/Umleitungen (Abschnitt „Umleiten-der-Ausgabe-mit“)


Links:

Ruth-Wies

Avatar von Ruth-Wies

Anmeldungsdatum:
12. April 2023

Beiträge: 1011

Wohnort: im Exil ;(

Jetzt muss ich mal laut denken: Früher gab es auch Metapakete wie „linux-generic-lts-trusty“. Seit 16.04 gibt es Metapakete wie „linux-image-generic-hwe-16.04“. Da ein solches Metapaket Ziffern enthält, wird es im abschließenden sed-Teil nicht aussortiert. Das würde bedeuten, dass, wenn mit dem HWE-Metapaket der aktuelle Kernel zwar installiert wurde, aber über GRUB ein älterer Kernel gestartet wurde, das Metapaket dann entfernt werden könnte, was eigentlich nicht beabsichtigt ist.