ดาวน์โหลดการอ้างอิงทั้งหมดด้วย yumdownloader แม้ว่าจะติดตั้งแล้ว?


34

มีวิธีดาวน์โหลดการอ้างอิงทั้งหมดด้วย yumdownloader แม้ว่าจะติดตั้งไปแล้วหรือไม่

ฉันกำลังพยายามสร้าง repo ในพื้นที่และต้องการรวมแพ็คเกจที่เราต้องการเท่านั้น

คำตอบ:


29

คุณสามารถใช้repotrackแทนเช่นนี้:

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

น่าเสียดายที่มีข้อผิดพลาดกับการ-aตั้งค่าสถานะ (arch) มันจะดาวน์โหลด 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 แทน --requires --resolveตัวเลือกrepoquery ไม่สามารถใช้ซ้ำได้สำหรับ deps
ลุค

เพิ่ม--recursiveตัวเลือกให้กับคำสั่ง repoquery เพื่อให้มันทำงานซ้ำ
ZaSter

การแก้ไข repotrack ตามวิธีที่แนะนำข้างต้นไม่ได้ผลสำหรับฉัน: ไม่มีการดาวน์โหลดแพ็คเกจสำหรับ x86_64 arch อย่างไรก็ตามสำหรับเคล็ดลับที่ดี: ด้วย repotrack หนึ่งสามารถดาวน์โหลดได้ทั้ง i386 และ x86_64 และกรองส่วนที่ไม่จำเป็นออก
Alexander Vasiljev

@ ลุควิธีการใช้ส่วนแก้ไข ... หมายถึงสถานที่ที่จะดำเนินการถ้าเงื่อนไขที่กล่าวถึง ... และสิ่งที่ถ้าฉันต้องการที่จะตรวจสอบเฉพาะแพคเกจบางอย่างในคำสั่ง 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.ว่าจะทำอย่างไร?
Howard Lee

@HowardLee Running yum search yumdownloaderreturnyum-utils.noarch
อาลี

5
ฉันได้รับข้อผิดพลาดนี้Cannot find a valid baseurl for repo: base/$releasever/x86_64เมื่อฉันเพิ่มการ--installrootตั้งค่าสถานะ
Mike 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]

หากคุณไม่สนใจมัน--downloaddirจะทำการดาวน์โหลดโดยอัตโนมัติ/var/cache/yum

ดังนั้นหากคุณไม่จำเป็นต้องใช้ yumdownloader โดยเฉพาะฉันคิดว่านี่จะเป็นวิธีที่ง่ายที่สุดในการบรรลุเป้าหมาย


4
นี่ยังคงเป็นปัญหาหากแพคเกจติดตั้งไว้แล้ว
Zack S

2

หากคุณมาจากอนาคต (Fedora 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
มันเป็นอนาคตหรือยัง
kirkpatt

1

ฉันพบว่าในทางปฏิบัติการสร้าง repo เช่นนี้ยากที่จะรักษา เราสร้าง repo นี้เพราะ:

  • เราต้องการดึงแพ็คเกจจากแหล่งภายในสำหรับเซิร์ฟเวอร์หลายเครื่อง
  • อนุญาตให้ติดตั้งแพ็คเกจที่เชื่อถือได้เท่านั้น

ปัญหาที่เราสามารถพบได้คือ:

  • ปรับปรุงแพ็คเกจให้ทันสมัยอยู่เสมอ การเปลี่ยนแปลงการพึ่งพา บางส่วนถูกเพิ่มส่วนอื่น ๆ จะถูกลบออก
  • การเพิ่มแพ็คเกจใหม่ที่เราต้องการติดตั้ง
  • ความท้าทายข้างต้นทำให้กระบวนการผลักดันอัปเดตสำคัญยิ่งยืดเยื้อ

ในที่สุดทางออกที่ดีกว่าสำหรับปัญหาของเราก็คือการมอบ repos อย่างเป็นทางการและแคชแพ็คเกจที่เราใช้ วิธีนี้ใช้ได้ผลดีเพราะ:

  • แพคเกจที่เราใช้จริงเท่านั้นจะถูกเก็บไว้ในเครื่อง
  • แพ็คเกจเก่าจะหมดอายุโดยอัตโนมัติ
  • เมื่อแพ็กเกจถูกใช้งานครั้งแรกมันจะดึงจาก repo อย่างเป็นทางการ แต่คำขอที่ตามมามาจากแคช
  • การไว้วางใจ repo อย่างเป็นทางการนั้นเพียงพอสำหรับความไว้วางใจ พร็อกซีมิเรอร์ของเราดึงเฉพาะแพ็คเกจจากแหล่งที่เชื่อถือ

เราใช้ Nginx และการสนับสนุนพร็อกซีในตัว


พร็อกซี nginx ดูเหมือนความคิดที่ดี การสนับสนุนในระยะยาวที่ดีขึ้นและเลือกแพ็คเกจเพิ่มเติม จะเป็นประโยชน์หากคุณเพิ่มรายละเอียดเล็กน้อยอาจจะเป็นวิธีการเชื่อมโยงหรือบางสิ่งบางอย่าง
oden

0

สร้างคำตอบของลุคและความคิดเห็น ...

ขณะที่เขียนนี้repotrackจะตรงกับทุกสถาปัตยกรรมต่อไปนี้เมื่อx86_64มีการระบุ: x86_64, athlon, i686, i586, i486, และi386noarch

เพื่อจุดประสงค์ของฉันฉันเพียง แต่สนใจ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จะไม่เตือนคุณหากไม่พบแพ็คเกจที่ตรงกับการพึ่งพาใน repos ที่คุณเปิดใช้งาน มันข้ามเงียบ ๆ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.