Jai un système Fedora (A) où jai installé des paquets au fil du temps. Maintenant, je veux installer Fedora sur un autre ordinateur (B) et je veux installer les mêmes paquets dessus.

En termes Debian, je veux accomplir quelque chose comme ceci:

$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b 

Mais pour être honnête, je veux vraiment une meilleure méthode pour sélectionner les mêmes paquets sur le nouveau système Fedora 19 (B): je veux juste installer les paquets du système A qui ont été explicitement mentionnés sur une ligne de commande dnf install (ou yum install) – et pas celles qui ont été installées en tant que dépendances!

Pourquoi? Parce que les dépendances ont peut-être changé – et je ne veux pas installer de dépendances obsolètes sur le nouveau système. De plus, lorsque je supprime des paquets, je veux également supprimer les dépendances installées automatiquement (éventuellement) inutiles (cest-à-dire les orphelins).

Jai trouvé dnf list installed – mais il ne saffiche pas si un package a été explicitement sélectionné ou simplement installé à cause dune dépendance.

Comment puis-je obtenir ces informations sur Fedora?

Quelle est la manière Fedora / dnf de répliquer les sélections de paquets?

Réponse

Depuis Fedora 26, la sous-commande Dnf repoquery prend en charge a une nouvelle option pour lister tous les packages installés par lutilisateur:

$ dnf repoquery --qf "%{name}" --userinstalled \ | grep -v -- "-debuginfo$" \ | grep -v "^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$" > pkgs_a.lst 

Contrairement aux autres méthodes, il répertorie également tous les paquets debuginfo. Le grep supplémentaire dans lexemple ci-dessus les filtre.

Pour installer la liste sur lhôte B:

$ < pkgs_a.lst xargs dnf -y install 

API Dnf

Avec les versions Dnf récentes (par exemple Fedora> = 23), la base de données des packages peut être interrogée pour les noms de packages installés par lutilisateur via lAPI Dnf Python:

$ 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 

Par défaut, dnf install abandonne si un ou plusieurs packages ne sont plus disponibles. Sinon, dnf peut être forcé pour installer tous les autres:

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

PS: Mettez le code ci-dessus et plus dans user-installed.py qui prend également en charge dautres distributions.

historique installé par lutilisateur

Sur Fedora 23 et versions ultérieures, Dnf fournit la commande

# dnf history userinstalled 

qui répertorie tous les packages installés par lutilisateur. À partir de 2016-11 , son utilité est limitée car il ny a aucun moyen de contrôler sa sortie et il imprime des paquets entièrement qualifiés (c.-à-d. y compris les informations de version).

Limitations installées par lutilisateur

Notez que le marquage des paquets comme installés par lutilisateur présente certaines limitations sur certaines versions de Fedora, pour les systèmes de lère Fedora 23 (à partir de 2015 environ) -11) les problèmes suivants sont pertinents):

Repoquery

Sur les anciens systèmes Fedora, où Dnf, lAPI Dnf et dnf history userinstalled ne sont pas disponibles, on peut utiliser repoquery à la place, par exemple:

$ 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 

La deuxième condition awk est utilisée pour exclure les paquets qui ont été installés par le programme dinstallation. LID utilisateur du programme dinstallation a apparemment été stocké sous le nom 4294967295 – vous pouvez également écrire quelque chose comme

.

Notez que cette commande fonctionne sur Fedora jusquà la version 21 – mais par exemple pas dans la version 23, car la commande repoquery a été remplacée par dnf repoquery. Et dnf repoquery ne comprend pas la balise %{yumdb_info.reason}.

Commentaires

  • Je ‘ ne suis pas sûr que cette approche obtienne tout, je les ai remarqués sur mon système lorsque Jai couru repoquery ...:  » Yumdb querytag non valide ‘ raison ‘ pour le paquet installé: HandBrake-cli-0.9.5-1.fc14.x86_64  »
  • @slm, hm, à partir de quel référentiel était frein à main installé? Peut-être que la configuration du référentiel a quelque chose à voir avec ça?
  • Je pense que cest peut-être un RPM autonome que jai installé en utilisant yum localinstall .... Jai eu une bonne quantité de paquets qui sont tombés dans ce camp cependant.
  • repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l a renvoyé 90 paquets.

Réponse

Le moyen le plus simple, et cela fonctionne depuis longtemps, est:

yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump> 

… qui fonctionne un peu comme la commande get / set selections dpkg, AIUI.Notez également que si vous relisez lhistorique, vous pouvez utiliser:

yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info> 

… au lieu davoir à lanalyser vous-même.

Réponse

Inspiré par slm « s answer Jai trouvé la solution yum history suivante:

Obtenez tout lhistorique détaillé de toutes les transactions dinstallation yum (cest-à-dire aucune mise à niveau) , à lexclusion de celles exécutées dans le cadre des actions initiales du programme dinstallation (transactions 1 et 2 sur mon système, attribuées à lutilisateur « System »):

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

Filtrer les packages explicitement installés et couper les préfixes de version.

$ < 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 

La vilaine expression régulière est nécessaire pour que toutes sortes de suffixes de version soient mis en correspondance.

Les résultats semble assez bien sur mon système.

Une comparaison avec la repoquery ansatz (sur mon système):

 method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214 

(Jai diffusé les résultats de repoquery via ugh sort -u)

Pourquoi y a-t-il des différences? Parce que repoquery inclut tous les packages des transactions 1 et 2, cest-à-dire tous les packages qui ont été installés par linstallateur Fedora. Ceci explique pourquoi repoquery inclut les paquets mentionnés xorg-x11- drv-mga et ses amis.

La comparaison de repoquery-2nd et yum-history montre que repoquery-2nd est plus précis – il ninclut pas certains paquets déjà supprimés . De plus, il comprend quelques (2 sur mon système) paquets dopérations « yum update », semble-t-il.

Attention

La méthode basée sur lhistorique ci-dessus ne répertorie que tous les installés explicitement paquets pendant toute la durée de vie du système. Il néquilibre pas les packages qui ont été supprimés lors dune transaction ultérieure. Ainsi, cette méthode nécessite une conservation manuelle des résultats et ne doit être utilisée que sur les systèmes où repoquery nest pas disponible.

Commentaires

  • Belle façon de tirer le meilleur parti de nos deux réponses! Je ‘ d vous donner plus dun +1 si je pouvais pour la solution éventuelle + la belle comparaison des différentes façons de le faire.

Réponse

Jai une ancienne version de Fedora (14) donc mon yum inclut une version moins riche en fonctionnalités de yum, mais vous voudrez peut-être jeter un œil à la fonctionnalité yum history. Je pense que vous pouvez obtenir les informations que vous recherchez à partir de cette commande.

liste d’historique

$ 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 ... 

Vous pouvez revenir à la toute première transaction en passant une liste de nombres à 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 

informations dhistorique

Ce qui suit vous montrera ce qui a été installé dans le cadre de la 1ère transaction yum:

$ 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 

Remarquez comment yum indique si un package a été explicitement installé ou installé car il était nécessaire à une dépendance. Vous pouvez analyser ces informations et obtenir votre liste de paquets qui ont été explicitement installés.

Commentaires

  • I ‘ Jai ajouté une réponse basée sur votre yum history idée, il compare également les résultats avec la méthode basée sur repoquery . En guise deffet secondaire, jai ‘ étendu ma réponse repoquery.

Réponse

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

Commentaires

  • En parcourant les 5 autres réponses ici, quest-ce que vous remarquez de différent dans votre réponse? Il ny a absolument aucune explication sur pourquoi ou comment votre réponse est meilleure que différente. Ce serait bien si vous pouviez fournir une description de votre réponse qui couvre ces choses.
  • @StephenRauch, cette commande nest ‘ t incluse dans les autres réponses, car il ‘ est un ajout récent de DNF. Le commutateur --userinstalled a simplement été ajouté à dnf en mai . Je ‘ lai testé, et il donne des résultats précis. Modulez les packages kernel / kernel-core / kernel-modules qui ne sont ‘ pas vraiment installés par lutilisateur. Il contient également tous les packages *-debuginfo – mais ils peuvent être facilement filtrés, si nécessaire.
  • @maxschlepzig, merci pour le retour, mais cétait en fait un une petite question rhétorique, essayant déduquer / inciter le répondant à expliquer cela dans la réponse.
  • @StephenRauch, assez bien, une modification serait certainement appropriée et me permettrait de la marquer comme acceptée répondre.

Réponse

Pour répertorier les packages que vous avez installés, essayez ceci one-liner :

alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g"" 

Résultat:

# 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: il ne montre pas les dépendances

PS2: il est trié par ordre alphabétique

PS3: il ne montre pas si vous avez supprimé le paquet plus tard

Réponse

Ce que jai fait (jai oublié les détails, et je « suis paresseux, donc …

Récupère tous les paquets installés: rpm -qa > file

Utilisez sed(1) pour supprimer les numéros de version et autres (conserver larchitecture, si nécessaire). Cela nécessitait un quelques itérations pour faire les choses correctement, vous voulez remplacer le dernier tronçon de -[0-9.]-[0-9].fc23 ou similaire par rien, mais il y a aussi des « numéros » de version amusants.

Après en installant normalement, faites un yum -y install $(< file) (ou dnf, selon les besoins).

Vous « obtiendrez des retombées des paquets qui nexistent pas ymore, ou changé de nom, ou ont été remplacés par dautres.

Commentaires

  • Ok, mais cela marquera tous les packages précédemment installés comme installés par lutilisateur sur lhôte de destination. Même sils nétaient à lorigine installés quen tant que dépendance.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *