Wie repliziere ich die Auswahl der installierten Pakete von einer Fedora-Instanz auf eine andere?


16

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 die gleichen 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, ich möchte 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 explizit in einer dnf install(oder yum install) Befehlszeile erwähnt wurden - und nicht diejenigen, 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. Außerdem möchte ich beim Entfernen von Paketen auch die (möglicherweise) dann nicht benötigten automatisch installierten Abhängigkeiten (z. B. Waisen) entfernen.

Ich habe gefunden dnf list installed- aber es wird nicht angezeigt, wenn ein Paket aufgrund einer Abhängigkeit explizit ausgewählt oder nur installiert wurde.

Woher bekomme ich diese Informationen über Fedora?

Wie kann ich mit Fedora / dnf die Paketauswahl replizieren?

Antworten:


12

Seit Fedora 26, die Dnf repoquery subcommand Träger hat eine neue Option für die Auflistung alle 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 installabgebrochen, wenn ein oder mehrere Pakete nicht mehr verfügbar sind. Alternativ kann dnf gezwungen werden , alle verbleibenden zu installieren:

# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b

PS: Gib den obigen Code ein und vieles mehr user-installed.py, das auch andere Distributionen unterstützt.

Verlauf vom Benutzer installiert

Auf Fedora 23 und höher bietet DNF die

# dnf history userinstalled

Befehl, der alle vom Benutzer installierten Pakete auflistet. Ab 2016-11 ist seine Nützlichkeit eingeschränkt, da es keine Möglichkeit gibt, seine Ausgabe zu steuern, und es druckt vollständig qualifizierte Pakete (dh einschließlich Versionsinformationen).

benutzerinstallierte Einschränkungen

Beachten Sie, dass die Kennzeichnung von Paketen als vom Benutzer installiert bei einigen Fedora-Versionen einige Einschränkungen aufweist.

Repoquery

Auf älteren Fedora-Systemen, auf denen Dnf, die Dnf-API, dnf history userinstallednicht verfügbar ist, kann stattdessen Repoquery verwendet werden, z.

$ 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 dient zum Ausschließen von Paketen, die vom Installationsprogramm installiert wurden. Die Benutzer-ID des Installateurs wurde anscheinend als 4294967295 gespeichert - alternativ können Sie so etwas schreiben ($3 == 0 || $3 == your-user-id).

Beachten Sie, dass dieser Befehl auf Fedora bis Release 21 funktioniert - aber z. B. nicht auf Release 23, da der Befehl repoquerydurch ersetzt wurde dnf repoquery. Und dnf repoqueryversteht das %{yumdb_info.reason}Tag nicht.


Ich bin nicht sicher, ob dieser Ansatz alles erreichen wird. Ich bemerkte repoquery ...Folgendes auf meinem System, als ich lief : "Ungültiger yumdb querytag 'Grund' für installiertes pkg: HandBrake-cli-0.9.5-1.fc14.x86_64"
slm

@slm, hm, aus welchem ​​Repository wurde die Handbremse installiert? Vielleicht hat das Repository-Setup etwas damit zu tun?
Maxschlepzig

Ich denke, es könnte ein eigenständiges RPM gewesen sein, das ich mit installiert habe yum localinstall .... Ich hatte eine ganze Menge Pakete, die in dieses Lager fielen.
SLM

repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l90 Pakete zurückgegeben.
SLM

6

Der einfachste Weg, und es hat lange funktioniert, ist:

yum-debug-dump => gives file.

yum-debug-restore <file-from-debug-dump>

... was ähnlich funktioniert 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 es selbst analysieren zu müssen.


3

Inspiriert von der Antwort von slm habe ich folgende Lösung gefunden:yum history

Erhalten Sie den gesamten detaillierten Verlauf aller YUM-Installationstransaktionen (dh keine Upgrades), mit Ausnahme derjenigen, die im Rahmen der anfänglichen Installationsaktionen (Transaktionen 1 und 2 auf meinem System, die dem Benutzer "System" zugeordnet sind) ausgeführt werden:

$ yum history list all | awk -F'|' \
                            '$4 ~ /Install/ && $2 !~ /System/ {print $1}' \
    | xargs yum history info > yum_history

Filtern Sie explizit installierte Pakete und schneiden Sie Versionspräfixe ab.

$ < 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 sehen auf meinem System 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 durch sort -u geleitet.)

Warum gibt es Unterschiede? Denn repoquery beinhaltet alle Pakete aus den Transaktionen 1 und 2, also alle Pakete, die vom Fedora-Installer installiert wurden. Dies erklärt, warum die Repoquery die genannten Pakete xorg-x11-drv-mga und friends enthält.

Der Vergleich von repoquery-2nd und yum-history zeigt, dass repoquery-2nd genauer ist - einige bereits entfernte Pakete sind nicht enthalten. Außerdem enthält es anscheinend ein paar (2 auf meinem System) Pakete aus 'yum update'-Operationen.

Warnung

Die obige auf dem Verlauf basierende Methode listet nur alle explizit installierten Pakete über die gesamte Lebensdauer des Systems auf. Pakete, die in einer späteren Transaktion entfernt wurden, werden nicht ausgeglichen. Diese Methode erfordert daher eine manuelle Kuratierung der Ergebnisse und sollte nur auf Systemen angewendet werden, auf denen dies repoquerynicht möglich ist.


Ein guter Weg, um das Beste aus unseren beiden Antworten herauszuholen! Ich würde Ihnen mehr als +1 geben, wenn ich für die endgültige Lösung + den netten Vergleich der verschiedenen Möglichkeiten, es zu tun, könnte.
SLM

2

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 yum historyFunktion ansehen . Ich glaube, Sie können die Informationen, die Sie suchen, von diesem Befehl erhalten.

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 zur allerersten Transaktion zurückkehren, indem Sie eine Liste mit Zahlen übergeben 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

Geschichtsinfo

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 von einer Abhängigkeit benötigt wurde. Sie können diese Informationen analysieren und eine Liste der Pakete abrufen, die explizit installiert wurden.


Ich habe eine Antwort hinzugefügt, die auf Ihrer yum historyIdee repoquerybasiert. Sie vergleicht auch die Ergebnisse mit der basierten Methode. Als Nebeneffekt habe ich meine Repoquery-Antwort erweitert.
Maxschlepzig

1
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt

1
Wenn Sie sich die anderen 5 Antworten hier ansehen, was unterscheidet sich von Ihrer Antwort? Es gibt absolut keine Erklärung, warum oder wie Ihre Antwort besser von anders ist. Es wäre gut, wenn Sie eine Beschreibung Ihrer Antwort geben könnten, die diese Dinge abdeckt.
Stephen Rauch

@StephenRauch, dieser Befehl ist in den anderen Antworten nicht enthalten, da es sich um eine kürzlich hinzugefügte dnf handelt. Der --userinstalledSchalter wurde erst im Mai zu dnf hinzugefügt . Ich habe es getestet und es gibt genaue Ergebnisse. Modulo die Kernel / Kernel-Core / Kernel-Module-Pakete, die nicht wirklich vom Benutzer installiert sind. Es enthält auch alle *-debuginfoPakete - sie können jedoch bei Bedarf einfach herausgefiltert werden.
Maxschlepzig

@maxschlepzig, danke für die Rückmeldung, aber das war eigentlich eine rhetorische Frage, die versucht, den Antwortenden zu erziehen / aufzufordern, dies in der Antwort zu erklären.
Stephen Rauch

@StephenRauch, fair genug, eine Bearbeitung wäre sicherlich angebracht und würde es mir erlauben, es als akzeptierte Antwort zu markieren.
Maxschlepzig

0

Versuchen Sie Folgendes, um die von Ihnen installierten Pakete aufzulisten :

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: Es werden keine Abhängigkeiten angezeigt

PS2: Es ist alphabetisch sortiert

PS3: Es wird nicht angezeigt, wenn Sie das Paket später entfernt haben


-1

Was ich getan habe (die Details vergessen, und ich bin ein fauler Penner, also ...

Holen Sie sich alle installierten Pakete: rpm -qa > file

Verwenden Sie sed(1)diese Option, um Versionsnummern und ähnliches zu entfernen (behalten Sie die Architektur bei, falls erforderlich). Dies erforderte ein paar Iterationen, um es richtig zu machen, man wollte den letzten Abschnitt von -[0-9.]-[0-9].fc23oder ähnlichem durch nichts ersetzen , aber es gibt auch lustige "Versionsnummern".

Führen Sie nach der normalen Installation einen der Schritte yum -y install $(< file)(oder dnf) aus.

Sie erhalten einige Ausfälle von Paketen, die nicht mehr existieren oder deren Namen geändert wurden oder die durch andere ersetzt wurden.


OK, aber dies markiert alle zuvor installierten Pakete als vom Benutzer auf dem Zielhost installiert. Auch wenn sie ursprünglich nur als Abhängigkeit installiert wurden.
Maxschlepzig
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.