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विकल्प के लिए पुनरावृत्ति का विकल्प पुनरावर्ती रूप से काम नहीं करता है।
ल्यूक

--recursiveपुनरावृत्ति कमांड के विकल्प को जोड़ने के लिए इसे पुनरावर्ती रूप से काम करें।
ज़ेस्टर

ऊपर सुझाए गए तरीके को ठीक करने से मेरे लिए काम नहीं किया गया: x86_64 आर्च के लिए कोई पैकेज डाउनलोड नहीं किया गया। किसी भी टिप के लिए वैसे भी +1: रिपोट्रैक के साथ कोई भी i386 और x86_64 दोनों को डाउनलोड कर सकता है और अनावश्यक भाग को फ़िल्टर कर सकता है।
अलेक्जेंडर वासिलजेव

@ ल्यूक फिक्स भाग का उपयोग कैसे करें ... इसका मतलब है कि जहां निष्पादित करने की स्थिति का उल्लेख किया गया है ... और क्या होगा यदि मुझे रेपोक्वेरी कमांड में केवल कुछ पैकेज की जांच करने की आवश्यकता है।
AVJ

2
मैं सोर्स कोड बदलने की सिफारिश नहीं करूंगा। यदि वास्तव में, यह एक बग है, तो इसे अपस्ट्रीम yum-utilsप्रोजेक्ट में दर्ज किया जाना चाहिए । कारण यह है कि यह अपेक्षा से अधिक पैकेज डाउनलोड करता है, क्योंकि फ़ंक्शन rpmUtils.arch.getArchList()दिए गए एक के लिए सभी संगत आर्किटेक्चर लौटाता है। इसमें उदाहरण के लिए noarchवास्तुकला शामिल है जिसे x86_64पैकेजों की आवश्यकता हो सकती है। आप स्रोत की जाँच कर सकते हैं: yum.baseurl.org/gitweb?p=yum.git/a=blob;f=rpmUtils/…
सैमुअल फ़ान

18

हर किसी की जानकारी के लिए, yumdownloaderकाम नहीं करता है। `यम के साथ पैकेज प्रबंधन में कुछ अनुभव वाले किसी व्यक्ति के लिए, यह उम्मीद करना स्वाभाविक है कि निम्नलिखित कमांड-लाइन एक पैकेज RPM और उसके सभी आश्रितों को पुन: डाउनलोड करेगा।

yumdownloader --resolve <package>

लेकिन ऐसा नहीं है। हो सकता है कि यह प्रथम-स्तर की निर्भरता या पहले से स्थापित नहीं हैं। मुझे यकीन नहीं है।

यहां एक तरीका है जो CentOS 6.5 पर काम करता है। Red Hatyum द्वारा दिए गए के लिए डाउनलोड करने योग्य प्लगइन को स्थापित करने के लिए चरणों का पालन करें । मूल रूप से, 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>। उदाहरण, गिट के साथ:

$ 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.कि क्या करना है?
हावर्ड ली

@ हॉवर्डली रनिंग 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

मुझे एहसास हुआ कि धागा पुराना है, लेकिन अगर कोई भी इस पार ठोकर खाता है, तो आप वांछित व्यवहार को पूरा करने के लिए यम का उपयोग कर सकते हैं।

पहली बार डाउनलोड करने वाला प्लगइन (RHEL के लिए निर्देश): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

अगला कमांड इस प्रकार है:

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

यदि आप नजरअंदाज करते हैं तो --downloaddirयम अपने आप डाउनलोड हो जाएगा/var/cache/yum

इसलिए जब तक आपको विशेष रूप से yumdownloader का उपयोग करने की आवश्यकता नहीं है, मुझे लगता है कि यह लक्ष्य पूरा करने का सबसे सरल तरीका होगा।


4
यह अभी भी एक मुद्दा है अगर पैकेज पहले से ही स्थापित है
ज़ैक एस

2

यदि आप भविष्य (फेडोरा 23+) से हैं, जहां yum को dnf से बदल दिया जा रहा है, तो आपको यह बैश स्क्रिप्ट उपयोगी लग सकती है।

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 प्रॉक्सी एक महान विचार की तरह लगता है। बेहतर दीर्घकालिक समर्थन और अधिक पैकेज उठाता है। यदि आप अधिक विवरण जोड़ते हैं तो सहायक होगा, हो सकता है कि कैसे लिंक करें या कुछ और करें
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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.