Paket Management
Ein Debian basiertes System (Debian, Ubuntu, Kubuntu,…, Mint) aktualisieren:
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.
Logfiles beobachten
Den kennt jeder:
tail -f /pfad/zur/Logdatei
Konkret:
tail -f /var/log/syslog
Verlassen mit Strg+C
Aber besser ist:
less /var/log/syslog
Und dann Shift+F drücken. Mit Strg+C kommt man zurück in den Textviewer um z.B. zurück zu scrollen oder zu Suchen. Mit „q“ kann man den Textviewer verlassen.
Ein Kommando in Intervallen starten
Das ist z.B. nützlich bei Aktivtäten die länger dauern, denen man mit einem (oder mehreren) Kommando(s) den Status abfragen kann. Beispiel: Das Kopieren einer großen Datei. Wir stellen uns vor, das Kopieren läuf bereits. Wir wollen aber sehen wie groß die Zieldatei schon ist. Das geht z.B. so:
while true ; do ls -l /pfad/zur/Datei ; sleep 1 ; done
Mit diesem Konstrukt wird einmal die Sekunde ein ls -l auf eine Zieldatei gemacht. Das läßt sich aber mit jedem beliebigen Kommando machen.
Nützliche Zusätze - den Screen mit dem Kommando clear löschen, vor der Ausgabe:
while true ; do clear ; ls -l /pfad/zur/Datei ; sleep 1 ; done
Nützliches, wenn die Platte voll ist...
Soll ja schonmal vorkommen, das das kleine System mal seine Platte voll gemacht hat. Dann sollte man sich auf die Suche machen, wo die großen Dateien liegen.
Methode 1: „find ist dein Freund.“
Zeige alle Dateien größer, gleich 100 Megabyte.
find /start/verzeichnis -size +100M -ls
Methode 2: „du it.“
Das Kommando du - für Disk Usage - Es zeigt die Größe, die Verzeichnisse mit den darin enthaltenen Verzeichnissen und Dateien einnehmen:
du /start/verzeichnis
Das Ergebnis ist noch nicht so lesbar. Es zeigt die Anzahl Bytes an:
[...] 84772 /home/klaus/Bilder/2015-05-05 601832 /home/klaus/Bilder/2015-05-12 32828 /home/klaus/Bilder/2015-05-22 21176 /home/klaus/Bilder/Projekt 372 /home/klaus/Bilder/Webcam 2276 /home/klaus/Bilder/2015-08-09 8750516 /home/klaus/Bilder/
Nehmen wir noch die Option "-h" (human readable) dazu:
du -h /start/verzeichnis
Aha, schon besser…
[...] 83M /home/klaus/Bilder/2015-05-05 588M /home/klaus/Bilder/2015-05-12 33M /home/klaus/Bilder/2015-05-22 21M /home/klaus/Bilder/Projekt 372K /home/klaus/Bilder/Webcam 2,3M /home/klaus/Bilder/2015-08-09 8,4G /home/klaus/Bilder/
Und? Wo ist das größte Verzeichnis und die größte Datei? Nicht so einfach bei 100 Zeilen.. aber damit gehts:
du -h /start/verzeichnis | sort -h
Aha, wunderbar. Da haben wir ja die Übeltäter.
[...] 17M /home/klaus/Bilder/2015-09-24 21M /home/klaus/Bilder/2015-11-02 21M /home/klaus/Bilder/Projekt 33M /home/klaus/Bilder/2015-05-22 40M /home/klaus/Bilder/2015-10-30 83M /home/klaus/Bilder/2015-05-05 248M /home/klaus/Bilder/2015-09-17 329M /home/klaus/Bilder/2015-07-12 588M /home/klaus/Bilder/2015-05-12 8,4G /home/klaus/Bilder/
Das Kommando sort
sortiert Zeilen nach einstellbaren Kriterien. Hier mit der Option -h
sortiert es auf human readable Größen. Heißt es beachtet die Größenordnngen M, G, T etc. - 1G ist mehr als 100M. Sort kann noch viel mehr. Wenn man es umgekehrt sortiert haben möchte, fügt man die Option „-r“ für reverse ein. Man kann das Feld angeben, nach dem sortiert wird. Alles erklärt in der man Page.
Sagen wir nun, wir möchten nur die Top 5 in der Ausgabe haben.. Dann machen wir einfach noch ein tail
dazu..
du -h /start/verzeichnis | sort -h | tail -5''
Ergebnis - nur die letzten 5 Zeilen der Ausgabe erscheinen:
83M /home/klaus/Bilder/2015-05-05 248M /home/klaus/Bilder/2015-09-17 329M /home/klaus/Bilder/2015-07-12 588M /home/klaus/Bilder/2015-05-12 8,4G /home/klaus/Bilder/
tail
ist die Universalschere für das Ende eines Textstroms. Man gibt als Option an, wieviele Zeilen Ausgabe vom Ende noch herauskommen sollen. Die Option -100 gibt z.B. bis zu 100 Zeilen aus. Das ist immer mal nützlich wo man nicht weiß wieviel da ansonsten kommt.
Und nun ein Beispiel, wie man einfache Dinge kompliziert machen kann. Wir möchten das Startverzeichnis nicht in der Ausgabe haben. Könnte man auf die Idee kommen es so zu machen: „Erst schneiden wir die letzen 6 Zeilen aus und dann nehmen wir davon die obersten 5 Zeilen.“
du -h /start/verzeichnis | sort -h | tail -6 | head -5
Das Kommando ''head'' ist sozusagen das Gegenteil zu ''tail''. Man kann wie oben vorgehen um bestimmte Bereiche einer Textdatei in die Ausgabe zu bekommen. Ist aber unschön. ''head'' funktioniert genau wie ''tail''. Also mit der Anzahl Zeilen als Option, nur dieses Mal von Oben gezählt. Eine Option ''-f'' gibt es allerdings nicht bei ''head''. Dateien werden in der Regel nach Unten verlängert, nicht nach Oben. \\ Also die Kombi ''tail'' +''head'' geht, aber… vielleicht wäre etwas anderes besser… Denn man erinnert sich nach 3 Monaten wohl möglich nur noch ungefähr dran, was das sollte. Und die jetzige Liste bezieht nicht die Dateien ein, die im Startverzeichnis selbst liegen. Die wurden nur dem Startverzeichnis hinzugezählt. \\ Also vielleicht besser so:
du -h /start/verzeichnis/* | sort -h | tail -5
Man beachte das *
hinter dem Verzeichnis. Der letzte Schrägstrich vor dem *
ist dabei wichtig. Dies weist die Unix Shell an alle Dateien und Verzeichnisse unter dem Startverzeichnis an das Kommando du zu übergeben. Das Kommando sieht die Optionen also so:
du -h /start/verzeichnis/unterverzeichnis1 /start/verzeichnis/verzeichnis2 /start/verzeichnis/dateiA
Und so geht das weiter. du
zählt dann für jedes dieser Einzelverzeichnisse die Größe.
Und Tataa, da verbergen sich doch tatsächlich die größten Dateien - doppelt und dreifach so groß wie das größte Verzeichnis:
329M /home/klaus/Bilder/2015-07-12 588M /home/klaus/Bilder/2015-05-12 1,1G /home/klaus/Bilder/IMGP1796.MOV 1,4G /home/klaus/Bilder/FlugMitHeartlakeAirlines.MOV 1,4G /home/klaus/Bilder/Petriheil.MOV
Apropos: das Kommando du
zeigt rekursiv die Größe aller Verzeichnisse an. Wenn man nur die oberste Ebene sehen möchte ist die Option -s
(summary) nützlich (man kann die Optionen anreihen, so lange sie keinen zweiten Parameter erfordern):
du -sh /start/verzeichnis/* | sort -h | tail -5