Загрузить все зависимости с помощью yumdownloader, даже если он уже установлен?


34

Есть ли способ загрузить все зависимости с помощью yumdownloader, даже если они уже установлены?

Я пытаюсь создать локальный репозиторий и хочу включить только те пакеты, которые нам нужны.

Ответы:


29

Вы можете использовать repotrackвместо этого, как это:

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

К сожалению, есть ошибка с -aфлагом (арка). Он загрузит i686 и x86_64.

Вот как это исправить:

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

Вы можете использовать, repoqueryчтобы получить список групповых пакетов:

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

Который вы можете кормить в repotrack:

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

Обновлено, чтобы использовать repotrack вместо этого. Опция repoquery --requires --resolveне работает рекурсивно для deps.
Люк

добавьте --recursiveопцию в команду repoquery, чтобы она работала рекурсивно.
Застер

Исправление repotrack способом, предложенным выше, у меня не сработало: пакет для x86_64 не был загружен. В любом случае +1 за хороший совет: с помощью repotrack можно загрузить как i386, так и x86_64 и отфильтровать ненужную часть.
Александр Васильев

@ Как использовать часть исправления ... означает, где выполнить, если упомянуто условие ... и что, если мне нужно проверить только определенный пакет в команде repoquery.
AVJ

2
Я бы не рекомендовал менять исходный код. Если это действительно ошибка, она должна быть внесена в основной yum-utilsпроект. Причина, по которой она загружает больше пакетов, чем ожидалось, заключается в том, что функция rpmUtils.arch.getArchList()возвращает все совместимые архитектуры для данной. Он включает в себя, например, noarchархитектуру, которая может понадобиться x86_64пакетам. Вы можете проверить источник: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Сэмюэль Фан

18

Для всеобщего сведения, yumdownloaderне делает работу. Для любого, кто имеет некоторый опыт управления пакетами с помощью `yum, естественно ожидать, что следующая командная строка будет рекурсивно загружать RPM пакета и все его зависимости:

yumdownloader --resolve <package>

Но это не так. Может быть, он печатает зависимости первого уровня или те, которые еще не установлены. Я не уверен.

Вот один метод, который работает на CentOS 6.5. Выполните следующие действия , чтобы установить плагин для downloadonly yumкак дано Red Hat . В основном на CentOS 6.x выполните:

$ sudo yum install yum-plugin-downloadonly.noarch

Затем используйте плагин в сочетании с --installrootпереключателем yum. Это предотвращает yumразрешение и последующее пропускание зависимостей, которые уже установлены в системе.

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

Вы бы скачали RPM пакета <package>и все его зависимости в каталоге <rpm_dir>. Пример с Git:

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

Как вы инвертируете этот процесс и устанавливаете пакет листьев, используя локальные зависимости?
смещение

centos65 sudo yum install yum-plugin-downloadonly.noarchговорит No package yum-plugin-downloadonly.noarch available.что делать?
Говард Ли

@HowardLee Бег yum search yumdownloaderвозвращаетсяyum-utils.noarch
Али

5
Я получаю эту ошибку, Cannot find a valid baseurl for repo: base/$releasever/x86_64когда добавляю --installrootфлаг.
Майк С

Избавился от Cannot find a valid baseurl...проблемы на Centos 7 с помощью решения по этой ссылке : Добавьте --releasever=/параметр
Chirlo

2

Я понимаю, что поток старый, но в случае, если кто-то наткнется на это, вы можете использовать yum для достижения желаемого поведения.

Сначала плагин downloadonly (инструкция для RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Далее выполните команду следующим образом:

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

Если вы проигнорируете, --downloaddiryum автоматически загрузится в/var/cache/yum

Поэтому, если вам не нужно специально использовать yumdownloader, я думаю, что это будет самый простой способ достичь цели.


4
Это все еще проблема, если пакет уже установлен
Zack S

2

Если вы из будущего (Fedora 23+), где yum заменяется на dnf, этот скрипт 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
Это будущее?
Киркпатт

1

Я обнаружил, что на практике создание такого репо сложно поддерживать. Мы создали этот репо, потому что:

  • Мы хотели получить пакеты из локального источника для нескольких серверов.
  • Разрешить установку только доверенных пакетов.

Проблемы, с которыми мы могли столкнуться, были:

  • Поддержание пакетов в актуальном состоянии. Зависимости меняются. Некоторые добавлены, другие удалены.
  • Добавление новых пакетов, которые мы хотели установить.
  • Вышеперечисленные проблемы удлинили процесс продвижения критических обновлений.

В конце концов, лучшим решением нашей проблемы было прокси официальных репозиториев и кеширование пакетов, которые мы использовали. Это хорошо работает, потому что:

  • Только пакеты, которые мы на самом деле используем, хранятся локально.
  • Старые пакеты автоматически истекают.
  • Когда пакет используется впервые, он извлекает данные из официального репо, но последующие запросы приходят из кеша.
  • Доверие к официальному репо было достаточно для доверия. Наше прокси-зеркало извлекает пакеты только из надежных источников.

Мы использовали Nginx и встроенную поддержку прокси.


Прокси nginx звучит как отличная идея. Лучшая долгосрочная поддержка и подбирает больше пакетов. Было бы полезно, если бы вы добавили abit более подробную информацию, может быть, как ссылку или что-то в этом роде
oden

0

Опираясь на ответ Люка и комментарии ...

На это письмо repotrackбудет соответствовать всем из следующих архитектур , когда x86_64указано: x86_64, athlon, i686, i586, i486, i386, и noarch.

Для моих целей меня интересуют только пакеты x86_64и noarchпакеты, и я знаю, что в моем дистрибутиве нет athlonпакетов.

Следующая команда получает список URL-адресов пакетов, отфильтровывает i?86архитектуры и распечатывает имена пакетов по мере их загрузки:

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'

Обратите внимание, что repotrackэто не предупреждает вас, если он не может найти пакет, который удовлетворяет зависимости в ваших включенных репозиториях. Он молча пропускает это.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.