Завантажте всі залежності за допомогою 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]

Що ви можете подати у репортаж:

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

Оновлено, щоб замість цього використовувати репортаж. --requires --resolveопція repoquery не працює рекурсивно для deps.
Лука

додайте --recursiveпараметр до команди repoquery, щоб змусити її працювати рекурсивно.
ZaSter

Виправлення репортажу способом, запропонованим вище, для мене не спрацювало: жоден пакет не був завантажений для арки x86_64. У будь-якому разі +1 - корисна порада: за допомогою репортажу можна завантажити i386 та x86_64 та відфільтрувати непотрібну частину.
Олександр Васильєв

@Luke, як використовувати fix fix ... означає, де виконати, якщо вказана умова ... і що, якщо мені потрібно перевірити лише певний пакет у команді 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. Виконайте вказівки, щоб встановити плагін для завантаження, 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>

Ви б завантажили RPMs пакета, <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
Ali

5
Я отримую цю помилку, Cannot find a valid baseurl for repo: base/$releasever/x86_64коли додаю --installrootпрапор.
Майк S

Позбувшись від Cannot find a valid baseurl...проблеми на Centos 7 з розчином по цьому посиланню : Додати --releasever=/параметр
Chirlo

2

Я усвідомлюю, що нитка стара, але у випадку, якщо хтось наткнеться на це, ви можете використати yum для досягнення бажаної поведінки.

Спочатку встановіть плагін для завантаження (інструкції для 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 може бути корисним.

rpmЗавантажувач:

#!/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
Це майбутнє ще?
kirkpatt

1

Я виявив, що на практиці будувати репо, як це важко підтримувати. Ми створили це репо, оскільки:

  • Ми хотіли витягнути пакунки з локального джерела для декількох серверів.
  • Дозвольте встановлювати лише надійні пакети.

Проблеми, які ми можемо зустріти:

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

Врешті-решт, кращим рішенням нашої проблеми було прокси офіційних репостів та кешування пакетів, які ми використовували. Це добре працює, оскільки:

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

Ми використовували Nginx та вбудовану підтримку проксі.


Проксі-сервер nginx звучить як відмінна ідея. Краща довгострокова підтримка і збирає більше пакетів. Буде корисно, якщо ви додасте більше деталей, можливо, як зв’язати щось чи щось
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.