이미 설치되어 있어도 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에 대해 재귀 적으로 작동하지 않습니다.
Luke

--recursiverepoquery 명령에 옵션을 추가하여 재귀 적으로 작동하도록하십시오.
ZaSter

위에서 제안한 방식으로 repotrack을 수정하면 효과가 없었습니다. x86_64 아치 용 패키지가 다운로드되지 않았습니다. 어쨌든 좋은 팁을 얻으려면 +1 : repotrack을 사용하면 i386과 x86_64를 모두 다운로드하고 불필요한 부분을 걸러 낼 수 있습니다.
Alexander Vasiljev 2016 년

@Luke 수정 부분을 사용하는 방법은 조건이 언급 된 경우 실행할 위치와 repoquery 명령에서 특정 패키지 만 확인 해야하는 경우를 의미합니다.
AVJ

2
소스 코드를 변경하지 않는 것이 좋습니다. 실제로 이것이 버그라면 업스트림 yum-utils프로젝트에 제출해야합니다 . 예상보다 많은 패키지를 다운로드하는 이유는 함수 rpmUtils.arch.getArchList()가 지정된 아키텍처에 대해 호환 가능한 모든 아키텍처를 반환 하기 때문 입니다. 예를 들어 패키지에 noarch필요할 수있는 아키텍처가 포함 x86_64됩니다. 소스를 확인할 수 있습니다 : yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Samuel Phan

18

모든 사람의 정보를 yumdownloader위해, 일을하지 마십시오. `yum 패키지 관리 경험이있는 사람이라면, 다음 명령 줄이 패키지 RPM과 모든 종속 항목을 재귀 적으로 다운로드 할 것으로 기대하는 것은 당연합니다.

yumdownloader --resolve <package>

그러나 그렇지 않습니다. 첫 번째 레벨 종속성 또는 아직 설치되지 않은 종속성을 인쇄 할 수 있습니다. 확실하지 않습니다.

CentOS 6.5에서 작동하는 방법은 다음과 같습니다. 다음 단계에 따라 Red Hat에서yum 제공 한 다운로드 전용 플러그인을 설치하십시오 . 기본적으로 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.noarchNo package yum-plugin-downloadonly.noarch available.어떻게해야합니까?
Howard Lee

@HowardLee Running이 yum search yumdownloader돌아옵니다yum-utils.noarch
Ali

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]

--downloaddiryum 을 무시 하면 자동으로 다운로드됩니다./var/cache/yum

따라서 yumdownloader를 구체적으로 사용해야하지 않는 한 이것이 목표를 달성하는 가장 간단한 방법이라고 생각합니다.


4
패키지가 이미 설치되어있는 경우에도 여전히 문제가됩니다.
Zack S

2

yum이 dnf로 바뀌는 미래 (Fedora 23 이상) 출신이라면 이 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
아직 미래입니까?
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이 패키지를 찾을 수없는 경우 경고 메시지를 표시하지 않습니다 만족 당신의 활성화의 repos에 의존. 조용히 건너 뜁니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.