Alle Abhängigkeiten mit yumdownloader herunterladen, auch wenn bereits installiert?


34

Gibt es eine Möglichkeit, alle Abhängigkeiten mit yumdownloader herunterzuladen, auch wenn sie bereits installiert sind?

Ich versuche, ein lokales Repo zu erstellen und möchte nur die Pakete einschließen, die wir benötigen.

Antworten:


29

Sie können repotrackstattdessen wie folgt verwenden:

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

Leider gibt es einen Fehler mit der -aFlagge (Bogen). Es wird i686 und x86_64 herunterladen.

So beheben Sie das Problem:

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

Mit können repoquerySie eine Liste der Gruppenpakete abrufen:

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

Was Sie in repotrack einspeisen können:

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

Aktualisiert, um stattdessen Repotrack zu verwenden. Die --requires --resolveOption von repoquery funktioniert nicht rekursiv für deps.
Luke

--recursiveFügen Sie dem Befehl repoquery die Option hinzu, damit er rekursiv funktioniert.
ZaSter

Das Reparieren von repotrack auf die oben vorgeschlagene Weise hat bei mir nicht funktioniert: Für x86_64 arch wurde kein Paket heruntergeladen. Trotzdem +1 für einen guten Tipp: Mit repotrack könnte man sowohl i386 als auch x86_64 herunterladen und unnötige Teile herausfiltern.
Alexander Vasiljev

@ Luke, wie man Fixteil benutzt ... bedeutet, wo man ausführt, wenn Bedingung erwähnt wird ... und was, wenn ich nur nach einem bestimmten Paket im Repoquery-Befehl suchen muss.
AVJ,

2
Ich würde nicht empfehlen, den Quellcode zu ändern. Wenn dies wirklich ein Fehler ist, sollte er in das vorgelagerte yum-utilsProjekt eingefügt werden . Der Grund, warum mehr Pakete als erwartet heruntergeladen werden, ist, dass die Funktion rpmUtils.arch.getArchList()alle kompatiblen Architekturen für die angegebene zurückgibt. Es enthält zum Beispiel die noarchArchitektur, die von x86_64Paketen benötigt werden kann. Sie können die Quelle überprüfen: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Samuel Phan

18

Zu jedermanns Information, yumdownloadermacht den Job nicht. Für alle, die Erfahrung in der Paketverwaltung mit `yum haben, ist es natürlich zu erwarten, dass die folgende Befehlszeile ein Paket-RPM und alle seine Abhängigkeiten rekursiv herunterlädt:

yumdownloader --resolve <package>

Aber das tut es nicht. Möglicherweise werden Abhängigkeiten der ersten Ebene oder solche gedruckt, die noch nicht installiert sind. Ich bin mir nicht sicher.

Hier ist eine Methode, die unter CentOS 6.5 funktioniert. Befolgen Sie die Schritte, um das yumvon Red Hat bereitgestellte Downloadonly-Plugin zu installieren . Grundsätzlich tun Sie unter CentOS 6.x Folgendes:

$ sudo yum install yum-plugin-downloadonly.noarch

Dann nutzen Sie das Plugin in Kombination mit dem --installrootSchalter von yum. Dadurch wird verhindert yum, dass bereits auf dem System installierte Abhängigkeiten aufgelöst und übersprungen werden.

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

Sie haben die RPMs des Pakets <package>und alle Abhängigkeiten im Verzeichnis heruntergeladen <rpm_dir>. Beispiel mit Git:

$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
  --downloadonly --downloaddir rpms/ git

Wie können Sie diesen Prozess umkehren und das Blattpaket mithilfe der lokalen Abhängigkeiten installieren?
Bias

centos65 sudo yum install yum-plugin-downloadonly.noarchsagt No package yum-plugin-downloadonly.noarch available.was zu tun ist?
Howard Lee

@ HowardLee Running yum search yumdownloaderkehrt zurückyum-utils.noarch
Ali

5
Ich erhalte diesen Fehler, Cannot find a valid baseurl for repo: base/$releasever/x86_64wenn ich das --installrootFlag hinzufüge .
Mike S

Das Cannot find a valid baseurl...Problem auf Centos 7 wurde mit der Lösung auf diesem Link--releasever=/
beseitigt

2

Mir ist klar, dass der Thread alt ist, aber falls jemand darüber stolpert, können Sie yum verwenden, um das gewünschte Verhalten zu erreichen.

Zuerst das Downloadonly Plugin installieren (Anleitung für RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Führen Sie anschließend den Befehl wie folgt aus:

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

Wenn Sie ignorieren, wird das --downloaddirYUM automatisch heruntergeladen/var/cache/yum

Wenn Sie yumdownloader nicht speziell verwenden müssen, ist dies meiner Meinung nach der einfachste Weg, um das Ziel zu erreichen.


4
Dies ist immer noch ein Problem, wenn das Paket bereits installiert ist
Zack S

2

Wenn Sie aus der Zukunft (Fedora 23+) kommen, in der yum durch dnf ersetzt wird, ist dieses Bash-Skript möglicherweise hilfreich.

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

9
Ist es die Zukunft schon?
Kirkpatt

1

Ich fand es in der Praxis schwierig, ein solches Repo zu bauen. Wir haben dieses Repo gebaut, weil:

  • Wir wollten Pakete aus einer lokalen Quelle für mehrere Server abrufen.
  • Es dürfen nur vertrauenswürdige Pakete installiert werden.

Die Probleme, die wir behandeln können, waren:

  • Pakete auf dem neuesten Stand halten. Abhängigkeiten ändern sich. Einige werden hinzugefügt, andere entfernt.
  • Hinzufügen neuer Pakete, die wir installieren wollten.
  • Die oben genannten Herausforderungen haben den Prozess des Push-Vorgangs kritischer Aktualisierungen verlängert.

Am Ende bestand die bessere Lösung für unser Problem darin, die offiziellen Repos zu vertreten und die von uns verwendeten Pakete zwischenzuspeichern. Das funktioniert gut, weil:

  • Nur Pakete, die wir tatsächlich verwenden, werden lokal gespeichert.
  • Alte Pakete verfallen automatisch.
  • Wenn ein Paket zum ersten Mal verwendet wird, wird es aus dem offiziellen Repository abgerufen, nachfolgende Anforderungen werden jedoch aus dem Cache abgerufen.
  • Das Vertrauen in die offiziellen Repos reichte für das Vertrauen aus. Unser Proxy-Spiegel zieht nur Pakete aus vertrauenswürdigen Quellen.

Wir haben Nginx und die integrierte Proxy-Unterstützung verwendet.


Nginx Proxy klingt nach einer großartigen Idee. Besserer langfristiger Support und mehr Pakete. Wäre hilfreich, wenn du ein paar Details hinzufügst, vielleicht eine Anleitung zum Verlinken oder so
oden

0

Aufbauend auf Lukes Antwort und den Kommentaren ...

Zum Zeitpunkt des Schreibens repotrackwerden alle folgenden Architekturen übereinstimmen , wenn x86_64angegeben wird: x86_64, athlon, i686, i586, i486, i386, und noarch.

Für meine Zwecke interessiere ich mich nur für x86_64und noarchPakete, und ich weiß, dass meine Distribution keine athlonPakete enthält.

Der folgende Befehl ruft eine Liste der Paket-URLs ab, filtert i?86Architekturen heraus und druckt die Namen der Pakete beim Herunterladen aus:

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'

Beachten Sie, dass Sie repotracknicht gewarnt werden, wenn in Ihren aktivierten Repos kein Paket gefunden wird, das eine Abhängigkeit erfüllt. Es überspringt es leise.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.