Baixe todas as dependências com o yumdownloader, mesmo se já estiver instalado?

34

Existe uma maneira de baixar todas as dependências com o yumdownloader, mesmo se elas já estiverem instaladas?

Estou tentando criar um repositório local e só quero incluir os pacotes que precisamos.

Luke
fonte

Respostas:

29

Você pode usar repotrackassim:

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

Infelizmente, há um erro com a -abandeira (arco). Ele fará o download do i686 e x86_64.

Veja como corrigi-lo:

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

Você pode usar repoquerypara obter uma lista de pacotes de grupos:

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

Que você pode alimentar no repotrack:

repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages
Luke
fonte
Atualizado para usar o repotrack. A --requires --resolveopção repoquery não funciona recursivamente para deps.
Lucas
adicione a --recursiveopção ao comando repoquery para que ele funcione recursivamente.
ZaSter
A correção do repotrack da maneira sugerida acima não funcionou para mim: nenhum pacote foi baixado para o x86_64 arch. Enfim +1 para uma boa dica: com o repotrack, é possível baixar o i386 e o ​​x86_64 e filtrar partes desnecessárias.
Alexander Vasiljev
@ Lucas como usar a parte de correção ... significa onde executar se a condição mencionada ... e se eu precisar verificar apenas um determinado pacote no comando repoquery.
AVJ
2
Eu não recomendaria alterar o código fonte. Se realmente, isso é um bug, ele deve ser arquivado no yum-utilsprojeto upstream . A razão pela qual ele baixa mais pacotes do que o esperado é porque a função rpmUtils.arch.getArchList()retorna todas as arquiteturas compatíveis para o determinado. Inclui, por exemplo, a noarcharquitetura que pode ser necessária para os x86_64pacotes. Você pode verificar a fonte: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/...
Samuel Phan
18

Para informação de todos, yumdownloadernão faz o trabalho. Para qualquer pessoa com alguma experiência em gerenciamento de pacotes com `yum, é natural esperar que a seguinte linha de comando baixe recursivamente um RPM de pacote e todas as suas dependências:

yumdownloader --resolve <package>

Mas isso não acontece. Pode ser que imprima dependências de primeiro nível ou aquelas que ainda não estão instaladas. Não tenho certeza.

Aqui está um método que funciona no CentOS 6.5. Siga as etapas para instalar o plug-in downloadonly yumconforme fornecido pelo Red Hat . Basicamente, no CentOS 6.x, faça:

$ sudo yum install yum-plugin-downloadonly.noarch

Em seguida, use o plug-in em combinação com a --installrootopção de yum. Isso impede a yumresolução e o pulo das dependências já instaladas no sistema.

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

Você faria o download dos RPMs do pacote <package>e de todas as suas dependências no diretório <rpm_dir>. Exemplo, com Git:

$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
  --downloadonly --downloaddir rpms/ git
pdp
fonte
Como você inverte esse processo e instala o pacote folha usando as dependências locais?
viés
centos65 sudo yum install yum-plugin-downloadonly.noarchdiz No package yum-plugin-downloadonly.noarch available.o que fazer?
Howard Lee
@HowardLee Running yum search yumdownloaderretornayum-utils.noarch
Ali
5
Eu recebo esse erro Cannot find a valid baseurl for repo: base/$releasever/x86_64quando adiciono o --installrootsinalizador.
Mike S
Livre-se do Cannot find a valid baseurl...problema no Centos 7 com a solução neste link : Adicione o --releasever=/parâmetro
Chirlo 9/09
2

Sei que o tópico é antigo, mas, caso alguém se depare com isso, você pode usar o yum para realizar o comportamento desejado.

Primeiro instale o plugin downloadonly (instruções para RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Em seguida, execute o comando da seguinte maneira:

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

Se você ignorar, o --downloaddiryum será baixado automaticamente para/var/cache/yum

Portanto, a menos que você precise usar o yumdownloader especificamente, acho que essa seria a maneira mais simples de atingir o objetivo.

SudoMakeMeASequalquer
fonte
4
Este ainda é um problema se o pacote já instalado
Zack S
2

Se você é do futuro (Fedora 23+), onde o yum está sendo substituído pelo dnf, você pode achar esse script bash ú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
fonte
9
Ainda é o futuro?
kirkpatt
1

Descobri que, na prática, é difícil manter um repositório como esse. Criamos esse repositório porque:

  • Queríamos extrair pacotes de uma fonte local para vários servidores.
  • Permitir apenas a instalação de pacotes confiáveis.

Os problemas que podemos encontrar foram:

  • Mantendo os pacotes atualizados. Mudanças de dependências. Alguns são adicionados, outros são removidos.
  • Adicionando novos pacotes que queríamos instalar.
  • Os desafios acima prolongaram o processo de envio de atualizações críticas.

No final, a melhor solução para o nosso problema foi proxy dos repositórios oficiais e armazenar em cache os pacotes que usamos. Isso funciona bem porque:

  • Somente pacotes que realmente usamos são armazenados localmente.
  • Pacotes antigos expiram automaticamente.
  • Quando um pacote é usado pela primeira vez, ele recebe do repositório oficial, mas os pedidos subsequentes vêm do cache.
  • Confiar nos repositórios oficiais era suficiente para confiar. Nosso espelho de proxy extrai apenas pacotes de fontes confiáveis.

Usamos o Nginx e o suporte a proxy incorporado.

Luke
fonte
O proxy nginx parece uma ótima ideia. Melhor suporte a longo prazo e pega mais pacotes. Seria útil se você adicionou ABIT mais detalhes, talvez um como link ou algo
Oden
0

Com base na resposta de Lucas e nos comentários ...

Como desta escrita repotrackirá corresponder a todos os seguintes arquiteturas quando x86_64é especificada: x86_64, athlon, i686, i586, i486, i386, e noarch.

Para os meus propósitos eu só estou interessado em x86_64e noarchpacotes, e eu sei que a minha distribuição não tem nenhum athlonpacotes.

O comando a seguir obtém uma lista de URLs de pacotes, filtra i?86arquiteturas e imprime os nomes dos pacotes conforme eles são baixados:

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'

Observe que repotrackele não avisa se ele não consegue encontrar um pacote que satisfaça uma dependência nos seus repositórios ativados. Ignora-o silenciosamente.

M. Dudley
fonte