J'ai un système Fedora (A) sur lequel j'ai installé des packages au fil du temps. Maintenant, je veux installer Fedora sur un autre ordinateur (B) et je veux y installer les mêmes packages.
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 packages sur le nouveau système Fedora 19 (B) :je veux juste installer les packages du système A qui ont été explicitement mentionnés sur une installation dnf install
(ou yum install
) en ligne de commande - et non celles qui ont été installées en tant que dépendances !
Pourquoi? Parce que peut-être que les dépendances ont changé - et je ne veux pas installer de dépendances obsolètes sur le nouveau système. De plus, lorsque je supprime des packages, je souhaite également supprimer les dépendances installées automatiquement (éventuellement) alors inutiles (c'est-à-dire les orphelins).
J'ai trouvé la dnf list installed
- mais il ne s'affiche pas si un package a été explicitement sélectionné ou simplement installé en raison d'une dépendance.
Comment puis-je obtenir ces informations sur Fedora ?
Quelle est la méthode Fedora/dnf pour répliquer les sélections de packages ?
Réponse acceptée :
Depuis Fedora 26, le Dnf repoquery
la sous-commande prend en charge une nouvelle option pour répertorier tous les packages installés par l'utilisateur :
$ 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 packages debuginfo. Le grep supplémentaire dans l'exemple ci-dessus les filtre.
Pour installer la liste sur l'hôte B :
$ < pkgs_a.lst xargs dnf -y install
API DNF
Avec les versions récentes de Dnf (par exemple Fedora>=23), la base de données de packages peut être interrogée pour les noms de packages installés par l'utilisateur via l'API 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
s'interrompt si un ou plusieurs packages ne sont plus disponibles. Alternativement, dnf peut être forcé d'installer tous ceux qui restent :
# 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 d'autres distributions.
historique installé par l'utilisateur
Sur Fedora 23 et versions ultérieures, Dnf fournit le
# dnf history userinstalled
commande qui répertorie tous les packages installés par l'utilisateur. À partir de 2016-11, son utilité est limitée car il n'y a aucun moyen de contrôler sa sortie et il imprime des packages entièrement qualifiés (c'est-à-dire incluant les informations de version).
Limitations installées par l'utilisateur
Notez que le marquage des packages comme installés par l'utilisateur a certaines limitations sur certaines versions de Fedora, pour les systèmes de l'ère Fedora 23 (à partir d'environ 2015-11), les problèmes suivants sont pertinents :
- les packages installés via l'interface graphique ne sont pas inclus
- les packages installés via le gestionnaire command-not-found ne sont pas inclus
- certains packages installés par défaut (par anaconda) sont inclus
Repoquery
Sur les anciens systèmes Fedora, où Dnf, l'API Dnf et dnf history userinstalled
ne sont pas disponibles, on peut utiliser le dépôt à 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 packages qui ont été installés par le programme d'installation. L'ID utilisateur de l'installateur était apparemment stocké sous le nom 4294967295 - vous pouvez également écrire quelque chose comme ($3 == 0 || $3 == your-user-id)
.
Notez que cette commande fonctionne sur Fedora jusqu'à la version 21 - mais par ex. pas sur la version 23, car la commande repoquery
a été remplacé par dnf repoquery
. Et dnf repoquery
ne comprend pas le %{yumdb_info.reason}
balise.