RHEL小技: 実際にアップデートせずにアップデートに必要なパッケージを確認・ダウンロードする

https://cdn-ak.f.st-hatena.com/images/fotolife/m/mrwk/20210721/20210721110720.png

Red Hatの森若です。

今日はRHEL小技ということで、実際にアップデートせずにアップデートに必要なパッケージを確認・ダウンロードする方法をご紹介します。

パッケージの確認

# yum update --assumeno <パッケージ名>

--assumeno は、よく使われる -y と逆の意味で、あらゆる質問に自動的にNoと答えます。yumは必要に応じてキャッシュのアップデート、依存関係の解決をして、リクエストされたアップデートに必要なパッケージ一覧を表示して終了します。

パッケージのダウンロード

# yum update --downloadonly <パッケージ名>

--downloadonlyは、パッケージのダウンロードだけを行い、インストールをしません。 ダウンロードされたパッケージは、/var/cache/yum または /var/cache/dnf 以下に保存されています。リポジトリ等によりダウンロード先は異なりますが、以下のようなコマンドでみつけられます。

# find /var/cache/yum -type f -name "*rpm"

yum を使わずにできるか?

さて、依存関係の解決をyumでおこなわずに、「○○をアップデートするために必要なrpmの一覧が欲しい」と仰るお客様が時折いらっしゃいます。 おそらくシステムをインターネット接続できなくて、かつRed Hat Satellite等を利用できないような、制限が厳しい状況なのだと思います。 残念ながらそのような一覧をyumのようなツールを使わずに作ることは非常に困難です。

依存関係の解決

rpmの依存関係はパッケージそれぞれで見ると単純なものに見えますが、複数のパッケージが互いに依存関係やバージョンの制約を宣言しているため、実際に依存や制約を守りつつアップデートを行うには制約充足問題と呼ばれる複雑な処理が必要で、yumはこれを実装しています。どのような処理が必要か、例で見てみましょう。

例A

説明のために非常にシンプルな世界Aを想定します。 rsyslog-1.rpm, を rsyslog-2.rpm にアップデートしようとしたときに何が必要かを見てみましょう。

  • rsyslogには複数のバージョン rsyslog-1 と rsyslog-2 があります
  • rsyslog-1, rsyslog-2 はそれぞれ libc に依存しています
  • 現在システムにインストールされているパッケージはrsyslog-1, libcの2つだけです

この場合は簡単で、rsyslog-2.rpmだけを入手すると依存関係が満たされます。

次にシンプルな世界A-2を想像します。基本的に世界Aと同じですが、以下が異なります。

  • libcにもバージョンがあり、 libc-1.rpm と libc-2.rpm があります
  • 現在インストールされているパッケージはrsyslog-1, libc-1の2つだけです

rpmは、パッケージ対パッケージだけでなく、抽象化した仮のパッケージを扱うことができます。libc-1, libc-2ともに、libc という抽象化された名前を提供して、rsyslog-1, rsyslog-2ともに抽象化された"libc" への依存を宣言します。

f:id:mrwk:20210721102954p:plain
シンプルな例 A

やはり rsyslogのアップデートには rsyslog-2パッケージだけをダウンロードすれば十分です。

例B

シンプルな世界Bを想定します。世界A-2とほぼ同じですが、今度はサードパーティのパッケージ foo を導入します。 fooは非常に厳密に、検証された組み合わせでのパッケージを依存関係で定義します。

  • foo-1 は rsyslog-1 と libc-1 に依存しています
  • foo-2 は rsyslog-2 と libc-2 に依存しています
  • システムには foo-1, rsyslog-1, libc-1 がインストールされています

f:id:mrwk:20210721104446p:plain
シンプルな例 B

この場合、rsyslog-2だけをインストールしようとすると foo-1 の依存関係が満たせなくなります。 foo-2 にアップデートが必要となり、libc-2 のアップデートも必要になります。

つまりrsyslogをアップデートするための最低限必要なパッケージは rsyslog-2, foo-2, libc-2 の3つになります。

まとめ

ややこしい所はyumがやってくれるので、yumを使いましょう :D

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。