web-dev-qa-db-ja.com

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

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

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

34
Luke

代わりに、次のように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
29
Luke

みんなの情報として、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

次に、yum--installrootスイッチと組み合わせてプラグインを使用します。これにより、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
18
pdp

スレッドが古いことに気づきましたが、誰かがこれに遭遇した場合は、yumを使用して目的の動作を実行できます。

まず、downloadonlyプラグインをインストールします(RHELの手順):(RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

次に、次のようにコマンドを実行します。

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

--downloaddirを無視すると、yumは自動的に/var/cache/yumにダウンロードします

したがって、yumdownloaderを具体的に使用する必要がない限り、これは目標を達成する最も簡単な方法だと思います。

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
2
Adam Kurkiewicz

実際には、このようなレポを構築することは維持するのが難しいことに気付きました。このレポを作成した理由は次のとおりです。

  • 複数のサーバーのローカルソースからパッケージをプルする必要がありました。
  • 信頼できるパッケージのインストールのみを許可します。

私たちが直面する可能性のある問題は次のとおりです。

  • パッケージを最新の状態に保ちます。依存関係が変化します。追加されるものもあれば、削除されるものもあります。
  • インストールしたい新しいパッケージを追加します。
  • 上記の課題により、重要な更新をプッシュするプロセスが長くなりました。

結局、ourの問題に対するより良い解決策は、公式リポジトリをプロキシして、使用したパッケージをキャッシュすることでした。これはうまくいく:

  • 実際に使用するパッケージのみがローカルに保存されます。
  • 古いパッケージは自動的に期限切れになります。
  • パッケージが最初に使用されるとき、それは公式のリポジトリからプルしますが、その後のリクエストはキャッシュから来ます。
  • 公式リポジトリを信頼するだけで十分でした。プロキシミラーは、信頼できるソースからのみパッケージをプルします。

Nginxと組み込みのプロキシサポートを使用しました。

1
Luke

またお試しください

repoquery -R --resolve --recursive <name> | xargs -r yumdownloader

例えば。:

repoquery -R --resolve --recursive firefox | xargs -r yumdownloader

ソース: https://www.thegeekdiary.com/downloading-rpm-packages-with-dependencies-yumdownloader-vs-yum-downloadonly-vs-repoquery/

0
can.

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

これを書いている時点では、repotrackは、x86_64が指定されている場合、x86_64athloni686i586のすべてのアーキテクチャに一致します。 、i486i386noarch

私の目的では、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は、有効なリポジトリの依存関係を満たすパッケージを見つけられない場合でも警告を表示しないことに注意してください。黙ってスキップします。

0
M. Dudley