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

10568
quark

(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 der Baseline-Installation. Wenn ich neu installiere oder einen neuen Computer installieren muss, möchte ich normalerweise diese spezifischen Pakete erneut installieren. Ich möchte es schnell tun, um mit einem Minimum an Aufwand wieder an die Arbeit zu gelangen. Soweit ich habe alle von den Paketmanager zu sehen ( apt-get, aptitudeund synaptic) kann mir sagen, welche Pakete installiert sind, und sie haben alle Protokolle (wenn auch verschiedene für jedes Werkzeug, das für ein Aufwand ist). Aber keiner von ihnen kann mir sagen, welche Pakete ich habeinstalliert werden, im Gegensatz zu ihren Abhängigkeiten oder Systemaktualisierungen. Sogar die Protokolle sind insofern schwierig, als ich nicht ganz sicher bin, was ich aus ihnen herausholen sollte oder wie ich sie integrieren sollte (im Fall der verschiedenen apt-Familienwerkzeuge). Dies bedeutet, dass ich bei jeder Neuinstallation oder auch nur bei der Sicherung nicht sicher bin, wie ich diese Liste neu erstellen kann.

Ich erwarte nicht unbedingt eines der Tools, um dies für mich zu tun, aber wenn dies nicht der Fall ist, suche ich nach Problemumgehungen. Sogar Muster, für die man grep, gute Daumenregeln oder eine klare Vorstellung davon, was genau protokolliert wird, wären nützlich. Es kann keine "beste Antwort" geben, aber gute Antworten wären sehr hilfreich.


Die meisten der folgenden Antworten geben eine Annäherung an das, was ich suche und sind bis zu einem gewissen Grad nützlich. Der ausgewählte ist der, der einer vernünftigerweise automatischen Möglichkeit, meine Werkzeuge auf einem neuen System wieder zu installieren, am nächsten kommt, auch wenn dies mit all seinen Vorbehalten einhergeht.

38
Sie werden wahrscheinlich nicht für alle Linux-Distributionen eine einfach zu verwendende Antwort erhalten. Paketverwaltung ist ein großer Teil dessen, was verschiedene Linux-Distributionen auszeichnet. Telemachus vor 15 Jahren 0
Telemachus - Richtig. Und es kann sinnvoll sein, dies in zwei Fragen aufzuteilen. Aber es schien eine ziemlich spezielle Frage zu sein, und ich verwende beide Systeme, deshalb wollte ich sie nicht im Voraus einschränken. Anscheinend sind die meisten Antworten hier für dpkg / apt, daher kann eine separate Frage zu rpm / yum sinnvoll sein. quark vor 15 Jahren 0
Wechseln Sie zu NixOS :) (nur Trolling). Alexey vor 7 Jahren 0

8 Antworten auf die Frage

31
Telemachus

Auf einem Debian-basierten Computer 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 die neue Maschine (ein USB-Stick ist eine gute Option, scpfunktioniert aber auch gut). Führen Sie dann diese Sequenz (mit root-Rechten) aus:

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

Sie erhalten nicht nur die Pakete, die Sie installiert haben. Sie erhält auch ihre Abhängigkeiten usw. Wenn sich die Repositorys zwischen den beiden Maschinen unterscheiden, sind alle Wetten deaktiviert.

Soweit Protokolle apt-getprotokolliert wird /var/log/apt/history.log(danke an Tshepang, dass Sie dies in einem Kommentar aktualisiert haben); dpkgdo (at /var/log/dpkg.log), aber es ist bekanntlich schwer zu analysieren und kann nur mit root-Rechten gelesen werden. aptitudehat ein at /var/log/aptitudeund Sie können es mit regulären Benutzerrechten durchblättern.

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

aptitude search '~i ~M' 

Wenn Sie nur diejenigen installieren möchten , die Sie installiert haben (nicht die automatischen Abhängigkeiten), negieren Sie Folgendes ~M:

aptitude search '~i !~M' 

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

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

(Ich habe nichts auf RedHat oder RedHat-basierte Systeme bekam. Tut mir leid. Es gibt wirklich keine eine Antwort für Linux per se seit Paketverwaltung ein großer Teil dessen, was macht verschiedene Distributionen anders .)

Seems like a combination of your advice and Ludwig's might do the trick: aptitude can generate a script to feed to dpkg so that's automatible which is a serious win. And if one were to do it on the vanilla machine, the difference in lists is close enough to what I'm asking for to be practically useful. quark vor 15 Jahren 0
Beachten Sie, dass APT jetzt ein Protokoll in "/var/log/apt/history.log" führt und von "apt-get", "synaptic" und "aptitude" verwendet wird (soweit ich es gesehen habe). Dies ist seit Anfang 2010. Tshepang vor 13 Jahren 3
Die `dpkg.log` -Anweisungen scheinen in Ubuntu 14.04 nicht wahr zu sein, da jeder Benutzer meine Auswahl leicht abrufen kann, nicht trivial, aber nicht zu schwierig. `awk '$ 3! =" install "; '/var/log/dpkg.log | sortieren | uniq` Steve Buzonas vor 9 Jahren 0
Eigentlich ist mir klar, dass es nicht so einfach ist, wie ich anfangs dachte, der Fehler im vorherigen awk-Skript kümmert sich nicht um die Deinstallation von Paketen. Das folgende `awk '$ 3! ~ / Install | remove | purge / END }} '/var/log/dpkg.log | sort -u` tut. Steve Buzonas vor 9 Jahren 0
7
Ludwig Weinzierl

Verwenden Sie dpkg -l '*' > jaunty.originaldiese Option, um alle installierten Pakete auf einem neu installierten System zu speichern.

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

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

Die Grundidee ist stark: Verwenden Sie die Befehlszeile, um die Liste der aktuell installierten Anwendungen zu sichern, und verwenden Sie dann die Befehlszeile, um diese Pakete auf einem neuen Computer zu installieren. Sie können mit dem Ansatz recht kreativ und spezifisch werden. pcapademic vor 15 Jahren 3
Ich bevorzuge dpkg --get-selections CesarB vor 15 Jahren 1
Zwar werden die von mir hinzugefügten Pakete nicht von ihren Abhängigkeiten erfasst, es wird jedoch eine nützliche Liste erstellt. quark vor 15 Jahren 0
3
pupeno

Eignung ist eigentlich ziemlich gut. Aptitude weiß, wann etwas von Hand oder von Abhängigkeiten 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, dass Ihr System immer so klein wie möglich bleibt.

Es gibt eine Handvoll Pakete, aus denen eine Ubuntu-Installation besteht, Ubuntu-Minimal, Ubuntu-Desktop, Ubuntu-Server usw. Wenn Sie Aptitude anweisen, diese als manuell installiert zu markieren und alles andere zu entfernen, erhalten Sie so wenig Pakete wie möglich.

Ich erkläre, wie ich das alles in zwei Beiträgen in meinem Blog machen kann: Aufräumen eines Debian GNU / Linux und Aufräumen eines Debian GNU / Linux (oder Ubuntu) . Kurz gesagt lautet die Antwort, die Sie suchen:

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

Das letzte Mal, als ich damit gearbeitet habe, wenn Sie apt-get verwendet haben, hat es nicht funktioniert. Deswegen empfehle ich Aptitude immer und soweit ich weiß, lehnt Debian Apt-get zugunsten von Aptitude ab.

Ich weiß nicht, wie man das mit Fedora macht, und Sie sollten sich wahrscheinlich trennen, als in eine andere Frage. Fedora und Ubuntu sind unterschiedliche Betriebssysteme und sollten als solche behandelt werden (auch wenn sie ihren Kernel und etwas anderes teilen).

Ich denke, dass Sie diese Informationen erhalten können, ohne dass "grep" benötigt wird: "Eignungssuche" ~ i! ~ M "sollte den Trick ausführen. Telemachus vor 15 Jahren 2
"Apt-get" ist auch nicht veraltet. Debian empfiehlt "aptitude" für die Paketverwaltung in der Befehlszeile, aber das ist weit davon entfernt, "apt-get" abzulehnen. Telemachus vor 15 Jahren 1
There is something subtle here. Looking for "A" in the third column does seem to mark packages that I know are installed as dependencies. But it clearly isn't catching all of them: most of the list was definitely not installed by my explicit request. quark vor 15 Jahren 0
@Telemachus. Your command and the one with the pattern do not do exactly the same thing: the two lists have different contents. I don't know enough about aptitude to tell you why though. quark vor 15 Jahren 0
@Pablo: The links to your log seem broken. If you can fix them I'd definitely want to read them. quark vor 15 Jahren 0
@quark: Links behoben. pupeno vor 15 Jahren 0
@ J.Pablo: Auf meinem Rechner liefern die beiden Befehle identische Ausgaben (wie sie sollten). Vielleicht haben Sie einige Pakete auf eine nicht standardmäßige Weise installiert? Telemachus vor 15 Jahren 0
Telemachos: welche zwei Befehle? (Ich installiere niemals Pakete auf eine nicht standardisierte Weise). pupeno vor 15 Jahren 0
@ J.Pablo: Tut mir leid, ich habe auf Quarks Kommentar geantwortet, aber ich habe Sie falsch verstanden und auf Sie reagiert. Die beiden Befehle gehören Ihnen mit `grep` (` aptitude search ~ i | grep -v 'i A' `) und mein Versuch ohne` grep` (`aptitude search '~ i! ~ M'`). Quark sagte, er habe von den beiden Befehlen unterschiedliche Listen erhalten. Ich denke nicht, dass die Ausgabe anders sein sollte, aber vielleicht fehlt mir hier etwas. Telemachus vor 15 Jahren 0
2
seb

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

Noted. This doesn't appear to be installed (by default) on Ubuntu. quark vor 15 Jahren 0
1
Wade

Auf apt-basierten Systemen schauen Sie nach /var/log/apt/term.log. Für mich gibt es eine ziemlich klare Linie, an der die Endpunkte der Installation und der Beginn meiner Installationen zu erkennen sind.

Less useful for me, because there is an intermixing of manual installs and system updates. Also depending on your setup term.logs will eventually be outdated and deleted, so it won't go back as far as I need it to. quark vor 15 Jahren 0
For anyone trying this, note that wading through apt's log seems to be a lot more work than other options discussed here. It's certainly not automatic to extract a package list from the log. quark vor 15 Jahren 0
1
intuited

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 Paketarchivierungsstatus erforderlich sind.

Auf diese Weise werden dieselben Informationen beibehalten, aptitudein denen die Pakete manuell installiert wurden.

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

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

1
jmiserez

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

Dafür können Sie einen dieser beiden Einzeiler verwenden. Beide haben exakt dieselbe Leistung auf meiner Maschine und sind genauer 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 veröffentlicht habe .

Mit apt-mark:

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

Mit 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 akkumulieren, 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. Aus Gründen der Eignung entfernt der zusätzliche sedRest den Leerraum am Ende der Zeile.
  2. Holen Sie sich die Liste der installierten Pakete direkt nach einer Neuinstallation.
  3. Vergleichen Sie die Dateien, geben Sie nur die Zeilen in Datei 1 aus, die nicht in Datei 2 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, auch wenn sie nicht installiert sind.
  • Verwenden apt-mark showautostatt /var/log/installer/initial-status.gz. apt-markZum Beispiel ist das Paket xserver-xorg nicht enthalten, während dies bei der anderen Datei der Fall ist.

Beide listen mehr Pakete auf als die obige Lösung.

0
Stefano Borini

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

Ich habe jedoch einen ziemlich harten Weg eingeschlagen (ich hatte strikte Anforderungen an 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 entwickelt. Das Makefile lädt und kompiliert alles, sogar die Compiler.

Wenn ich zu einem neuen System wechsle oder neu installiere, kopiere ich einfach das Makefile (plus einige unterstützende Dateien), starte make world und komme am nächsten Tag zurück.

Für einige Programme, die ich entwickle (also habe ich die Kontrolle), verwende ich ein von mir programmiertes Programm, den Kastanienpaket-Manager . Art wie .app-Ordner unter MacOSX. Alles ist im Paket enthalten, also weiß ich, was zu jeder Zeit installiert ist, und ich weiß, dass es eigenständig und autark ist (außer bei System-Libs).

Sie können die Paketmanager-Installationsbefehle einfach in ein Skript einfügen und haben den gleichen Effekt. vorausgesetzt, dass der Code, den Sie benötigen, verpackt ist. Ihr Ansatz sieht Gentoo sehr ähnlich. wcoenen vor 15 Jahren 0
Nice to know about. Looks like a lot of extra work beyond a default Ubuntu/Debian system. I can see manually maintaining some packages, but maintaining *all* of them this way is more work than I want to do. quark vor 15 Jahren 0
Ja, aber mit dem zusätzlichen Problem, dass das Ubuntu / Fink / Darwinports-Zeug nicht überall plattformübergreifend funktioniert (ich war einmal auf einer digitalen und einer IBM SP4). Ich behaupte nicht, dass dies ein schöner Weg ist. Ich sage nur, dass es die Arbeit erledigt, wenn auch auf eine häßliche, stinkende Art und Weise, und ich habe die volle Kontrolle darüber, was in meinem System vorgeht. Stefano Borini vor 15 Jahren 0
Natürlich könnte ich mich an einem dieser Tage dazu entschließen, tatsächlich einen ernsthaften Blick darauf zu werfen, um alles zu überarbeiten und alles damit zu überarbeiten. Stefano Borini vor 15 Jahren 0
Dieser Weg ist heutzutage häufiger, wenn Sie Werkzeuge wie Koch und Marionette in Betracht ziehen. Steve Buzonas vor 9 Jahren 0