Pobierz wszystkie zależności za pomocą yumdownloadera, nawet jeśli jest już zainstalowany?


34

Czy istnieje sposób na pobranie wszystkich zależności za pomocą yumdownloadera, nawet jeśli są już zainstalowane?

Próbuję utworzyć lokalne repozytorium i chcę tylko uwzględnić potrzebne pakiety.

Odpowiedzi:


29

Możesz użyć repotrackzamiast tego w następujący sposób:

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

Niestety wystąpił błąd z -aflagą (łukiem). Pobierze i686 i x86_64.

Oto jak to naprawić:

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

Możesz użyć, repoqueryaby uzyskać listę pakietów grupowych:

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

Które możesz dodać do repotrack:

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

Zaktualizowano, aby zamiast tego używać repotrack. --requires --resolveopcja repoquery nie działa rekurencyjnie dla deps.
Łukasz

dodaj --recursiveopcję do polecenia repoquery, aby rekurencyjnie działała.
ZaSter

Naprawianie repotrack w sposób sugerowany powyżej nie działało dla mnie: żaden pakiet nie został pobrany dla arch x86_64. W każdym razie +1 za dobrą wskazówkę: dzięki repotrack można pobrać zarówno i386, jak i x86_64 i odfiltrować niepotrzebną część.
Alexander Vasiljev

@ Luke, jak używać części naprawczej ... oznacza, gdzie wykonać, jeśli wymieniony jest warunek ... a co, jeśli muszę sprawdzić tylko pewien pakiet w poleceniu repoquery.
AVJ

2
Nie zalecałbym zmiany kodu źródłowego. Jeśli naprawdę jest to błąd, należy go zgłosić do yum-utilsprojektu nadrzędnego . Powodem, dla którego pobiera więcej pakietów niż oczekiwano, jest to, że funkcja rpmUtils.arch.getArchList()zwraca wszystkie kompatybilne architektury dla danego. Obejmuje na przykład noarcharchitekturę, która może być potrzebna x86_64pakietom. Możesz sprawdzić źródło: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Samuel Phan

18

Dla informacji wszystkich yumdownloadernie wykonuje pracy. Dla każdego, kto ma pewne doświadczenie w zarządzaniu pakietami z `yum, naturalne jest oczekiwanie, że następujący wiersz poleceń pobierze rekurencyjnie pakiet RPM i wszystkie jego zależności:

yumdownloader --resolve <package>

Ale tak nie jest. Może to być drukowanie zależności pierwszego poziomu lub tych, które nie są jeszcze zainstalowane. Nie jestem pewien.

Oto jedna metoda, która działa na CentOS 6.5. Postępuj zgodnie z instrukcjami, aby zainstalować wtyczkę downloadonly dla yumpodaną przez Red Hat . Zasadniczo na CentOS 6.x:

$ sudo yum install yum-plugin-downloadonly.noarch

Następnie skorzystaj z wtyczki w połączeniu z --installrootprzełącznikiem yum. Zapobiega to yumrozwiązywaniu, a następnie pomijaniu zależności, które są już zainstalowane w systemie.

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

Można by pobrać RPM pakietu, <package>a wszystkie jego zależności w katalogu <rpm_dir>. Przykład z Git:

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

Jak odwrócić ten proces i zainstalować pakiet liści przy użyciu lokalnych zależności?
stronniczość

centos65 sudo yum install yum-plugin-downloadonly.noarchmówi, No package yum-plugin-downloadonly.noarch available.co robić?
Howard Lee

@HowardLee Running yum search yumdownloaderzwracayum-utils.noarch
Ali

5
Ten błąd Cannot find a valid baseurl for repo: base/$releasever/x86_64pojawia się po dodaniu --installrootflagi.
Mike S,

Pozbyłem się Cannot find a valid baseurl...problemu z Centos 7 dzięki rozwiązaniu pod tym linkiem : Dodaj --releasever=/parametr
Chirlo

2

Zdaję sobie sprawę, że wątek jest stary, ale na wypadek, gdyby ktoś natknął się na to, możesz użyć yum, aby osiągnąć pożądane zachowanie.

Najpierw instynktownie plugin do pobrania (instrukcje dla RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Następnie uruchom polecenie w następujący sposób:

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

Jeśli zignorujesz, --downloaddiryum automatycznie pobierze do/var/cache/yum

Więc chyba, że ​​musisz specjalnie używać yumdownloadera, myślę, że byłby to najprostszy sposób na osiągnięcie celu.


4
Jest to nadal problem, jeśli pakiet jest już zainstalowany
Zack S

2

Jeśli jesteś z przyszłości (Fedora 23+), gdzie yum zastępuje się dnf, ten skrypt bash może ci się przydać.

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

rpm Resolver:

#!/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
Czy to już przyszłość?
kirkpatt

1

Odkryłem, że w praktyce budowanie takiego repozytorium jest trudne do utrzymania. Zbudowaliśmy to repozytorium, ponieważ:

  • Chcieliśmy pobrać pakiety z lokalnego źródła dla wielu serwerów.
  • Zezwalaj tylko na instalowanie zaufanych pakietów.

Problemy, które możemy rozwiązać, to:

  • Aktualizowanie paczek. Zależności zmieniają się. Niektóre są dodawane, inne usuwane.
  • Dodanie nowych pakietów, które chcieliśmy zainstalować.
  • Powyższe wyzwania wydłużyły proces przekazywania krytycznych aktualizacji.

Ostatecznie lepszym rozwiązaniem naszego problemu było proxy oficjalnych repozytoriów i buforowanie używanych pakietów. Działa to dobrze, ponieważ:

  • Tylko pakiety, których faktycznie używamy, są przechowywane lokalnie.
  • Stare pakiety wygasają automatycznie.
  • Kiedy pakiet jest używany po raz pierwszy, pobiera go z oficjalnego repozytorium, ale kolejne żądania pochodzą z pamięci podręcznej.
  • Zaufanie do oficjalnych repozytoriów było wystarczające do zaufania. Nasze lustro proxy pobiera pakiety tylko z zaufanych źródeł.

Użyliśmy Nginx i wbudowanej obsługi proxy.


Nginx proxy to świetny pomysł. Lepsze długoterminowe wsparcie i odbiór kolejnych pakietów. Byłoby pomocne, jeśli dodałeś więcej szczegółów, może jak link lub coś
od

0

Opierając się na odpowiedzi Luke'a i komentarzach ...

W chwili pisania tego repotrackbędzie pasował do wszystkich następujących architektur gdy x86_64jest określona: x86_64, athlon, i686, i586, i486, i386, i noarch.

Dla moich celów Jestem zainteresowany tylko x86_64i noarchopakowań, a wiem, że moja dystrybucja nie ma żadnych athlonpakietów.

Następujące polecenie pobiera listę adresów URL pakietów, odfiltrowuje i?86architektury i drukuje nazwy pakietów podczas pobierania:

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'

Pamiętaj, że repotracknie ostrzega cię, jeśli nie może znaleźć pakietu, który spełnia zależność w twoich włączonych repozytoriach. Po cichu to pomija.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.