Linuxでrpmコマンドを使ってパッケージをインストールしようとしたとき、「依存関係エラー」に悩まされた経験はないでしょうか。
依存関係の問題はLinux初心者が最もつまずきやすいポイントのひとつです。
この記事では、rpm依存関係の確認方法・エラーの読み解き方・解決手順・yumやdnfとの使い分けについて、実践的かつわかりやすく解説します。
依存関係のトラブルを自力で解決できるようになることで、Linuxの管理スキルが一段階上がるでしょう。
初心者から中級者まで役立つ内容ですので、ぜひ最後までお読みください。
rpm依存関係とは何か?基本概念と仕組みを理解する
それではまず、rpm依存関係の基本的な概念と仕組みについて解説していきます。
依存関係とは、あるパッケージが正常に動作するために必要な他のパッケージ・ライブラリ・ファイルのことです。
ソフトウェア開発では、車輪の再発明を避けるために既存のライブラリを再利用する習慣があります。
その結果として、多くのパッケージが他のパッケージに依存した構造になっています。
依存関係の種類
Requires(必須依存):動作に絶対必要なパッケージ・ライブラリ
Conflicts(競合):同時にインストールできないパッケージ
Obsoletes(廃止):このパッケージが置き換える旧パッケージ
Provides(提供):このパッケージが提供する機能・ファイル・ライブラリ
Recommends(推奨):必須ではないが推奨する追加パッケージ
rpmコマンドはインストール時に依存関係を自動チェックし、必要なパッケージが存在しない場合はエラーを出して中断します。
この仕組みにより、不完全な状態でのインストールを防いでいます。
依存関係の連鎖は深くなることがあり、あるパッケージをインストールするために必要なパッケージが、さらに別のパッケージを必要とするケースもあります。
共有ライブラリ依存関係の仕組み
Linuxでは多くのプログラムが「共有ライブラリ(.soファイル)」を利用しています。
共有ライブラリとはWindowsのDLLに相当するもので、複数のプログラムが共通して使う関数群を一つのファイルにまとめたものです。
rpmの依存関係に「libname.so.X」という形式の記述がある場合、それは特定の共有ライブラリへの依存を示しています。
共有ライブラリ依存の例
あるパッケージが必要とするライブラリの確認
rpm -qRp パッケージファイル名.rpm
出力例:
libssl.so.3()(64bit)
libcrypto.so.3()(64bit)
libc.so.6()(64bit)
→ opensslライブラリとglibcに依存していることがわかる
共有ライブラリのバージョン不一致は依存関係エラーの主な原因のひとつです。
新しいアプリケーションが新しいバージョンのライブラリを必要とする場合に、システムに古いバージョンしかインストールされていないためエラーが発生します。
依存関係の確認コマンド一覧
依存関係を確認するための主なrpmコマンドを整理します。
| コマンド | 内容 | 使用場面 |
|---|---|---|
| rpm -qR パッケージ名 | インストール済みパッケージの依存先 | 既存パッケージの依存確認 |
| rpm -qRp ファイル名.rpm | 未インストールrpmファイルの依存先 | インストール前の事前確認 |
| rpm -q –provides パッケージ名 | パッケージが提供するもの | 依存関係の提供元確認 |
| rpm -q –whatrequires 名前 | 特定パッケージに依存しているパッケージ | 削除影響範囲の確認 |
| rpm -e –test パッケージ名 | 削除テスト(依存エラーを事前確認) | 削除前の影響確認 |
「rpm -q –whatrequires」はパッケージを削除する前に影響範囲を確認するために特に重要なコマンドです。
このコマンドで依存しているパッケージがある場合は、削除前に影響を考慮した対応が必要になります。
lddコマンドによる実行ファイルの依存ライブラリ確認
実行ファイルが必要とする共有ライブラリを確認するには「ldd」コマンドも活用できます。
lddコマンドの使用例
ldd /usr/bin/python3
出力例:
linux-vdso.so.1 (0x00007fff…)
libpthread.so.0 => /lib64/libpthread.so.0
libdl.so.2 => /lib64/libdl.so.2
libutil.so.1 => /lib64/libutil.so.1
libm.so.6 => /lib64/libm.so.6
libc.so.6 => /lib64/libc.so.6
「not found」と表示されたライブラリがある場合は、そのライブラリが不足しているためプログラムが動作しないことがわかります。
lddとrpmを組み合わせることで、不足ライブラリがどのrpmパッケージに含まれるかを特定し、インストールすることができます。
rpm依存関係エラーの読み方と対処法
続いては、rpm依存関係エラーの具体的なメッセージの読み方と対処法について確認していきます。
典型的な依存関係エラーメッセージと読み方
rpmコマンドで依存関係エラーが発生した際のメッセージ例を見てみましょう。
依存関係エラーメッセージの例
エラー: 依存性の欠如:
libssl.so.3()(64bit) は package_name-1.0-1.el9.x86_64 に必要とされています
python3 >= 3.8 は package_name-1.0-1.el9.x86_64 に必要とされています
読み方:
「libssl.so.3という共有ライブラリが必要だが、システムに存在しない」
「python3の3.8以上のバージョンが必要だが、インストールされていない」
エラーメッセージを正確に読み解くことで、何が不足しているかを特定し、適切な対処ができます。
「libssl.so.3」はopensslパッケージに含まれていることが多いため、openassl-libsパッケージをインストールすることで解決できる場合があります。
「>= 3.8」のようなバージョン条件が付いている場合は、条件を満たすバージョンのパッケージを用意する必要があります。
依存関係エラーの段階的な解決手順
依存関係エラーを解決するための基本的な手順を整理します。
依存関係エラーの解決手順
① エラーメッセージで不足パッケージを確認
② 不足パッケージを検索
rpm -q –whatprovides ライブラリ名
または dnf provides ライブラリ名
③ 該当パッケージをインストール
dnf install パッケージ名
④ 再度インストールを試みる
rpm -ivh 元のパッケージファイル名.rpm
「dnf provides」コマンドはリポジトリを検索して特定のファイルやライブラリを提供するパッケージを探す非常に便利なコマンドです。
「rpm -q –whatprovides」はインストール済みパッケージの中から提供元を探すコマンドで、既にインストールされているが認識されていないケースに役立ちます。
競合エラーへの対処方法
依存関係エラーとは別に、パッケージの「競合(Conflicts)」エラーも発生することがあります。
競合エラーの例
エラー: ファイル /usr/bin/example から package-a-1.0 と package-b-2.0 が競合しています
対処法:
① どちらのパッケージが必要かを判断
② 不要な方のパッケージをアンインストール
③ 目的のパッケージをインストール
競合エラーは主に、同じファイルを提供する複数のパッケージを同時インストールしようとした場合に発生します。
たとえば、同じコマンドを提供する異なるバージョンのパッケージや、互いに排他的な設定を持つパッケージなどが該当します。
どちらのパッケージが必要かを慎重に判断してから対処することが重要です。
yumとdnfを使った依存関係の自動解決
続いては、yumとdnfを使った依存関係の自動解決方法とrpmとの使い分けについて確認していきます。
dnfによる依存関係の自動解決
rpmコマンド単体では依存関係の自動解決ができませんが、dnfを使うことで自動的に解決できます。
dnfを使った依存関係の自動解決
ローカルrpmファイルを依存関係自動解決でインストール
dnf install パッケージファイル名.rpm
パッケージ名でリポジトリから取得してインストール
dnf install パッケージ名
インストール前に実行内容を確認(ドライラン)
dnf install –assumeno パッケージ名
「dnf install」はリポジトリを参照して不足している依存パッケージを自動的にダウンロードし、インストールしてくれます。
複雑な依存関係を持つパッケージを手動で解決するのは時間がかかるため、通常はdnfを使うのが実用的です。
「–assumeno」オプションを使ったドライランで、実際にインストールされるパッケージと依存関係の解決内容を事前に確認することができます。
rpmとdnf・yumの使い分け指針
rpmとdnf・yumはそれぞれ得意な場面があり、適切に使い分けることが重要です。
| 操作 | 推奨ツール | 理由 |
|---|---|---|
| パッケージのインストール | dnf / yum | 依存関係を自動解決できる |
| パッケージの削除 | dnf / yum | 依存パッケージも考慮して削除 |
| インストール済み一覧の確認 | rpm -qa | 高速で詳細な照会が可能 |
| パッケージの詳細情報確認 | rpm -qi | 豊富なメタデータを参照できる |
| ファイルの逆引き | rpm -qf | インストール済みファイルから特定できる |
| パッケージ整合性検証 | rpm -V | ファイルの改ざんを検知できる |
| オフライン環境でのインストール | rpm -ivh | リポジトリなしでインストール可能 |
インターネット接続がない閉域ネットワーク環境では、rpmコマンドを直接使ってローカルのrpmファイルをインストールする必要があります。
この場合は依存パッケージも手動でrpmファイルとして用意し、依存する順番に一つずつインストールするか、すべてを同時に指定してインストールする方法をとります。
dnf historyによる操作履歴の確認とロールバック
dnfには操作履歴を確認してロールバックする便利な機能があります。
dnf historyの活用
インストール・削除の履歴を確認
dnf history
特定の操作の詳細を確認
dnf history info トランザクションID
特定の操作をアンドゥ(元に戻す)
dnf history undo トランザクションID
誤ったパッケージをインストールした場合や、アップデート後に問題が発生した場合に、dnf history undoで以前の状態に戻すことができます。
rpmコマンドにはこのようなロールバック機能がないため、変更を元に戻したい場合はdnfのhistory機能を活用するのが賢明です。
オフライン環境での依存関係解決戦略
続いては、インターネットに接続できないオフライン環境での依存関係解決方法について確認していきます。
依存パッケージの事前ダウンロード方法
オフライン環境にパッケージをインストールするには、インターネット接続のある環境で依存パッケージを含めて事前にダウンロードしておく必要があります。
依存パッケージを含めたダウンロード方法
dnfでダウンロードのみ実行(インストールしない)
dnf download パッケージ名
依存パッケージも含めてダウンロード
dnf download –resolve パッケージ名
特定ディレクトリに保存
dnf download –resolve –destdir /tmp/packages パッケージ名
「–resolve」オプションで依存するすべてのパッケージをまとめてダウンロードできます。
ダウンロードしたrpmファイルをオフライン環境に転送し、依存関係の順番を考慮しながらインストールします。
複数のパッケージを同時にrpmコマンドに指定することで、依存関係の順序をある程度自動的に解決することができます。
ローカルリポジトリの構築
オフライン環境での管理を効率化するには、ローカルリポジトリを構築する方法が有効です。
「createrepo_c」パッケージを使って、ローカルのrpmファイル群からリポジトリメタデータを生成し、dnfで利用できるローカルリポジトリを作成できます。
ローカルリポジトリを構築することで、オフライン環境でもdnfの依存関係自動解決機能を活用したインストールが可能になります。
社内ネットワーク向けのパッケージ管理サーバーを構築すれば、複数サーバーへの効率的なパッケージ配布が実現できるでしょう。
依存関係の問題を防ぐための運用設計
依存関係の問題を最小化するための運用設計のポイントをご紹介します。
まず、パッケージのインストールには基本的にdnf・yumを使い、rpmの直接操作は照会・検証・特殊なケースに限定することが重要です。
次に、OSのマイナーバージョンアップグレード(el9.0→el9.1など)では、依存関係が変化することがあるため、アップグレード前にテスト環境での検証が必要です。
また、サードパーティのリポジトリを追加する際は、公式リポジトリとの依存関係競合が発生しやすいため、慎重に検討することが求められます。
まとめ
今回は、rpm依存関係の基本概念・確認コマンド・エラーの読み方と対処法・yumやdnfとの使い分け・オフライン環境での対応策について詳しく解説しました。
依存関係はLinuxパッケージ管理において避けて通れない概念であり、正しく理解することでインストールトラブルを迅速に解決できます。
「rpm -qR」「rpm -q –whatrequires」「rpm -q –provides」などの照会コマンドを使いこなすことで、依存関係の全体像を把握できます。
通常のインストールにはdnf・yumを使って依存関係を自動解決し、詳細な照会・検証にはrpmを使うという使い分けが実践的なアプローチです。
依存関係の仕組みを深く理解することで、Linuxシステムの安定運用とトラブルシューティング能力が大きく向上するでしょう。
ぜひ本記事を参考に、rpm依存関係の理解を深めていただければ幸いです。