すでにインストールされている場合でも、yumdownloaderですべての依存関係をダウンロードしますか?


34

すでにインストールされている場合でも、yumdownloaderですべての依存関係をダウンロードする方法はありますか?

ローカルリポジトリを作成しようとしていますが、必要なパッケージのみを含めたいです。

回答:


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を使用するように更新されました。repoqueryの--requires --resolveオプションは、depsに対して再帰的に機能しません。
ルーク

--recursiverepoqueryコマンドにオプションを追加して、再帰的に機能するようにします。
ザスター2013年

上記の方法でrepotrackを修正してもうまくいきませんでした。x86_64archのパッケージはダウンロードされませんでした。とにかく良いヒントを得るために+1:repotrackを使用すると、i386とx86_64の両方をダウンロードして、不要な部分を除外できます。
アレクサンダー・ヴァシリエフ14年

@Luke fix partの使用方法は、条件が言及された場合に実行する場所を意味し、repoqueryコマンドで特定のパッケージのみを確認する必要がある場合はどうなりますか?
AVJ

2
ソースコードを変更することはお勧めしません。本当にこれがバグである場合は、アップストリームyum-utilsプロジェクトに提出する必要があります。予想よりも多くのパッケージをダウンロードする理由は、関数rpmUtils.arch.getArchList()が指定されたアーキテクチャと互換性のあるすべてのアーキテクチャを返すためです。たとえば、パッケージnoarchに必要なアーキテクチャが含まれx86_64ます。ソースを確認できます:yum.baseurl.org/gitweb?p
サミュエルファン

18

みんなの情報についてyumdownloaderは、仕事をしていません。`yumを使用したパッケージ管理の経験がある人なら、次のコマンドラインがパッケージRPMとそのすべての依存関係を再帰的にダウンロードすると予想するのは自然です。

yumdownloader --resolve <package>

しかし、そうではありません。第1レベルの依存関係またはまだインストールされていない依存関係が出力される場合があります。私はわかりません。

CentOS 6.5で機能する1つの方法を次に示します。手順に従って、Red Hatがyum提供するdownloadonlyプラグインをインストールします。基本的に、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.何をすべきかを言う?
ハワードリー

@HowardLee Running yum search yumdownloaderが復帰しましたyum-utils.noarch
アリ

5
フラグCannot find a valid baseurl for repo: base/$releasever/x86_64を追加するとこのエラーが発生します--installroot
マイクS

このリンクCannot find a valid baseurl...の解決策で--releasever=/
Centos

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
パッケージが既にインストールされている場合、これはまだ問題です
ザック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プロキシは素晴らしいアイデアのように聞こえます。より良い長期サポートとより多くのパッケージのピックアップ。リンクの詳細など、少し詳細を追加していただければ助かります。
おでん

0

ルークの答えとコメントに基づいて...

この記事の執筆時点でrepotrackするときは、次のアーキテクチャのすべてにマッチしますx86_64:指定されているx86_64athloni686i586i486i386、と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それは満たすあなたの有効なリポジトリで依存関係をパッケージを見つけることができない場合は警告を表示しません。黙ってスキップします。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.