Ich habe ein Fedora-System (A), auf dem ich im Laufe der Zeit einige Pakete installiert habe. Jetzt möchte ich Fedora auf einem anderen Computer (B) installieren und dieselben Pakete darauf installieren.
In Debian-Begriffen möchte ich Folgendes erreichen:
$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b
Aber um ehrlich zu sein, möchte ich wirklich eine bessere Methode, um dieselben Pakete auf dem neuen Fedora 19-System (B) auszuwählen: Ich möchte nur die Pakete von System A installieren, die ausdrücklich erwähnt wurden in einer dnf install
(oder yum install
) Befehlszeile – und nicht in solchen, die als Abhängigkeiten installiert wurden!
Warum? Vielleicht haben sich die Abhängigkeiten geändert – und ich möchte keine veralteten Abhängigkeiten auf dem neuen System installieren. Wenn ich Pakete entferne, möchte ich außerdem die (möglicherweise) dann nicht benötigten automatisch installierten Abhängigkeiten (dh Waisen) entfernen. P. >
Ich habe dnf list installed
gefunden – aber es wird nicht angezeigt, ob ein Paket aufgrund einer Abhängigkeit explizit ausgewählt oder nur installiert wurde.
Wie gehe ich vor? Informationen zu Fedora erhalten?
Wie kann Fedora / dnf die Paketauswahl replizieren?
Antwort
Seit Fedora 26 bietet der Unterbefehl Dnf repoquery
eine neue Option zum Auflisten aller vom Benutzer installierten Pakete:
$ dnf repoquery --qf "%{name}" --userinstalled \ | grep -v -- "-debuginfo$" \ | grep -v "^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$" > pkgs_a.lst
Im Gegensatz zu anderen Methoden werden auch alle Debuginfo-Pakete aufgelistet. Das zusätzliche grep im obigen Beispiel filtert sie heraus.
So installieren Sie die Liste auf Host B:
$ < pkgs_a.lst xargs dnf -y install
Dnf-API
Bei neueren Dnf-Versionen (z. B. Fedora> = 23) kann die Paketdatenbank über die Dnf-Python-API nach vom Benutzer installierten Paketnamen abgefragt werden:
$ python3 -c "import dnf; b = dnf.Base(); b.fill_sack(); \ l = sorted(set(x.name for x in b.iter_userinstalled() \ if not x.name.endswith("-debuginfo") \ and x.name not in \ ["kernel-modules", "kernel", "kernel-core", "kernel-devel"] )); \ print("\n".join(l)) " > pkgs_a.lst # dnf install $(cat pkgs_a.lst) # on host_b
Standardmäßig wird dnf install
abgebrochen, wenn ein oder mehrere Pakete nicht mehr verfügbar sind. Alternativ kann dnf erzwungen werden um alle verbleibenden zu installieren:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Fügen Sie den obigen Code und mehr in user-installed.py
ein, das auch andere Distributionen unterstützt.
Verlauf Benutzerinstalliert
Unter Fedora 23 und höher stellt Dnf den Befehl
# dnf history userinstalled
bereit, mit dem alle vom Benutzer installierten Pakete aufgelistet werden. Stand 2016-11 Die Nützlichkeit von ist begrenzt , da dies nicht möglich ist steuert seine Ausgabe und druckt vollständig qualifizierte Pakete (d. h. einschließlich Versionsinformationen).
Vom Benutzer installierte Einschränkungen
Beachten Sie, dass die Kennzeichnung von Paketen als vom Benutzer installiert einige Einschränkungen für einige Fedora-Versionen für Fedora 23-ish-Systeme aufweist (ab etwa 2015) -11) Die folgenden Probleme sind relevant):
- Pakete, die über die GUI installiert wurden, sind nicht enthalten
- Pakete, die über den Handler „Befehl nicht gefunden“ installiert wurden, sind nicht enthalten
- einige standardmäßig installierte Pakete (von anaconda) sind enthalten
Repoquery
Auf älteren Fedora-Systemen, auf denen Dnf, die Dnf-API und dnf history userinstalled
ist nicht verfügbar, man kann stattdessen repoquery verwenden, z. B.:
$ repoquery --installed \ --qf "%{n} | %{yumdb_info.reason} | %{yumdb_info.installed_by}" --all \ | awk -F"|" " $2 ~ /user/ && ($3 != 4294967295) { print $1 }" \ | sort -u > pkgs_a.lst
Die zweite awk-Bedingung wird verwendet, um Pakete auszuschließen, die vom Installationsprogramm installiert wurden. Die Benutzer-ID des Installationsprogramms wurde anscheinend als 4294967295 gespeichert. Alternativ können Sie auch etwas wie
.
Beachten Sie, dass dieser Befehl unter Fedora bis Version 21 funktioniert – aber z. Nicht in Release 23, da der Befehl repoquery
durch dnf repoquery
ersetzt wurde. Und dnf repoquery
versteht das %{yumdb_info.reason}
-Tag nicht. P. >
Kommentare
- Ich ‚ bin nicht sicher, ob dieser Ansatz alles bekommt, ich habe diese auf meinem System bemerkt, als Ich habe
repoquery ...
ausgeführt: “ Ungültiger yumdb-Abfragetag ‚ Grund ‚ für installiertes Paket: HandBrake-cli-0.9.5-1.fc14.x86_64 “ - @slm, hm, aus welchem Repository Handbremse eingebaut? Vielleicht hat das Repository-Setup etwas damit zu tun?
- Ich glaube, es war ein eigenständiges RPM, das ich mit
yum localinstall ...
installiert habe. Ich hatte eine ganze Menge Pakete, die in dieses Lager fielen. -
repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
gab 90 Pakete zurück.
Antwort
Der einfachste Weg, und es hat lange funktioniert:
yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump>
… funktioniert ähnlich wie der Befehl get / set selections dpkg, AIUI.Beachten Sie auch, dass Sie bei der Wiedergabe des Verlaufs Folgendes verwenden können:
yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info>
… anstatt ihn selbst analysieren zu müssen.
Antwort
Inspiriert von slm „s Antwort Ich habe folgende yum history
-basierte Lösung gefunden:
Alle detaillierten Verlauf aller yum-Installationstransaktionen abrufen (dh keine Upgrades) Ausgenommen diejenigen, die im Rahmen der ersten Installationsaktionen ausgeführt wurden (Transaktionen 1 und 2 auf meinem System, die dem Benutzer „System“ zugeordnet sind):
$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history
Filter explizit installierter Pakete und Versionspräfixe abschneiden.
$ < yum_history grep "[^-]\<Install\>" | \ awk "{ print $2 }" \ | sed "s/\(-[0-9]\+:\|-[0-9]\+\.[0-9]\|-[0-9]\+-\|-[0-9]\+git\).\+\(\.fc1[1-7]\.\|\.noarch\).*$//" \ | sort > hist_pkg_list
Der hässliche reguläre Ausdruck wird benötigt, damit alle Arten von Versionssuffixen übereinstimmen.
Die Ergebnisse Auf meinem System sieht es ganz gut aus.
Ein Vergleich mit dem Repoquery -Ansatz (auf meinem System):
method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214
(Ich habe die Repoquery-Ergebnisse weitergeleitet ugh sort -u)
Warum gibt es Unterschiede? Weil Repoquery alle Pakete aus den Transaktionen 1 und 2 enthält, d. H. Alle Pakete, die vom Fedora-Installationsprogramm installiert wurden. Dies erklärt, warum Repoquery die genannten Pakete xorg-x11-drv-mga und Freunde enthält.
Der Vergleich von Repoquery-2nd und Yum-History zeigt, dass Repoquery-2nd genauer ist – einige bereits entfernte Pakete sind nicht enthalten . Darüber hinaus enthält es anscheinend einige (2 auf meinem System) Pakete aus „yum update“ -Operationen.
Warnung
Die obige geschichtsbasierte Methode listet nur alle explizit installierten auf Pakete über die gesamte Lebensdauer des Systems. Die Pakete, die in einer späteren Transaktion entfernt wurden, werden nicht ausgeglichen. Daher erfordert diese Methode eine manuelle Kuratierung der Ergebnisse und sollte nur auf Systemen verwendet werden, auf denen repoquery
nicht verfügbar ist.
Kommentare
- Gute Möglichkeit, das Beste aus unseren beiden Antworten herauszuholen! Ich ‚ würde Ihnen mehr als eine +1 geben, wenn ich für die mögliche Lösung + den schönen Vergleich der verschiedenen Möglichkeiten, dies zu tun, könnte.
Antwort
Ich habe eine ältere Version von Fedora (14), daher enthält mein Yum eine weniger funktionsreiche Version von yum
, aber vielleicht möchten Sie sich die Funktion yum history
ansehen. Ich glaube, Sie können die Informationen, nach denen Sie suchen, über diesen Befehl abrufen.
Verlaufsliste
$ sudo yum history list Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 862 | System <unset> | 2013-07-12 18:00 | Install | 1 861 | System <unset> | 2013-07-09 03:11 | Install | 1 860 | System <unset> | 2013-07-01 13:40 | Install | 1 859 | System <unset> | 2013-06-29 22:07 | Install | 1 858 | System <unset> | 2013-06-25 22:33 | Install | 1 P< 857 | System <unset> | 2013-06-23 22:28 | Update | 1 >E 856 | System <unset> | 2013-06-23 21:33 | Install | 1 ...
Sie können zum zurückkehren allererste Transaktion durch Übergeben einer Liste von Zahlen an yum history list
:
$ sudo yum history list `seq 1 10` Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 10 | Sam M. (local) <saml> | 2010-12-18 23:23 | Install | 2 9 | Sam M. (local) <saml> | 2010-12-18 23:15 | Install | 38 8 | Sam M. (local) <saml> | 2010-12-18 23:12 | Install | 1 7 | Sam M. (local) <saml> | 2010-12-18 23:09 | Install | 1 < 6 | Sam M. (local) <saml> | 2010-12-18 22:37 | Install | 1 > 5 | Sam M. (local) <saml> | 2010-12-18 21:57 | Install | 1 4 | System <unset> | 2010-12-18 21:21 | Install | 5 3 | System <unset> | 2010-12-18 21:18 | Install | 4 2 | System <unset> | 2010-12-18 21:10 | Install | 3 1 | System <unset> | 2010-12-18 19:14 | Install | 1189
Verlaufsinformationen
Das Folgende zeigt Ihnen, was im Rahmen der ersten yum-Transaktion installiert wurde:
$ sudo yum history info 1 | less Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list Transaction ID : 1 Begin time : Sat Dec 18 19:14:05 2010 Begin rpmdb : 0:da39a3ee5e6b4b0d3255bfef95601890afd80709 End time : 19:42:43 2010 (1718 seconds) End rpmdb : 1189:8c21e9e377c3ebdee936916208f74232d5d6235f User : System <unset> Return-Code : Success Transaction performed with: Packages Altered: Dep-Install ConsoleKit-0.4.2-3.fc14.x86_64 Dep-Install ConsoleKit-libs-0.4.2-3.fc14.x86_64 Dep-Install ConsoleKit-x11-0.4.2-3.fc14.x86_64 Dep-Install GConf2-2.31.91-1.fc14.x86_64 Dep-Install GConf2-gtk-2.31.91-1.fc14.x86_64 Dep-Install ModemManager-0.4-4.git20100720.fc14.x86_64 Install NetworkManager-1:0.8.1-10.git20100831.fc14.x86_64 Dep-Install NetworkManager-glib-1:0.8.1-10.git20100831.fc14.x86_64 Install NetworkManager-gnome-1:0.8.1-10.git20100831.fc14.x86_64 Install NetworkManager-openconnect-0.8.1-1.fc14.x86_64
Beachten Sie, wie yum meldet, ob ein Paket explizit installiert oder installiert wurde, weil es wurde von einer Abhängigkeit benötigt. Sie konnten diese Informationen analysieren und Ihre Liste der explizit installierten Pakete abrufen.
Kommentare
- I ‚ hat eine Antwort hinzugefügt, die auf Ihrer
yum history
Idee basiert. Außerdem werden die Ergebnisse mit der aufrepoquery
basierenden Methode verglichen Als Nebeneffekt habe ich ‚ meine Repoquery-Antwort erweitert.
Antwort
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
Kommentare
- Wenn Sie sich die anderen 5 Antworten hier ansehen, was fällt Ihnen bei Ihrer Antwort auf? Es gibt absolut keine Erklärung dafür, warum Ihre Antwort besser oder anders ist. Es wäre gut, wenn Sie eine Beschreibung Ihrer Antwort geben könnten, die diese Dinge abdeckt.
- @StephenRauch, dieser Befehl ist nicht ‚ in den anderen Antworten enthalten. weil es ‚ ein neuer dnf-Zusatz ist. Der Schalter
--userinstalled
wurde nur im Mai zu dnf hinzugefügt . Ich ‚ habe es getestet und es liefert genaue Ergebnisse. Modulo die Kernel / Kernel-Core / Kernel-Module-Pakete, die ‚ nicht wirklich vom Benutzer installiert sind. Es enthält auch alle*-debuginfo
-Pakete – aber sie können bei Bedarf einfach herausgefiltert werden. - @maxschlepzig, danke für das Feedback, aber dies war tatsächlich ein Eine rhetorische Frage, die versucht, den Antwortenden zu erziehen / zu veranlassen, dies in der Antwort zu erklären.
- @StephenRauch, fair genug, eine gewisse Bearbeitung wäre sicherlich angemessen und würde es mir ermöglichen, sie als akzeptiert zu markieren Antworten.
Antwort
Versuchen Sie dieses , um die von Ihnen installierten Pakete aufzulisten Einzeiler :
alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g""
Ergebnis:
# yum-userinstall yum install bind-utils yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install lsof yum install nano yum install nfs-utils libnfsidmap yum install nmap-ncat yum install openscap-scanner yum install open-vm-tools
PS1: Abhängigkeiten werden nicht angezeigt.
PS2: Es ist alphabetisch sortiert.
PS3: Es wird nicht angezeigt, ob Sie das Paket später entfernt haben.
Antwort
Was ich getan habe (habe die Details vergessen und ich bin ein fauler Penner, also …
Holen Sie sich alle installierten Pakete: rpm -qa > file
Verwenden Sie sed(1)
, um Versionsnummern und dergleichen zu entfernen (behalten Sie die Architektur bei, falls erforderlich). Dies erforderte a Einige Iterationen, um es richtig zu machen, möchten Sie den letzten Abschnitt von -[0-9.]-[0-9].fc23
oder ähnlichem durch nichts ersetzen, aber es gibt auch lustige Versionsnummern.
Danach Führen Sie bei der normalen Installation eine yum -y install $(< file)
(oder dnf
nach Bedarf) durch.
Sie werden einige Auswirkungen haben von Paketen, die es nicht gibt ymore oder geänderter Name oder wurden durch andere ersetzt.
Kommentare
- Ok, aber dies markiert alle zuvor installierten Pakete als vom Benutzer installiert der Zielhost. Auch wenn sie ursprünglich nur als Abhängigkeit installiert wurden.