web-dev-qa-db-fra.com

Télécharger toutes les dépendances avec yumdownloader, même si elles sont déjà installées?

Existe-t-il un moyen 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 dépôt local et je souhaite uniquement inclure les packages dont nous avons besoin.

34
Luke

Vous pouvez utiliser repotrack à la place comme ceci:

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

Malheureusement, il y a un bug avec le -a drapeau (Arch). Il va télécharger 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 repoquery pour obtenir une liste des packages de groupe:

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

Que vous pouvez alimenter dans repotrack:

repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages
29
Luke

Pour l'information de tous, yumdownloader ne fait pas l'affaire. Pour toute personne ayant une certaine expérience dans la gestion de packages avec `yum, il est naturel de s'attendre à ce que la ligne de commande suivante télécharge récursivement un RPM de package et toutes ses dépendances:

yumdownloader --resolve <package>

Mais ce n'est pas le cas. Peut-être qu'il imprime des 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 pour yum comme indiqué par Red Hat . Fondamentalement, sur CentOS 6.x, faites:

$ Sudo yum install yum-plugin-downloadonly.noarch

Utilisez ensuite le plugin en combinaison avec le --installroot changer de yum. Cela empêche yum de résoudre puis 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
18
pdp

Je me rends compte que le fil est vieux, mais si quelqu'un tombe dessus, vous pouvez utiliser yum pour accomplir le comportement souhaité.

Installez d'abord le plugin downloadonly (instructions pour RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Exécutez ensuite la commande comme suit:

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

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

Donc, à moins que vous n'utilisiez spécifiquement yumdownloader, je pense que ce serait le moyen le plus simple d'atteindre l'objectif.

2

Si vous venez du futur (Fedora 23+), où yum est remplacé par dnf, vous pourriez trouver ce script bash 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
2
Adam Kurkiewicz

J'ai trouvé que dans la pratique, la construction d'un référentiel comme celui-ci était difficile à maintenir. Nous avons construit ce dépôt car:

  • Nous voulions extraire les packages d'une source locale pour plusieurs serveurs.
  • Autorisez uniquement l'installation de packages approuvé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 packages que nous voulions installer.
  • Les défis ci-dessus ont allongé le processus de transmission des mises à jour critiques.

En fin de compte, la meilleure solution à notre problème était de proxy les dépôts officiels et de mettre en cache les packages que nous avons utilisés. Cela fonctionne bien parce que:

  • Seuls les packages que nous utilisons sont stockés localement.
  • Les anciens packages expirent automatiquement.
  • Lorsqu'un package est utilisé pour la première fois, il est extrait du référentiel officiel, mais les requêtes suivantes proviennent du cache.
  • Faire confiance au (x) référentiel (s) officiel (aux) était suffisant pour faire confiance. Notre miroir proxy extrait uniquement les packages de sources fiables.

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

1
Luke

Essayez aussi

repoquery -R --resolve --recursive <name> | xargs -r yumdownloader

par exemple.:

repoquery -R --resolve --recursive firefox | xargs -r yumdownloader

Source: https://www.thegeekdiary.com/downloading-rpm-packages-with-dependencies-yumdownloader-vs-yum-downloadonly-vs-repoquery/

0
can.

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

À ce jour, repotrack correspondra à toutes les architectures suivantes lorsque x86_64 est spécifié: x86_64, athlon, i686, i586, i486, i386 et noarch.

Pour mes besoins, je ne suis intéressé que par x86_64 et noarch packages, et je sais que ma distribution n'a pas de packages athlon.

La commande suivante obtient une liste des URL de package, filtre i?86 architectures 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 repotrack ne vous avertit pas s'il ne trouve pas de package satisfaisant une dépendance dans votre référentiel activé. Il l'ignore silencieusement.

0
M. Dudley