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 möchte die gleichen Pakete darauf installieren.
In Debian-Begriffen möchte ich so etwas 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 explizit auf einer dnf-Installation
(oder yum install
) Kommandozeile – und nicht die, die als Abhängigkeiten installiert wurden!
Wieso den? Denn vielleicht haben sich 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 (dh verwaiste) entfernen.
Ich habe dnf list installiert
gefunden – aber es wird nicht angezeigt, ob ein Paket explizit ausgewählt oder nur wegen einer Abhängigkeit installiert wurde.
Wie bekomme ich diese Informationen auf Fedora?
Wie repliziert Fedora/dnf Paketauswahlen?
Akzeptierte Antwort:
Seit Fedora 26 ist das Dnf repoquery
Der Unterbefehl unterstützt hat 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 listet es auch alle Debuginfo-Pakete auf. 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 nach vom Benutzer installierten Paketnamen über die Dnf-Python-API 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 dnf install
bricht ab, 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: Fügen Sie den obigen Code und mehr in user-installed.py
ein die auch andere Distributionen unterstützt.
Geschichte vom Benutzer installiert
Auf Fedora 23 und höher stellt Dnf die Datei
bereit# dnf history userinstalled
Befehl, der alle vom Benutzer installierten Pakete auflistet. Ab 2016-11 ist seine Nützlichkeit begrenzt, da es keine Möglichkeit gibt, seine Ausgabe zu kontrollieren, und es gibt Pakete vollständig qualifiziert aus (d. h. einschließlich Versionsinformationen).
vom Benutzer installierte Einschränkungen
Beachten Sie, dass die Markierung von Paketen als vom Benutzer installiert einige Einschränkungen bei einigen Fedora-Versionen hat, für Fedora-23-Ära-Systeme (von etwa 2015-11) sind die folgenden Probleme relevant):
- Pakete, die über die GUI installiert werden, sind nicht enthalten
- Pakete, die über den Command-not-found-Handler installiert wurden, sind nicht enthalten
- Einige Pakete, die standardmäßig (von Anaconda) installiert werden, sind enthalten
Wiederherstellung
Auf älteren Fedora-Systemen, auf denen Dnf, die Dnf-API und dnf history userinstalliert
nicht verfügbar sind, kann man 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 Installer installiert wurden. Die Benutzer-ID des Installers wurde anscheinend als 4294967295 gespeichert – alternativ können Sie auch etwas schreiben wie ($3 ==0 || $3 ==your-user-id)
.
Beachten Sie, dass dieser Befehl auf Fedora bis Release 21 funktioniert – aber z. nicht auf Release 23, da der Befehl repoquery
wurde durch dnf repoquery
ersetzt . Und dnf repoquery
versteht den %{yumdb_info.reason}
nicht Tag.