Was ist Paketmanagement überhaupt? Das Betriebsystem vor dem du gerade sitzt ist in viele kleine Pakete aufgeteilt. Diese Pakete beinhalten thematisch und logisch aufgeteilt Programme, Einstellungsdateien, Bibliotheken und alles sonst z.B. Bilder, Anleitungen, etc. Typischerweise besteht ein Paket neben den zu installierenden Dateien noch aus

  • eine Beschreibung des Pakets für den Benutzer
  • Abhänigkeiten des Pakets zu anderen Paketen
  • ein ausführbares Script, welches bei der Installation nötige Änderungen vornimmt
  • ein ausführbares Script, welches beim Entfernen des Pakets nötige Änderungen vornimmt

Beispiele für den Scriptinhalt:

  • Das Anlegen/Entfernen eines Benutzers oder von Gruppen
  • Das Anlegen/Entfernen von Konfiguration für andere Programme z.B. zeitgesteurten Aufrufen
  • Das Anlegen/Entfernen eines Systemdienstes, der automatisch starten soll

GNU/Linux gibt es in sehr vielen verschiedenen Zusammenstellungen. Diese Zusammenstellungen nennen sich Distributionen. Jede Distribution hat ihre eigenen Pakete und Paketformate. Auch die Programme, die zum Installieren und Entfernen von Paketen verwendet werden unterscheiden sich stark.

Die hier folgenden Kommandos sind für Debian basierte Systeme (Debian, Ubuntu, Mint und viele weitere). Zum aktualisieren des Systems genügen die folgenden zwei Kommandos - Achtung! Bei einigen Ablegern könnten zusätzliche Maßnahmen nötig sein, immer auch die Dokumentation der jeweiligen Distribution beachten:

sudo apt-get update
sudo apt-get upgrade

und zurückgehaltene Pakete auch aktualisieren:

sudo apt-get dist-upgrade

Alternativ kann man das noch kürzere und für den Endbenutzereinsatz stabil gehaltene Kommando apt verwenden:

sudo apt full-upgrade

Bitte hier die zugehörige man page konsultieren. Es sind nicht alle Optionen, die apt-get unterstützt auch mit apt verfügbar.

Achtung! Hier gibts absolute Grundlagen für egrep, awk, xargs und Unix Pipe. Die hier vermittelten Elemente lassen sich beliebig für andere Einsätze kombineren. Dieses Unterkapitel geht davon aus, dass man bereits als root user angemeldet ist. Dies kann z.B. durch das Kommando sudo su erfolgt sein.
Schauen wir uns zuerst an, welche Pakete auf dem lokalen System installiert sind.
Alle installierten Pakete ausgeben:

 dpkg -l

Beispiel(teil)ausgabe:

ii  xserver-xorg-video-vesa       1:2.3.4-1build2     amd64               X.Org X server -- VESA display driver
rc  xserver-xorg-video-vmware     1:13.1.0-2ubuntu3   amd64               X.Org X server -- VMware display driver
ii  xsltproc                      1.1.28-2.1ubuntu0.1 amd64               XSLT 1.0 command line processor
ii  xtrans-dev                    1.3.5-1             all                 X transport library (development files)
rc  xviewer                       1.2.2+serena        amd64               Image viewer program

Wenn man sich die Liste auf einem System anschaut, das bereits eine Weile installiert ist, werden einem zwischen den Zeilen die mit ii beginnen - und installierte Pakete anzeigen, viele auffallen, die den Status rc haben. Der Status bedeutet:

  • r - remove
  • c - configuration


Will heißen: Das eigentliche Paket ist entfernt worden, die Konfiguration des Pakets aber noch vorhanden. Das sind in der Regel Einstellungsdateien und Verzeichnisse irgendwo im System. Da die noch existieren wacht der Paketmanager auch weiter über diesen Eintrag. Es könnte ja sein, das man dieses Paket doch wieder installiert.
Wann und wieso passiert das automatisch?
Immer wenn man apt-get mit remove aufruft, aber auch wenn Pakete mit autoremove entfernt werden. Um diese Hinterlassenschaften zu beseitigen - in der Mehrzahl ist das Abfall - Könnte man jeden einzelnen der betroffenen Paketnamen kopieren und mit apt-get purge aufrufen. Aber das wäre sehr langwierig und garnicht Unix-like.

 Ziel Definition: Wir wollen möglichst automatisch alle installierten, aber entfernten Paketnamen im Status
 "rc" rückstandsfrei aus dem System entfernen. Nach Möglichkeit mit nur einem Aufruf.

Beginnen wir damit erstmal nur diese Pakete auszugeben. Das Kommando egrep unterstützt mit der Option -e ein Pattern. Wer mehr wissen möchte bitte auf der man Page von egrep nachschlagen. ^rc bedeutet das die Zeile mit den Zeichen rc beginnen muss.

 STRATEGIE: Baue deine Pipe Schritt für Schritt auf.
 Kontorlliere die Einzelergebnisse, bevor du weiter gehst und das nächste Element anbaust.
Nun bauen wir eine Pipe, die die Ausgabe des ''dpkg -l''  mit der Eingabe des ''egreps''  verbindet. \\ Alle Pakete mit dem Status ''rc''  anzeigen:
 dpkg -l | egrep -e "^rc"

Die Ausgabe:

 rc  xserver-xorg-video-vmware     1:13.1.0-2ubuntu3   amd64               X.Org X server -- VMware display driver
 rc  xviewer                       1.2.2+serena        amd64               Image viewer program

Ok, schonmal alles mit 'ii' vorne ist verschwunden.
Der nächste Schritt ist: Wir wollen nur die Paketnamen, nicht den Status und auch nicht die weitere Beschreibung. Und so schneiden wir das Feld mit dem Paketnamen heraus:

dpkg -l | egrep -e „^rc“ | awk '{print $2}'

Dazu ein paar Worte. Das Kommado awk ist der Urvater aller Parsersprachen unter Unix. Noch älter als Perl. Es bietet neben zahlreichen weiteren Funktionen eine einfache Funktion um Leerzeichen/Tab getrennte Felder aus einer Zeichenkette zu lesen. Das machen wir uns hier zu nutze. print $2 übernimmt nur das zweite Feld aus jeder Zeile in die Ausgabe. An dieser Stelle sind die Paketnamen. Da diese keine Leerzeichen enthalten dürfen ist dies eine sichere Methde.
Die Ausgabe:

 xserver-xorg-video-vmware
 xviewer

Fast am Ziel!
Und so nutzen wir diese Liste als Optionen für das Kommando apt-get –yes purge. Damit entledigen wir uns auf einen Schlag von allen diesen Überbleibseln.

 dpkg -l | egrep -e "^rc" | awk '{print $2}' | xargs apt-get --yes purge

Ok, hier gleich zwei Dinge, die Erklärung brauchen.

  1. xargs - ist ein Kommando, das von der Eingabe liest und alle Zeilen als Optionen an ein weiteres Kommando anreiht. Das Kommando, das xargs aufruft ist apt-get –yes purge
  2. apt-get –yes purge - Entfernt die Pakete rückstandsfrei. Allerdings fragt apt-get vor der Ausführung den User um Bestätigung. Da apt-get hier von xargs aufgerufen wird und nicht vom User direkt, kann man keine Bestätigung geben. Dehalb muss die Option –yes angegeben werden, um alle Fragen des apt-get mit „Yes=Ja“ zu beantworten. Damit läuft die Reinigung schnell durch.

WARNUNG! WARNUNG! Kleine Änderung sehr große Wirkung! Wer sein System komplett löschen möchte, sollte als Pattern für egrep nicht „^rc“ sondern „^ii“ angeben oder das egrep ganz weglassen. Dann löscht diese Kommandokette das komplette System. Also an der Stelle bitte vorsichtig sein.
Für Nebenwirkungen übernehme ich keine Haftung.

Es gibt eine etwas einfachere Alternative das gleiche mit dem Kommando aptitude zu erreichen. Das Kommando aptitude ist ein textbasierter Paketmanager, der auch interaktiv benutzt werden kann - anders als apt oder apt-get, die rein nur Optionen annehmen und verarbeiten, kann aptitude mit dem Benutzer in einen ineraktiven Dialog gehen - ähnlich wie „Norton Commander“ im Vergleich zu DOS Kommandos. Aber aptitude kann auch Optionen entgegennehmen. Eine interessante ist search

aptitude search '~i'

zeigt alle installierten Pakete im System an.

Gekürzte Beispielausgabe - Die Ausgabe ist sehr breit.:

klaus@klaus-Standard-PC-Q35-ICH9-2009: ~$aptitude search '~i'
i   accountsservice                                                             - Abfragen und Ändern von Informationen über Benutzerkonten                             
i   acl                                                                         - Zugriffskontrollliste - Dienstprogramme                                               
i   acpi-support                                                                - Skripte zur Verwaltung von ACPI-Ereignissen                                           
i   acpid                                                                       - Daemon für die Behandlung von ACPI-Ereignissen                                        
i   add-apt-key                                                                 - Befehlszeilen-Werkzeug um GPG-Schlüssel zum APT-Schlüsselbund hinzuzufügen            
i   adduser                                                                     - Erstellt und entfernt Benutzer und Gruppen                                            
[...]
aptitude search '~c'
<code bash>
klaus@klaus-Standard-PC-Q35-ICH9-2009: ~$aptitude search '~c'
rc  linux-headers-5.4.0-74                                                      - Header files related to Linux kernel version 5.4.0                                    
rc  linux-headers-5.4.0-74-generic                                              - Linux kernel headers for version 5.4.0 on 64 bit x86 SMP                              
rc  linux-image-5.4.0-74-generic                                                - Signed kernel image generic                                                           
rc  linux-modules-5.4.0-74-generic                                              - Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP                        
rc  linux-modules-extra-5.4.0-74-generic                                        - Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP

zeigt alle Pakete, die entfernt wurden (remove), deren Konfigurationsdateien aber noch im System installiert sind (configure). Diese Artefakte sammeln sich über die Zeit im System an und können zu Problemen bei größeren Software Änderungen führen, wie oben beschrieben.

Die Ausgabe entspricht diesem Teil der Kommandopipe von oben:

 dpkg -l | egrep -e "^rc"

Das ist ja schon fast so, wie es sein soll. Als nächstes müssen wir eine Möglichkeit finden, nur den Paketnamen als Ergebnis angezeigt zu bekommen. Ein blick in die man aptitude page sagt uns, die Option -F erlaubt es, ein Ausgabeformat zu setzen. Das Studium der für die Option F gültigen Werte zeigt, dass mit „%p“ der Paketname ausgegeben wird - genau was wir brauchen.

aptitude search '~c' -F '%p'

Ausgabe:

klaus@klaus-Standard-PC-Q35-ICH9-2009: ~$aptitude search '~c' -F '%p'
linux-headers-5.4.0-74                                                                                                                                                  
linux-headers-5.4.0-74-generic                                                                                                                                          
linux-image-5.4.0-74-generic                                                                                                                                            
linux-modules-5.4.0-74-generic                                                                                                                                          
linux-modules-extra-5.4.0-74-generic                                                                                                                                    
klaus@klaus-Standard-PC-Q35-ICH9-2009: ~$

Das ersetzt den folgenden Teil unserer Kommandoreihe:

 dpkg -l | egrep -e "^rc" | awk '{print $2}'

Den letzten Teil - die Ausführung des apt Kommandos mit den ausgegebenen Paketnamen als Option können wir nicht ersetzen, aber einfach von oben übernehmen.

Damit sieht die Kette der Kommandos nun so aus:

aptitude search '~c' -F '%p' | xargs apt-get --yes purge

WARNUNG! WARNUNG! Auch hier gilt: Kleine Änderung sehr große Wirkung! Wer sein System komplett löschen möchte, sollte als Pattern für den aptitude search nicht „~c“ sondern „~i“ angeben. Dann löscht diese Kommandokette das komplette System. Also an der Stelle bitte sehr vorsichtig sein.
Für Nebenwirkungen übernehme ich keine Haftung.

  • klaren/klarensshellkochbuch/paketmanagement.txt
  • Zuletzt geändert: 2021/11/04 22:32
  • von klaren