Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
29.07.2021, 11:12:42

.
Einloggen mit Benutzername, Passwort und Sitzungslänge

Mitglieder
  • Mitglieder insgesamt: 25789
  • Letzte: Trobilo3
Statistiken
  • Beiträge insgesamt: 747356
  • Themen insgesamt: 60112
  • Heute online: 350
  • Am meisten online: 2287
  • (22.01.2020, 19:20:24)
Benutzer Online

Autor Thema:  Alte Kernel-Versionen mit nur einem Befehl entfernen  (Gelesen 80352 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Blindenhund

  • Gast
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #15 am: 03.07.2012, 08:04:40 »
Warst Du vorher mit einem reinen Debian da? Scheint so weil die Ausgaben differieren. Vergleiche doch mal die dpkg-Versionen - eventuell liegt da die Erklärung.

Ich habe den Befehl nämlich auch seit Ubu benutzt. In Ubu, Mint und LMDE - problemlos.

Sauron

  • Gast
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #16 am: 03.07.2012, 08:18:03 »
Blindenhund: Am vermuteten Restpuffer kann es nicht legen. Der crizzly hat den selben Output wie ich unter debian/LMDE! Definitiv scheint hier der Streameditor sed die einzelnenen Distris unterschiedlich zu behandeln. Warum/wo und weshalb kann ich nicht sagen. Die Frage wird bleiben: warum so und nicht so ?

Sauron

  • Gast
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #17 am: 03.07.2012, 08:28:38 »
OK, gehen wir den Befehl vom Anfang bis Ende durch ? ja ? Denn auch ich bin an einer Lösung für Ubu-wie-auch-Debian-Distris-interessiert
Macht hier jemand mit ?
« Letzte Änderung: 03.07.2012, 09:11:42 von Sauron »

Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #18 am: 03.07.2012, 10:25:37 »
OK, versuchen wir es mal. Ich komme erst mal so weit:
Ich nehme an (korrigiert mich, wenn ich falsch liege),
dpkg -l 'linux-*'listet erst mal alle installierten Pakete auf, die mit der Phrase "linux-" beginnen. Ich nehme mal an, dass der Aufruf von sed nach dem | dazu dient, das, was für den Platzhalter * hinter 'linux-' stehen könnte, näher zu bestimmen. Aber da setzt es bei mir schon aus. Ich weiß z.B. schon nicht, was der senkrechte Strich | genau macht.

xargssorgt dann, so weit ich das verstehe, dafür, dass der Befehl
sudo apt-get -y purgeauf das angewendet wird, was mit dem Aufruf von sed gefunden wurde.

Dazwischen ist es mir zu kryptisch.

Ich habe allerdings den Verdacht, dass das, was da mit sed herausgefischt wird, so allgemein formuliert ist, dass der aktuelle Kernel nur deshalb nicht entfernt wird, weil er entweder geladen ist, oder, so lange er aktuell ist, anders heißt und deshalb nicht zu den Suchkriterien passt.

Edit: Wäre es vielleicht möglich, die Ausgabe des ersten Teils in eine Textdatei umzuleiten, um sich das mal anzusehen? Etwa so:
sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' > kernel_liste.txt(Achtung! Dieser Befehl ist Bestandteil einer Frage an das Forum und sollte nicht ungeprüft in ein Terminal eingegeben werden.)
« Letzte Änderung: 03.07.2012, 10:55:33 von Uli Gebhardt »

Sauron

  • Gast
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #19 am: 03.07.2012, 10:58:36 »
Uli Du hast sehr gut dazu  gelernt. Der Vorder- und der abschließende Teil des sed-Prozesses sind aus meiner Sicht auch einfach zu verstehen. Nun geht es darum den Mittelteil zu obsobieren, in geeigente Variablen zu packen um dann schlussendlich zum Endresultat zu führen. Ich selber habe keine Zeit solche (sorry) Kinkerlitzchen tatkräftig zu unterstützen, denn einen Kernel zu deinstallieren übersteigt das eigentliche Thema.  Gleichwohl rumse ich tatkräftig mit, wenn ihr "jungen Hirsche" Taten von mir braucht.  ;D ;D

Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #20 am: 03.07.2012, 18:18:39 »
Ein kleines Stück bin ich weiter:
sudo dpkg -l 'linux-*' | sed '/^ii/!d'

liefert mir eine Liste der Pakete, deren Namen mit linux beginnt und die am Anfang der jeweiligen Zeile mit ii (installiert) gekennzeichnet sind. Was allerdings das !d da soll, weiß ich nicht und bitte um eine kurze Erklärung. Ich mach später weiter.

Edit: Ich wurde gerade freundlich darauf hingewiesen, dass es auch User gibt, die sich hässliche Themes einstellen  ;D , auf denen man die blaue Schrift nicht lesen kann. Daher habe ich die Hervorhebungen geändert.
« Letzte Änderung: 03.07.2012, 20:01:26 von Uli Gebhardt »

Susi

  • Gast
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #21 am: 03.07.2012, 20:00:57 »
! negiert das Nebenstehene, d steht für delete.  "!d" heißt also: "nicht löschen" (den Rest aber schon).

Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #22 am: 03.07.2012, 20:04:27 »
Danke! Mit anderen Worten, das !d steht dann quasi für den Kram, der dann davor kommt. Es wird quasi zeilenweise alles gelöscht, was nicht mit ii anfängt. Den Befehl uname -r kenne ich. Mal gucken, was ich noch herausfinde.
« Letzte Änderung: 03.07.2012, 20:17:27 von Uli Gebhardt »

bst

  • ***
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #23 am: 04.07.2012, 12:00:16 »
Hi und FWIW,

sed führt hier mehrere durch ; voneinander getrennte Befehle aus:

/^ii/!d
löscht alle Zeilen die nicht mit ii beginnen. Der 'Unterbefehl' innerhalb des sed-Befehls:

uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/"
bestimmt den aktuellen Kernel und löscht daraus die Teile die mit einem - beginnen hinter denen keine Ziffer steht

/'"$(uname ...)"'/d
löscht dann diese eine Zeile, in der Hoffnung damit den aktuellen Kernel zu retten ;-)

s/^[^ ]* [^ ]* \([^ ]*\).*/\1/
löscht aus der durch Leerzeichen getrennten Zeile alles bis auf deren 3. Spalte.

/[0-9]/!d
löscht alle Zeilen in denen keine Ziffer vorkommt.

Übrigens, da dpkg -l 'linux-*'  wohl zu viele Pakete liefern kann würde ich da zur Sicherheit einen grep zufügen, so in der Art:

dpkg -l 'linux-*' | grep '^ii *linux-\(headers|image\)'
Und, du hast schon auch gesehen dass Sauron das ganz anders ansetzt, mit awk, grep und cut??

Das ist M.E. viel einfacher zu verstehen.

HTH, Bernd

Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #24 am: 04.07.2012, 12:26:19 »
Naja, ich will erst mal das hier verstehen, dann werde ich mich dem Rest widmen. Mir geht es hier ja auch um das Verstehen selbst, nicht um die Ausführung. Ich muss mich noch etwas eingehender mit der Benutzung des Streamingeditors befassen, denn die Eingabe der Ausdrücke hab ich noch nicht ganz durchschaut. Deine Liste hat mir allerdings einiges bestätigt, was ich schon geahnt habe. Vielen Dank dafür. :)

Eine Frage habe ich allerdings zu
/'"$(uname ...)"'/d
Das /d der Befehl zum Löschen ist, ist mir klar. Mit der restlichen Syntax komme ich nur nicht ganz klar. Ich stelle mal einfach Fragen:

  • Bedeutet der Einschluss in ' ' , dass es sich um einen regulären Ausdruck handelt?
  • Bedeutet der Einschluss in " " , dass dazwischen ein String steht?
  • Bedeutet das $( ) , dass der Inhalt der Klammern als Befehl ausgeführt werden und das Ergebnis quasi an diese Stelle zurückgegeben werden soll?

Falls mir jemand das kurz bestätigen bzw. berichtigen könnte, wäre mir schon weitergeholfen.


bst

  • ***
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #25 am: 04.07.2012, 13:47:37 »
zu 1. und 2. nein. Es geht da um Quoting, siehe: http://www-user.tu-chemnitz.de/~hot/unix_linux_werkzeugkasten/bash.html#quot

In Sed ist  ein RegExp in einer Adressangabe erlaubt /regexp/ matched Zeilen die den regulären Ausdruck regexp matchen.

zu 3. Ja.

Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #26 am: 04.07.2012, 14:32:27 »
Müsste es dann nicht durch die äußere, starke Quotierung mit ' ' dazu kommen, dass das " " nicht mehr als Quotierung interpretiert wird, sondern als bloßes Zeichen und somit alles, was dazwischen steht ebenfalls als Reihe von einfachen Zeichen gilt?

bst

  • ***
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #27 am: 04.07.2012, 15:32:26 »
Hi,

da gibt es keine äußere Quotierung. Das ist ein zusammengesetzter String wie der hier:

echo '1>2'"$(pwd)"'3<4'
cu, Bernd

Sauron

  • Gast
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #28 am: 10.07.2012, 17:27:54 »
Ich habe den Thread nochmal hochgeholt, weil ich nun nach heutigem Kernelupgrade die Löschbefehle reell testen kann.

Installiert ist:
Sauron:~ $ dpkg -l linux-image-*
Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Vollständig Löschen/Halten
| Status=Nicht/Installiert/Config/U=Entpackt/halb konFiguriert/
         Halb installiert/Trigger erWartet/Trigger anhängig
|/ Fehler?=(kein)/R=Neuinstallation notwendig (Status, Fehler: GROSS=schlecht)
||/ Name                         Version                      Beschreibung
+++-============================-============================-========================================================================
un  linux-image-2.6-amd64        <keine>                      (keine Beschreibung vorhanden)
un  linux-image-2.6-openvz-amd64 <keine>                      (keine Beschreibung vorhanden)
un  linux-image-2.6-vserver-amd6 <keine>                      (keine Beschreibung vorhanden)
un  linux-image-2.6-xen-amd64    <keine>                      (keine Beschreibung vorhanden)
ii  linux-image-3.2.0-2-amd64    3.2.20-1                     Linux 3.2 for 64-bit PCs
ii  linux-image-3.2.0-3-amd64    3.2.21-3                     Linux 3.2 for 64-bit PCs
ii  linux-image-amd64            3.2+45                       Linux for 64-bit PCs (meta-package)

Deinstalliert werden soll automatisch der alte Kernel.

Löschbefehl 1
Sauron:~ $ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|xargs apt-get -s purge
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.       
Statusinformationen werden eingelesen.... Fertig
Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt:
  alien gstreamer0.10-fluendo-mp3 libcdt4 libelf1 libgraph4 libgvc5 liboil0.3 libpathplan4 librpm3 librpmbuild3 librpmio3 librpmsign1
  libxdot4 libxine1-x lsb-security pax rpm rpm-common rpm2cpio
Verwenden Sie »apt-get autoremove«, um sie zu entfernen.
Die folgenden Pakete werden ENTFERNT:
  build-essential* g++* g++-4.7* googleearth* kernel-package* libc6-dev* libstdc++6-4.7-dev* linux-image-3.2.0-2-amd64*
  linux-image-3.2.0-3-amd64* linux-image-amd64* linux-libc-dev* lsb-core*
0 aktualisiert, 0 neu installiert, 12 zu entfernen und 0 nicht aktualisiert.
Purg kernel-package [12.036+nmu2]
Purg build-essential [11.5]
Purg g++ [4:4.7.1-1]
Purg g++-4.7 [4.7.1-2] [libstdc++6-4.7-dev:amd64 ]
Purg libstdc++6-4.7-dev [4.7.1-2]
Purg googleearth [6.0.3.2197+0.7.0-1]
Purg lsb-core [4.1+Debian7]
Purg libc6-dev [2.13-33]
Purg linux-image-3.2.0-2-amd64 [3.2.20-1]
Purg linux-image-amd64 [3.2+45]
Purg linux-image-3.2.0-3-amd64 [3.2.21-3]
Purg linux-libc-dev [3.2.21-3]
Sauron:~ $

Löschbefehl 2
Sauron:~ $ dpkg -l linux-image-* | awk '/^ii/{print $2}' | egrep `uname -r | cut -f1,2 -d"-"` | egrep [0-9] | xargs apt-get -s purge
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.       
Statusinformationen werden eingelesen.... Fertig
Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt:
  gstreamer0.10-fluendo-mp3 libcdt4 libgraph4 libgvc5 liboil0.3 libpathplan4 libxdot4 libxine1-x
Verwenden Sie »apt-get autoremove«, um sie zu entfernen.
Die folgenden Pakete werden ENTFERNT:
  linux-image-3.2.0-2-amd64*
0 aktualisiert, 0 neu installiert, 1 zu entfernen und 0 nicht aktualisiert.
Purg linux-image-3.2.0-2-amd64 [3.2.20-1]
Sauron:~ $
Unter Debian funktioniert demnach nur der zweite Löschbefehl.

Ahtan

  • Gast
Re: Alte Kernel-Versionen mit nur einem Befehl entfernen
« Antwort #29 am: 19.07.2012, 07:47:10 »
...
Möchte man auf zukünftige Versionen des Kernels beim System-Update nicht verzichten, muß man diesen Befehl im Terminal ausführen: sudo apt-get install --yes linux-generic linux-headers-generic linux-image-generic

Ich habe eine Frage dazu:

Bist du sicher das durch diesen Befehl wieder Kernel-Updates im Update-Manager angeboten werden?
Ich verstehe es so, das man dadurch nur manuell das Kernel-Update anstoßen kann.