Télécharger toutes les dépendances avec yumdownloader, même s'il est déjà installé?

34

Est-il possible de télécharger toutes les dépendances avec yumdownloader, même si elles sont déjà installées?

J'essaie de créer un référentiel local et ne souhaite inclure que les packages dont nous avons besoin.

Luke
la source

Réponses:

29

Vous pouvez utiliser à la repotrackplace comme ceci:

repotrack -a x86_64 -p /repos/Packages [packages]

Malheureusement, il y a un bug avec le -adrapeau (arch). Il téléchargera i686 et x86_64.

Voici comment y remédier:

if opts.arch:
    #archlist = []
    #archlist.extend(rpmUtils.arch.getArchList(opts.arch))
    archlist = opts.arch.split(',') # Change to this
else:
    archlist = rpmUtils.arch.getArchList()

Vous pouvez utiliser repoquerypour obtenir une liste des packages de groupe:

repoquery --qf=%{name} -g --list --grouppkgs=all [groups]

Que vous pouvez nourrir dans le repotrack:

repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages
Luke
la source
Mise à jour pour utiliser repotrack à la place. L' --requires --resolveoption de la repoquerie ne fonctionne pas récursivement pour les dép.
Luc
ajoutez l' --recursiveoption à la commande repoquery pour qu'elle fonctionne de manière récursive.
ZaSter
La correction de repotrack de la manière suggérée ci-dessus ne fonctionnait pas pour moi: aucun package n'a été téléchargé pour x86_64 arch. Quoi qu'il en soit, +1 pour un bon conseil: avec repotrack, vous pouvez télécharger à la fois i386 et x86_64 et filtrer les parties superflues.
Alexander Vasiljev
@Luke comment utiliser la partie fixe ... signifie où exécuter si la condition mentionnée ... et si je dois vérifier seulement certains packages dans la commande de repoquerie.
AVJ
2
Je ne recommanderais pas de changer le code source. S'il s'agit vraiment d'un bogue, il convient de le classer dans le yum-utilsprojet en amont . La raison pour laquelle il télécharge plus de paquets que prévu est que la fonction rpmUtils.arch.getArchList()renvoie toutes les architectures compatibles pour celle donnée. Cela inclut par exemple l' noarcharchitecture qui peut être nécessaire aux x86_64paquets. Vous pouvez vérifier la source: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Samuel Phan Le
18

Pour l'information de tous, yumdownloaderne fait pas le travail. Pour ceux qui ont une expérience de la gestion de paquets avec `yum, il est naturel de s'attendre à ce que la ligne de commande suivante télécharge de manière récursive un RPM de paquet et toutes ses dépendances:

yumdownloader --resolve <package>

Mais ce n'est pas le cas. Peut-être qu’il affiche les dépendances de premier niveau ou celles qui ne sont pas déjà installées. Je ne suis pas sûr.

Voici une méthode qui fonctionne sur CentOS 6.5. Suivez les étapes pour installer le plugin downloadonly yumtel que donné par Red Hat . Fondamentalement, sur CentOS 6.x, faites:

$ sudo yum install yum-plugin-downloadonly.noarch

Ensuite, utilisez le plugin en combinaison avec le --installrootcommutateur de yum. Cela empêche yumde résoudre et ensuite d'ignorer les dépendances déjà installées sur le système.

sudo yum install \
  --installroot=</path/to/tmp_dir> \
  --downloadonly --downloaddir <rpm_dir> <package>

Vous auriez téléchargé les RPM du package <package>et toutes ses dépendances dans le répertoire <rpm_dir>. Exemple, avec Git:

$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
  --downloadonly --downloaddir rpms/ git
pdp
la source
Comment inversez-vous ce processus et installez le paquet feuille en utilisant les dépendances locales?
parti pris
centos65 sudo yum install yum-plugin-downloadonly.noarchdit No package yum-plugin-downloadonly.noarch available.quoi faire?
Howard Lee
@HowardLee Running est de yum search yumdownloaderretouryum-utils.noarch
Ali
5
Je reçois cette erreur Cannot find a valid baseurl for repo: base/$releasever/x86_64lorsque j'ajoute le --installrootdrapeau.
Mike S
Débarrassé du Cannot find a valid baseurl...problème sur Centos 7 avec la solution sur ce lien : Ajouter le --releasever=/paramètre
Chirlo
2

Je me rends compte que le fil est vieux, mais au cas où quelqu'un tomberait dessus, vous pouvez utiliser yum pour accomplir le comportement souhaité.

Commencez par installer le plugin downloadonly (instructions pour RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Ensuite, exécutez la commande comme suit:

$ yum install --downloadonly --downloaddir=/some/arbitrary/path [package]

Si vous ignorez le --downloaddiryum sera automatiquement téléchargé sur/var/cache/yum

Donc, à moins que vous ayez besoin d'utiliser yumdownloader en particulier, je pense que ce serait le moyen le plus simple d'atteindre l'objectif.

SudoMakeMeASandwhich
la source
4
Ceci reste un problème si le paquet est déjà installé
Zack S
2

Si vous venez du futur (Fedora 23+), où miam est remplacé par dnf, ce script bash pourrait vous être utile.

rpmDownloader:

#!/bin/sh
set -xev
rm -fr packages
#dnf download $1 --destdir packages
export PATH=.:$PATH
echo $PWD
DEPS=$(rpmResolver $1)
dnf download $DEPS --destdir packages
rm -fr ${1}-dependencies
mv packages ${1}-dependencies

rpmResolver:

#!/bin/sh
goal=$1
deps=$(rpm -q --qf '[%{REQUIRENAME}\n]'  $goal | egrep -v '^(rpmlib|rtld|config|/)')
goals=
while true; do
  subs=$(rpm -q --qf '%{NAME}\n' --whatprovides $deps | sort -u | tr '\n' ' ')
  if [ ."$subs" = ."$goals" ]; then
    echo -n "$goals "
    exit 0
  fi
  goals=$(echo $goals $subs | tr ' ' '\n' | sort -u | tr '\n' ' ')
  for sub in $subs; do
    subdeps=$(rpm -q --qf '[%{REQUIRENAME}\n]' $sub | egrep -v '^(rpmlib|rtld|config|/)')
    deps=$(echo $deps $subdeps | sort -u)
  done
done
Adam Kurkiewicz
la source
9
Est-ce l'avenir?
Kirkpatt
1

J'ai trouvé que dans la pratique, la construction d'une pension comme celle-ci était difficile à maintenir. Nous avons construit ce repo parce que:

  • Nous voulions extraire des paquets d'une source locale pour plusieurs serveurs.
  • Autorisez uniquement les packages sécurisés à être installés.

Les problèmes que nous pouvons traverser étaient:

  • Garder les colis à jour. Les dépendances changent. Certains sont ajoutés, d'autres sont supprimés.
  • Ajout de nouveaux paquets que nous voulions installer.
  • Les défis ci-dessus ont rallongé le processus d'envoi de mises à jour critiques.

En fin de compte, la meilleure solution à notre problème consistait à utiliser un proxy pour le dépôt officiel et à mettre en cache les packages que nous utilisions. Cela fonctionne bien parce que:

  • Seuls les packages que nous utilisons réellement sont stockés localement.
  • Les anciens paquets expirent automatiquement.
  • Lorsqu'un paquet est utilisé pour la première fois, il est extrait du dépôt officiel, mais les demandes suivantes proviennent du cache.
  • Faire confiance au (x) repo (s) officiel (s) était suffisant pour la confiance. Notre miroir proxy extrait uniquement les paquets de sources fiables.

Nous avons utilisé Nginx et le support de proxy intégré.

Luke
la source
Le proxy nginx semble être une excellente idée. Meilleur support à long terme et ramasse plus de paquets. Serait utile si vous avez ajouté un peu plus de détails, peut-être un moyen de créer un lien ou quelque chose
Oden
0

S'appuyant sur la réponse de Luke et les commentaires ...

A ce jour repotrackcorrespondra à toutes les architectures suivantes quand x86_64est spécifié: x86_64, athlon, i686, i586, i486, i386et noarch.

Pour mes fins , je suis seulement intéressé par x86_64et noarchpaquets, et je sais que ma distribution n'a pas de athlonpaquets.

La commande suivante obtient une liste des URL de packages, filtre les i?86architectures et affiche les noms des packages au fur et à mesure de leur téléchargement:

repotrack --arch=x86_64 --urls gs1000-server \
    | sed '/\.i[3-6]86\.rpm$/d' \
    | xargs -I {} sh -c 'curl -s -O {}; echo {} | rev | cut -d '/' -f 1 | rev'

Notez que repotrackcela ne vous avertit pas s'il ne peut pas trouver un package qui satisfait une dépendance dans vos dépôts activés. Il passe silencieusement.

M. Dudley
la source