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" への依存を宣言します。
やはり 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 がインストールされています
この場合、rsyslog-2だけをインストールしようとすると foo-1 の依存関係が満たせなくなります。 foo-2 にアップデートが必要となり、libc-2 のアップデートも必要になります。
つまりrsyslogをアップデートするための最低限必要なパッケージは rsyslog-2, foo-2, libc-2 の3つになります。
まとめ
ややこしい所はyumがやってくれるので、yumを使いましょう :D