Scarica tutte le dipendenze con yumdownloader, anche se già installato?


34

C'è un modo per scaricare tutte le dipendenze con yumdownloader, anche se sono già installate?

Sto cercando di creare un repository locale e voglio solo includere i pacchetti di cui abbiamo bisogno.

Risposte:


29

Puoi usare repotrackinvece così:

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

Sfortunatamente c'è un bug con la -abandiera (arco). Scaricherà i686 e x86_64.

Ecco come risolverlo:

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

È possibile utilizzare repoqueryper ottenere un elenco di pacchetti di gruppo:

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

Che puoi alimentare in repotrack:

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

Aggiornato per usare invece il repotrack. l' --requires --resolveopzione repoquery non funziona in modo ricorsivo per i deps.
Luca,

aggiungere l' --recursiveopzione al comando repoquery per farlo funzionare in modo ricorsivo.
ZaSter

La correzione del repotrack nel modo suggerito sopra non ha funzionato per me: nessun pacchetto è stato scaricato per l'arco x86_64. Comunque +1 per un buon consiglio: con repotrack si possono scaricare sia i386 che x86_64 e filtrare le parti non necessarie.
Alexander Vasiljev,

@Luke come utilizzare la parte di correzione ... significa dove eseguire se la condizione menzionata ... e cosa succede se devo verificare solo un determinato pacchetto nel comando repoquery.
AVJ

2
Non consiglierei di cambiare il codice sorgente. Se davvero, questo è un bug, dovrebbe essere archiviato nel yum-utilsprogetto a monte . Il motivo per cui scarica più pacchetti del previsto è perché la funzione rpmUtils.arch.getArchList()restituisce tutte le architetture compatibili per quella data. Include ad esempio l' noarcharchitettura che potrebbe essere necessaria per i x86_64pacchetti. Puoi controllare la fonte: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Samuel Phan

18

Per informazioni di tutti, yumdownloadernon fa il lavoro. Per chiunque abbia esperienza nella gestione dei pacchetti con `yum, è naturale aspettarsi che la seguente riga di comando scarichi ricorsivamente un pacchetto RPM e tutte le sue dipendenze:

yumdownloader --resolve <package>

Ma non lo fa. Può essere che stampa le dipendenze di primo livello o quelle che non sono già installate. Non sono sicuro.

Ecco un metodo che funziona su CentOS 6.5. Seguire i passaggi per installare il plug-in downloadonly yumcome indicato da Red Hat . Fondamentalmente, su CentOS 6.x, fai:

$ sudo yum install yum-plugin-downloadonly.noarch

Quindi utilizzare il plug-in in combinazione con l' --installrootopzione di yum. Ciò impedisce yumdi risolvere e quindi saltare le dipendenze che sono già installate sul sistema.

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

Avresti scaricato RPM del pacchetto <package>e tutte le sue dipendenze nella directory <rpm_dir>,. Esempio, con Git:

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

Come invertire questo processo e installare il pacchetto foglia usando le dipendenze locali?
pregiudizio

centos65 sudo yum install yum-plugin-downloadonly.noarchdice No package yum-plugin-downloadonly.noarch available.cosa fare?
Howard Lee,

@HowardLee Running yum search yumdownloaderrestituisceyum-utils.noarch
Ali

5
Ottengo questo errore Cannot find a valid baseurl for repo: base/$releasever/x86_64quando aggiungo la --installrootbandiera.
Mike S,

Sbarazzati del Cannot find a valid baseurl...problema su Centos 7 con la soluzione su questo link : aggiungi il --releasever=/parametro
Chirlo

2

Mi rendo conto che il filo è vecchio, ma nel caso qualcuno si imbattesse in questo, puoi usare yum per realizzare il comportamento desiderato.

Prima installa il plugin downloadonly (istruzioni per RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Quindi eseguire il comando come segue:

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

Se ignori lo --downloaddiryum verrà scaricato automaticamente su/var/cache/yum

Quindi, a meno che non sia necessario utilizzare yumdownloader specificamente, penso che questo sarebbe il modo più semplice per raggiungere l'obiettivo.


4
Questo è ancora un problema se il pacchetto è già installato
Zack S

2

Se vieni dal futuro (Fedora 23+), dove yum viene sostituito con dnf, potresti trovare utile questo script bash .

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
È ancora il futuro?
Kirkpatt,

1

Ho scoperto che in pratica costruire un repository come questo è difficile da mantenere. Abbiamo creato questo repository perché:

  • Volevamo estrarre i pacchetti da una fonte locale per più server.
  • Consenti solo l'installazione di pacchetti attendibili.

I problemi che possiamo affrontare sono stati:

  • Mantenere i pacchetti aggiornati. Le dipendenze cambiano. Alcuni vengono aggiunti, altri vengono rimossi.
  • Aggiunta di nuovi pacchetti che volevamo installare.
  • Le suddette sfide hanno allungato il processo di invio di aggiornamenti critici.

Alla fine la soluzione migliore al nostro problema era quella di delegare i repository ufficiali e memorizzare nella cache i pacchetti che abbiamo usato. Questo funziona bene perché:

  • Solo i pacchetti che utilizziamo effettivamente sono archiviati localmente.
  • I vecchi pacchetti scadono automaticamente.
  • Quando un pacchetto viene utilizzato per la prima volta, viene prelevato dal repository ufficiale, ma le richieste successive provengono dalla cache.
  • La fiducia nei repo ufficiali è stata sufficiente per la fiducia. Il nostro mirror proxy estrae i pacchetti solo da fonti attendibili.

Abbiamo usato Nginx e il supporto proxy integrato.


Il proxy nginx sembra un'ottima idea. Migliore supporto a lungo termine e raccoglie più pacchetti. Sarebbe utile se si è aggiunto abit maggiori dettagli, forse un modo per link o qualcosa
Oden

0

Basandosi sulla risposta di Luke e sui commenti ...

Al momento della stesura repotrackcorrisponderà tutte le seguenti architetture quando x86_64viene specificato: x86_64, athlon, i686, i586, i486, i386, e noarch.

Per i miei scopi Sono interessato solo in x86_64e noarchpacchetti, e so che la mia distribuzione non ha athlonpacchetti.

Il seguente comando ottiene un elenco di URL dei pacchetti, filtra le i?86architetture e stampa i nomi dei pacchetti mentre vengono scaricati:

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'

Nota che repotracknon ti avvisa se non riesce a trovare un pacchetto che soddisfa una dipendenza nei repository abilitati. Lo salta silenziosamente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.