Tải xuống tất cả các phụ thuộc với yumdoader, ngay cả khi đã được cài đặt?


34

Có cách nào để tải xuống tất cả các phụ thuộc với yumdoader, ngay cả khi chúng đã được cài đặt không?

Tôi đang cố gắng tạo một repo cục bộ và chỉ muốn bao gồm các gói chúng tôi cần.

Câu trả lời:


29

Bạn có thể sử dụng repotrackthay vì như thế này:

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

Thật không may, có một lỗi với -acờ (vòm). Nó sẽ tải xuống i686 và x86_64.

Đây là cách khắc phục:

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

Bạn có thể sử dụng repoqueryđể có được danh sách các gói nhóm:

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

Mà bạn có thể ăn vào repotrack:

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

Cập nhật để sử dụng repotrack thay thế. --requires --resolveTùy chọn của repoquery không hoạt động đệ quy cho deps.
Lu-ca

thêm --recursivetùy chọn vào lệnh repoquery để làm cho nó hoạt động đệ quy.
ZaSter

Sửa lỗi repotrack theo cách được đề xuất ở trên không hiệu quả với tôi: không có gói nào được tải xuống cho x86_64 arch. Dù sao +1 cho một mẹo hay: với repotrack, người ta có thể tải xuống cả i386 và x86_64 và lọc ra phần không cần thiết.
Alexander Vasiljev

@Luke cách sử dụng phần sửa lỗi ... có nghĩa là nơi thực thi nếu điều kiện được đề cập ... và nếu tôi chỉ cần kiểm tra gói nhất định trong lệnh repoquery.
AVJ

2
Tôi không khuyên bạn nên thay đổi mã nguồn. Nếu thực sự, đây là một lỗi, nó nên được đưa vào yum-utilsdự án ngược dòng . Lý do tại sao nó tải xuống nhiều gói hơn dự kiến ​​là vì hàm rpmUtils.arch.getArchList()trả về tất cả các kiến ​​trúc tương thích cho gói đã cho. Nó bao gồm ví dụ noarchkiến trúc có thể cần thiết cho x86_64các gói. Bạn có thể kiểm tra nguồn: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/ trộm
Samuel Phan

18

Đối với thông tin của mọi người, yumdownloaderkhông thực hiện công việc. Đối với bất kỳ ai có một số kinh nghiệm trong quản lý gói với `yum, việc hy vọng rằng dòng lệnh sau đây sẽ tải xuống một cách đệ quy một gói RPM và tất cả các phụ thuộc của nó:

yumdownloader --resolve <package>

Nhưng nó không. Có thể là in các phụ thuộc cấp đầu tiên hoặc các phụ thuộc chưa được cài đặt. Tôi không chắc.

Đây là một phương pháp hoạt động trên CentOS 6.5. Thực hiện theo các bước để cài đặt plugin downloadonly yumnhư được đưa ra bởi Red Hat . Về cơ bản, trên CentOS 6.x, hãy:

$ sudo yum install yum-plugin-downloadonly.noarch

Sau đó, sử dụng các plugin kết hợp với --installrootchuyển đổi yum. Điều này ngăn không cho yumgiải quyết và sau đó bỏ qua các phụ thuộc đã được cài đặt trên hệ thống.

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

Bạn sẽ tải xuống RPM của gói <package>và tất cả các phụ thuộc của nó trong thư mục , <rpm_dir>. Ví dụ, với Git:

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

Làm thế nào để bạn đảo ngược quá trình này và cài đặt gói lá bằng cách sử dụng các phụ thuộc cục bộ?
thiên vị

centos65 sudo yum install yum-plugin-downloadonly.noarchnói No package yum-plugin-downloadonly.noarch available.phải làm gì?
Howard Lee

@HowardLee Chạy yum search yumdownloadertrở lạiyum-utils.noarch
Ali

5
Tôi nhận được lỗi này Cannot find a valid baseurl for repo: base/$releasever/x86_64khi tôi thêm --installrootcờ.
Mike S

Đã thoát khỏi sự Cannot find a valid baseurl...cố trên Centos 7 với giải pháp trên liên kết này : Thêm --releasever=/tham số
Chirlo

2

Tôi nhận ra chủ đề đã cũ, nhưng trong trường hợp bất kỳ ai vấp phải điều này, bạn có thể sử dụng yum để thực hiện hành vi mong muốn.

Trước tiên, plugin downloadonly (hướng dẫn cho RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Tiếp theo chạy lệnh như sau:

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

Nếu bạn bỏ qua --downloaddiryum sẽ tự động tải xuống/var/cache/yum

Vì vậy, trừ khi bạn cần sử dụng yumdoader một cách cụ thể, tôi nghĩ đây sẽ là cách đơn giản nhất để hoàn thành mục tiêu.


4
Đây vẫn là một vấn đề nếu gói đã được cài đặt
Zack S

2

Nếu bạn đến từ tương lai (Fedora 23+), nơi yum đang được thay thế bằng dnf, bạn có thể thấy tập lệnh bash này hữu ích.

Trình tải xuống:

#!/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

vòng / phút:

#!/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
Nó có phải là tương lai chưa?
kirkpatt

1

Tôi thấy rằng trong thực tế xây dựng một repo như thế này khó duy trì. Chúng tôi xây dựng repo này vì:

  • Chúng tôi muốn kéo các gói từ một nguồn cục bộ cho nhiều máy chủ.
  • Chỉ cho phép các gói đáng tin cậy được cài đặt.

Các vấn đề chúng ta có thể vượt qua là:

  • Giữ các gói cập nhật. Phụ thuộc thay đổi. Một số được thêm vào, những người khác được gỡ bỏ.
  • Thêm các gói mới mà chúng tôi muốn cài đặt.
  • Những thách thức trên kéo dài quá trình đẩy các bản cập nhật quan trọng.

Cuối cùng, giải pháp tốt hơn cho vấn đề của chúng tôi là ủy quyền các repos chính thức và lưu trữ các gói chúng tôi đã sử dụng. Điều này hoạt động tốt bởi vì:

  • Chỉ các gói chúng tôi thực sự sử dụng được lưu trữ cục bộ.
  • Gói cũ tự động hết hạn.
  • Khi một gói được sử dụng lần đầu tiên, nó sẽ lấy từ repo chính thức, nhưng các yêu cầu tiếp theo đến từ bộ đệm.
  • Tin tưởng vào repo chính thức là đủ để tin tưởng. Gương proxy của chúng tôi chỉ kéo các gói từ các nguồn đáng tin cậy.

Chúng tôi đã sử dụng Nginx và hỗ trợ proxy tích hợp.


nginx proxy nghe có vẻ là một ý tưởng tuyệt vời. Hỗ trợ dài hạn tốt hơn và chọn nhiều gói hơn. Sẽ hữu ích nếu bạn thêm nhiều chi tiết, có thể là cách liên kết hoặc một cái gì đó
oden

0

Dựa trên câu trả lời của Luke và các bình luận ...

Theo văn bản này repotracksẽ phù hợp với tất cả các kiến trúc sau khi x86_64được quy định: x86_64, athlon, i686, i586, i486, i386, và noarch.

Đối với mục đích của tôi tôi chỉ quan tâm đến x86_64noarchbao bì, và tôi biết rằng phân phối của tôi không có bất kỳ athlongói.

Lệnh sau nhận danh sách các URL gói, lọc các i?86kiến trúc và in ra tên của các gói khi chúng được tải xuống:

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'

Lưu ý rằng điều repotrackđó không cảnh báo bạn nếu nó không thể tìm thấy gói đáp ứng sự phụ thuộc trong kho được kích hoạt của bạn. Nó âm thầm bỏ qua nó.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.