Wie können Sie verfolgen, welche Pakete unter Ubuntu (Linux) installiert wurden?

38

(Diese Frage ist 10458 sehr ähnlich . Es wurde vorgeschlagen, dass Fedora und Ubuntu / Debian unterschiedlich genug sind, um unterschiedliche Antworten zu rechtfertigen.)

Da ich jedes Ubuntu-Setup verwende, installiere ich nach und nach eine Reihe von Paketen über die Grundinstallation hinaus. Wenn ich eine Neuinstallation vornehme oder einen neuen Computer installieren muss, möchte ich in der Regel diese spezifischen Pakete neu installieren und dies schnell erledigen, um mit minimalem Aufwand wieder arbeiten zu können. Soweit ich gesehen habe apt-get, können mir alle Paketmanager ( aptitudeund synaptic) mitteilen, welche Pakete installiert sind, und sie haben alle Protokolle (wenn auch für jedes Tool unterschiedliche, was ein Aufwand ist). Aber keiner von ihnen kann mir sagen, welche Pakete ich habeinstalliert, im Gegensatz zu ihren Abhängigkeiten oder System-Updates. Sogar die Protokolle sind schwierig, da ich nicht ganz sicher bin, was ich daraus extrahieren oder wie ich sie integrieren soll (im Fall der verschiedenen Tools der apt-Familie). Dies bedeutet, dass ich nicht sicher bin, wie ich diese Liste bei jeder Neuinstallation oder auch nur bei einem Backup neu erstellen soll.

Ich erwarte nicht unbedingt, dass eines der Tools dies für mich erledigt, aber wenn dies nicht der Fall ist, suche ich nach Problemumgehungen. Sogar nach Mustern zu suchen, nach guten Faustregeln oder einer klaren Vorstellung davon, was genau protokolliert wird, wäre nützlich. Vielleicht gibt es hier keine "beste Antwort", aber gute wären sehr hilfreich.


Die meisten der folgenden Antworten geben einen ungefähren Überblick über das, wonach ich suche, und sind bis zu einem gewissen Grad nützlich. Das gewählte ist dasjenige, das einer halbwegs automatischen Neuinstallation meiner Werkzeuge auf einem neuen System am nächsten kommt, selbst mit all seinen Vorbehalten.

Quark
quelle
Es ist unwahrscheinlich, dass Sie eine gemeinsame Antwort für alle Linux-Distributionen erhalten. Die Paketverwaltung ist ein großer Teil dessen, was verschiedene Linux-Distributionen auszeichnet.
Telemachus
Telemachos - Richtig. Und es kann sinnvoll sein, dies in zwei Fragen aufzuteilen. Aber es schien eine ziemlich spezielle Frage zu sein, und ich benutze beide Systeme, um sie nicht zu sehr im Voraus einzugrenzen. Es sieht so aus, als ob die meisten Antworten hier für dpkg / apt sind, daher kann eine separate Frage für rpm / yum sinnvoll sein.
Quark
Wechseln Sie zu NixOS :) (nur Trolling).
Alexey

Antworten:

31

Auf jedem Debian-basierten Rechner ist dies eine übliche Methode, um einen Paketsatz zu duplizieren. Auf der alten Maschine:

dpkg --get-selections "*" > my_favorite_packages

Kopieren Sie die Datei my_favorite_packagesauf den neuen Computer (ein USB-Stick ist eine gute Option, scpfunktioniert aber auch einwandfrei). Führen Sie dann diese Sequenz aus (mit Root-Rechten):

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

Dadurch erhalten Sie nicht nur die Pakete, die Sie installiert haben. Es werden auch ihre Abhängigkeiten usw. angezeigt. Wenn die Repositorys zwischen den beiden Computern unterschiedlich sind, sind alle Wetten deaktiviert.

Was die Protokolle angeht, apt-getbehalten Sie ein Protokoll bei /var/log/apt/history.log(danke an Tshepang für die Aktualisierung in einem Kommentar). dpkgdoes (at /var/log/dpkg.log), aber es ist bekanntermaßen schwer zu analysieren und kann nur mit root-Rechten gelesen werden. aptitudehat eine an /var/log/aptitudeund Sie können mit regulären Benutzerrechten darin blättern.

Soweit ich das beurteilen kann, haben Sie Recht, dass keines dieser Protokolle genau nachverfolgt, was Sie im Gegensatz zu automatisch installierten Abhängigkeiten installiert haben. Sie können diese Informationen jedoch aus einer aptitudeSuche abrufen. Suchen Sie nach allen installierten Paketen, die ebenfalls automatisch installiert wurden:

aptitude search '~i ~M'

Wenn Sie nur die von Ihnen installierten (nicht die automatischen Abhängigkeiten) möchten , negieren Sie Folgendes ~M:

aptitude search '~i !~M'

Wenn Sie dies so formatieren möchten, dass Sie nur die Namen der Pakete und das Wort "install" haben, aptitudekönnen Sie dies auch tun. Auf diese Weise erhalten Sie eine Liste, an die Sie füttern können dpkg --get-selections:

aptitude search '~i !~M' -F "%p install"

(Ich habe nichts auf RedHat- oder RedHat-basierten Systemen. Entschuldigung. Es gibt wirklich keine Antwort für Linux per se, da die Paketverwaltung einen großen Teil dessen ausmacht, was verschiedene Distributionen unterscheidet .)

Telemachus
quelle
Es scheint, als ob eine Kombination aus Ihrem und Ludwigs Rat den Trick machen könnte: aptitude kann ein Skript generieren, das an dpkg weitergeleitet wird, so dass dies automatisierbar ist, was ein schwerwiegender Gewinn ist. Und wenn man es auf dem Vanilleautomaten macht, ist der Unterschied in den Listen nahe genug an dem, wonach ich verlange, um praktisch nützlich zu sein.
Quark
3
Beachten Sie, dass APT nun ein Protokoll in „/var/log/apt/history.log“ hält, und wird verwendet , um apt-get, synapticund aptitude(soweit ich gesehen habe). Dies ist seit Anfang 2010.
Tshepang
Die dpkg.logAussagen scheinen in Ubuntu 14.04 nicht wahr zu sein, da jeder Benutzer meine Auswahl leicht treffen kann, nicht trivial, aber nicht zu schwierig. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Steve Buzonas
Eigentlich merke ich, dass es nicht so einfach ist, wie ich anfangs dachte, der Fehler im vorherigen awk-Skript kümmert sich nicht um deinstallierte Pakete. Das Folgende awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -utut.
Steve Buzonas
7

Verwenden Sie dpkg -l '*' > jaunty.originalalle installierten Pakete auf einem frisch installierten System remeber.

Nachdem Sie alle Ihre zusätzlichen Pakete installiert haben, tun dpkg -l '*' > mysystem.2009017.

Die zusätzlichen Pakete sind nur der Unterschied: diff jaunty.original mysystem.2009017

Ludwig Weinzierl
quelle
3
Die Grundidee ist stark: Verwenden Sie die Befehlszeile, um die Liste der derzeit installierten Anwendungen zu sichern, und verwenden Sie die Befehlszeile, um diese Pakete auf einem neuen Computer zu installieren. Sie können mit dem Ansatz ziemlich kreativ und spezifisch werden.
pcapademic
1
Ich bevorzuge dpkg --get-Auswahl
CesarB
Dadurch werden die von mir hinzugefügten Pakete zwar nicht von ihren Abhängigkeiten getrennt, es wird jedoch auf jeden Fall eine nützliche Liste erstellt.
Quark
3

Aptitude kann das eigentlich ganz gut. Aptitude weiß, wann etwas von Hand oder in Abhängigkeit installiert wurde, und Sie können es anweisen, Dinge zu entfernen, die nicht mehr benötigt werden und nur installiert wurden, weil etwas anderes davon abhing, und Ihr System so klein wie möglich zu halten.

Es gibt eine Handvoll Pakete, die eine Ubuntu-Installation ausmachen, Ubuntu-Minimal, Ubuntu-Desktop, Ubuntu-Server und so weiter. Wenn Sie Aptitude anweisen, diese als manuell installiert zu markieren und alles andere zu entfernen, erhalten Sie die geringstmögliche Anzahl an Paketen.

Ich erkläre , wie das alles in meinem Blog in zwei Beiträgen zu tun: ein Debian GNU / Linux Bereinigen und ein Debian GNU / Linux Aufräumen (oder Ubuntu), Reprise . Kurz gesagt, die Antwort, die Sie suchen, lautet:

aptitude search ~i | grep -v "i A"

Als ich das letzte Mal damit gearbeitet habe, wenn Sie apt-get verwendet haben, hat es nicht funktioniert. Deshalb empfehle ich aptitude immer und so weit ich weiß, lehnt Debian apt-get zugunsten von aptitude ab.

Ich weiß nicht, wie ich das mit Fedora machen soll, und Sie sollten sich wahrscheinlich in eine andere Frage unterteilen. Fedora und Ubuntu sind unterschiedliche Betriebssysteme und sollten als solche behandelt werden (auch wenn sie ihren Kernel und einige andere Dinge teilen).

pupeno
quelle
2
Ich denke, dass Sie diese Informationen erhalten können, ohne sie zu benötigen grep: aptitude search '~i !~M'sollten den Trick machen.
Telemachus
1
Auch apt-getist nicht veraltet. Debian empfiehlt aptitudefür die Paketverwaltung auf der Kommandozeile, aber das ist alles andere als veraltet apt-get.
Telemachus
Hier ist etwas Feines. Das Suchen nach "A" in der dritten Spalte scheint Pakete zu markieren, von denen ich weiß, dass sie als Abhängigkeiten installiert sind. Aber es fängt natürlich nicht alle auf: Der größte Teil der Liste wurde definitiv nicht durch meine ausdrückliche Anfrage installiert.
Quark
@Telemachus. Ihr Befehl und der mit dem Muster tun nicht genau dasselbe: Die beiden Listen haben unterschiedliche Inhalte. Ich weiß nicht genug über Begabung, um Ihnen zu sagen, warum.
Quark
@Pablo: Die Links zu Ihrem Protokoll scheinen unterbrochen zu sein. Wenn Sie sie reparieren können, würde ich sie definitiv lesen wollen.
Quark
2

Unter debian zeigt apt-show-versions die Versionen der installierten Pakete an.

seb
quelle
Zur Kenntnis genommen. Dies scheint nicht (standardmäßig) auf Ubuntu installiert zu sein.
Quark
1

Schauen Sie auf apt-basierten Systemen unter /var/log/apt/term.log nach. Für mich gibt es eine ziemlich klare Linie, wo die Installation endete und wo meine Installationen begannen.

Waten
quelle
Für mich weniger nützlich, da manuelle Installationen und Systemaktualisierungen vermischt werden. Außerdem werden term.logs je nach Einrichtung irgendwann veraltet und gelöscht, sodass sie nicht mehr so ​​weit zurückgehen, wie ich es brauche.
Quark
Wenn Sie dies versuchen, beachten Sie, dass das Durchsuchen des Protokolls von apt anscheinend viel mehr Arbeit bedeutet als die anderen hier diskutierten Optionen. Es ist sicherlich nicht automatisch, eine Paketliste aus dem Protokoll zu extrahieren.
Quark
1

Von man aptitude-create-state-bundle:

aptitude-create-state-bundle erstellt ein komprimiertes Archiv, in dem die Dateien gespeichert sind, die zum Replizieren des aktuellen Paketarchivstatus erforderlich sind.

Auf diese Weise bleiben dieselben Informationen erhalten, aptitudeauf denen Pakete manuell installiert wurden.

Es soll verwendet werden mit aptitude-run-state-bundle:

aptitude-run-state-bundle entpackt das von aptitude-create-state-bundle (1) erstellte aptitude-run-state-bundle in ein temporäres Verzeichnis, ruft es mit dem angegebenen auf und entfernt das temporäre Verzeichnis anschließend.

intuitiert
quelle
1

Wenn Sie nur verwenden dpkg, wissen Sie nicht, ob das Paket manuell vom Benutzer oder automatisch (als Abhängigkeit oder während der Erstinstallation des Betriebssystems) installiert wurde. Wenn Sie diese Informationen beibehalten möchten, müssen Sie nur eine Liste der Pakete abrufen, die tatsächlich manuell installiert wurden.

Dafür können Sie einen dieser beiden Einzeiler verwenden. Beide liefern auf meiner Maschine exakt die gleiche Leistung und sind präziser als alle bisher in dieser Frage vorgeschlagenen Lösungen. Sie sind eine Kombination der beiden Antworten (1) und (2) . Beachten Sie, dass ich diese Antwort ursprünglich hier gepostet habe .

Verwenden von apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Verwenden von aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Nur sehr wenige Pakete noch die Risse durchfallen, obwohl ich diese vermuten , sind tatsächlich vom Benutzer installiert, entweder direkt nach der Installation durch die Sprachlokalisierung Setup oder zB durch den Totem - Codec Installer. Auch die Linux-Header-Versionen scheinen sich zu häufen, obwohl ich nur das nicht versionsspezifische Metapaket installiert habe. Beispiele:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Wie funktioniert es

  1. Rufen Sie die Liste der manuell installierten Pakete ab. Für die Eignung entfernt das zusätzliche sedLeerzeichen am Ende der Zeile.
  2. Rufen Sie die Liste der installierten Pakete direkt nach einer Neuinstallation ab.
  3. Vergleichen Sie die Dateien, und geben Sie nur die Zeilen in Datei 1 aus, die in Datei 2 nicht vorhanden sind.

Andere Möglichkeiten funktionieren nicht so gut:

  • Verwenden Sie die ubuntu-14.04-desktop-amd64.manifestDatei ( hier für Ubuntu 14.04) anstelle von /var/log/installer/initial-status.gz. Weitere Pakete werden als manuell installiert angezeigt, obwohl dies nicht der Fall ist.
  • Verwenden Sie apt-mark showautoanstelle von /var/log/installer/initial-status.gz. apt-markBeispiel: Enthält nicht das Paket xserver-xorg, während dies in der anderen Datei der Fall ist.

Beide Listen enthalten mehr Pakete als die oben genannte Lösung.

jmiserez
quelle
0

Ich bin voreingenommen und die Lösung, die ich präsentiere, ist nicht immer möglich, aber ich habe diese Situation satt. Das Ergebnis ist, dass ich mit den Update / Package Manager-Tools nichts mehr installiere.

Ich bin allerdings einen ziemlich schwierigen Weg gegangen (ich hatte strenge Anforderungen an die Versionen). Ich habe ein riesiges Makefile erstellt, das jedes Paket (Programm, Bibliothek, was auch immer), das ich brauche, herunterlädt, kompiliert und in meinem Home-Verzeichnis installiert. Ich habe es Stück für Stück schrittweise weiterentwickelt. Das Makefile lädt und kompiliert alles, auch die Compiler.

Wenn ich auf ein neues System umsteige oder neu installiere, kopiere ich einfach das Makefile (plus einige unterstützende Dinge), starte make world und komme am nächsten Tag wieder.

Für einige Programme, die ich entwickle (damit ich die Kontrolle darüber habe), verwende ich ein von mir programmiertes Tool, den Kastanienpaket-Manager . So ähnlich wie .app Ordner unter MacOSX. Alles ist im Paket enthalten, sodass ich jederzeit weiß, was installiert ist, und weiß, dass es eigenständig und autark ist (mit Ausnahme der Systembibliotheken).

Stefano Borini
quelle
Sie könnten einfach die Installationsbefehle des Paketmanagers in ein Skript einfügen und den gleichen Effekt erzielen. vorausgesetzt, der benötigte Code ist gepackt. Ihr Ansatz sieht Gentoos sehr ähnlich.
wcoenen
Gut zu wissen. Sieht nach viel zusätzlicher Arbeit aus, die über ein Standard-Ubuntu / Debian-System hinausgeht. Ich kann sehen, dass einige Pakete manuell gepflegt werden, aber alle auf diese Weise zu pflegen ist mehr Arbeit, als ich tun möchte.
Quark
Ja, aber mit dem zusätzlichen Problem, dass das Ubuntu / Fink / Darwinports-Zeug nicht überall plattformübergreifend funktioniert (ich war einmal auf einem digitalen und einem IBM SP4). Ich behaupte nicht, dass dies ein guter Weg ist. Ich sage nur, dass es die Arbeit macht, wenn auch auf hässliche, stinkende Weise, und ich behalte die volle Kontrolle darüber, was auf meinem System läuft.
Stefano Borini
Natürlich könnte ich mich an einem dieser Tage dazu entschließen, einen ernsthaften Blick darauf zu werfen und alles damit zu überarbeiten.
Stefano Borini
Dieser Weg ist heutzutage üblicher, wenn Sie Werkzeuge wie Küchenchef und Marionette in Betracht ziehen.
Steve Buzonas