Paketmanagement
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.
Unix Pipe im Einsatz - Aufräumkommando
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
- removec
- 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.
xargs
- ist ein Kommando, das von der Eingabe liest und alle Zeilen als Optionen an ein weiteres Kommando anreiht. Das Kommando, das xargs aufruft istapt-get –yes purge
apt-get –yes purge
- Entfernt die Pakete rückstandsfrei. Allerdings fragt apt-get vor der Ausführung den User um Bestätigung. Daapt-get
hier vonxargs
aufgerufen wird und nicht vom User direkt, kann man keine Bestätigung geben. Dehalb muss die Option–yes
angegeben werden, um alle Fragen desapt-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.
Mit aptitude das gleiche tun
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.