¿Descargue todas las dependencias con yumdownloader, incluso si ya está instalado?

34

¿Hay alguna manera de descargar todas las dependencias con yumdownloader, incluso si ya están instaladas?

Estoy tratando de crear un repositorio local y solo quiero incluir los paquetes que necesitamos.

Luke
fuente

Respuestas:

29

En su repotracklugar, puede usar así:

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

Desafortunadamente hay un error con la -abandera (arco). Descargará i686 y x86_64.

Aquí se explica cómo solucionarlo:

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

Puede usar repoquerypara obtener una lista de paquetes grupales:

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

Que puede alimentar en repotrack:

repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages
Luke
fuente
Actualizado para usar repotrack en su lugar. La --requires --resolveopción de repoquery no funciona de forma recursiva para los deps.
Lucas
agregue la --recursiveopción al comando repoquery para que funcione recursivamente.
ZaSter
Arreglar repotrack de la manera sugerida anteriormente no funcionó para mí: no se descargó ningún paquete para x86_64 arch. De todos modos +1 para un buen consejo: con repotrack uno podría descargar tanto i386 como x86_64 y filtrar partes innecesarias.
Alexander Vasiljev
@Luke cómo usar la parte de reparación ... significa dónde ejecutar si se menciona la condición ... y qué pasa si necesito verificar solo cierto paquete en el comando repoquery.
AVJ
2
No recomendaría cambiar el código fuente. Si realmente, esto es un error, debe archivarse en el yum-utilsproyecto ascendente . La razón por la que descarga más paquetes de lo esperado es porque la función rpmUtils.arch.getArchList()devuelve todas las arquitecturas compatibles para el dado. Incluye, por ejemplo, la noarcharquitectura que pueden necesitar los x86_64paquetes. Puede consultar la fuente: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Samuel Phan
18

Para información de todos, yumdownloaderno hace el trabajo. Para cualquier persona con alguna experiencia en administración de paquetes con `yum, es natural esperar que la siguiente línea de comandos descargue recursivamente un paquete RPM y todas sus dependencias:

yumdownloader --resolve <package>

Pero no lo hace. Puede ser que imprima dependencias de primer nivel o aquellas que aún no están instaladas. No estoy seguro.

Aquí hay un método que funciona en CentOS 6.5. Siga los pasos para instalar el plugin para DownloadOnly yumdada por Red Hat . Básicamente, en CentOS 6.x, haga:

$ sudo yum install yum-plugin-downloadonly.noarch

Luego utilice el complemento en combinación con el --installrootinterruptor de yum. Esto evita que se yumresuelva y luego salte las dependencias que ya están instaladas en el sistema.

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

Debería descargar los RPM del paquete <package>y todas sus dependencias en el directorio <rpm_dir>,. Ejemplo, con Git:

$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
  --downloadonly --downloaddir rpms/ git
pdp
fuente
¿Cómo invierte este proceso e instala el paquete de hoja utilizando las dependencias locales?
sesgo
centos65 sudo yum install yum-plugin-downloadonly.noarchdice No package yum-plugin-downloadonly.noarch available.qué hacer?
Howard Lee
@HowardLee Running yum search yumdownloaderregresayum-utils.noarch
Ali
55
Recibo este error Cannot find a valid baseurl for repo: base/$releasever/x86_64cuando agrego la --installrootbandera.
Mike S
Se libró del Cannot find a valid baseurl...problema en Centos 7 con la solución en este enlace : Agregue el --releasever=/parámetro
Chirlo
2

Me doy cuenta de que el hilo es antiguo, pero en caso de que alguien se encuentre con esto, puede usar yum para lograr el comportamiento deseado.

Primero instale el complemento de descarga solamente (instrucciones para RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Luego ejecute el comando de la siguiente manera:

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

Si ignora el --downloaddiryum se descargará automáticamente a/var/cache/yum

Entonces, a menos que necesite usar yumdownloader específicamente, creo que esta sería la forma más simple de lograr el objetivo.

SudoMakeMeASandwhich
fuente
44
Esto sigue siendo un problema si el paquete ya está instalado
Zack S
2

Si eres del futuro (Fedora 23+), donde yum está siendo reemplazado por dnf, es posible que este script bash sea útil.

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
fuente
99
¿Ya es el futuro?
kirkpatt
1

Encontré que en la práctica construir un repositorio como este es difícil de mantener. Construimos este repositorio porque:

  • Queríamos extraer paquetes de una fuente local para múltiples servidores.
  • Solo permita la instalación de paquetes de confianza.

Los problemas que podemos enfrentar fueron:

  • Mantener paquetes actualizados. Las dependencias cambian. Algunos se agregan, otros se eliminan.
  • Añadiendo nuevos paquetes que queríamos instalar.
  • Los desafíos anteriores alargaron el proceso de impulsar actualizaciones críticas.

Al final, la mejor solución a nuestro problema fue proxy de los repositorios oficiales y almacenar en caché los paquetes que utilizamos. Esto funciona bien porque:

  • Solo los paquetes que realmente utilizamos se almacenan localmente.
  • Los paquetes viejos caducan automáticamente.
  • Cuando se usa un paquete por primera vez, se extrae del repositorio oficial, pero las solicitudes posteriores provienen del caché.
  • Confiar en los repositorios oficiales era suficiente para confiar. Nuestro espejo proxy solo extrae paquetes de fuentes confiables.

Utilizamos Nginx y el soporte de proxy incorporado.

Luke
fuente
El proxy nginx suena como una gran idea. Mejor soporte a largo plazo y recoge más paquetes. Sería de gran ayuda si se ha añadido ABIT más detalles, tal vez una forma de enlace o algo
Oden
0

Sobre la base de la respuesta de Luke y los comentarios ...

Al escribir estas líneas repotrackcoincidirá con todas las siguientes arquitecturas cuando x86_64se especifica: x86_64, athlon, i686, i586, i486, i386, y noarch.

Para mis propósitos sólo estoy interesado en x86_64y noarchpaquetes, y sé que mi distribución no tiene ningún athlonpaquetes.

El siguiente comando obtiene una lista de URL de paquetes, filtra i?86arquitecturas e imprime los nombres de los paquetes a medida que se descargan:

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'

Tenga en cuenta que repotrackno le advierte si no puede encontrar un paquete que satisfaga una dependencia en sus repositorios habilitados. Lo omite en silencio.

M. Dudley
fuente