package 管理トラブルシューティング - 依存関係エラーの解決法
依存関係エラーとは?
依存関係エラーは「パッケージ A のインストールにはパッケージ B が必要だが、B が存在しない・バージョンが合わない」状態で発生する。原因の大半は①リポジトリの不整合、②途中で中断されたインストール、③サードパーティリポジトリの混在のいずれかだ。
解決の基本方針
- まず
apt update/dnf makecacheでリポジトリ情報を最新化する apt --fix-broken install/dpkg --configure -aで自動修復を試みる- それでも解決しない場合のみ、個別対処に入る
apt の定番エラーと解決法
E: Unmet dependencies
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
依存パッケージが不足している。この順で試す:
sudo apt --fix-broken install
Reading package lists... Done Building dependency tree Correcting dependencies... Done The following packages will be installed: libfoo1 ...
欠損した依存関係を自動補完してインストールを完了させる。多くのケースでこれだけで解決する。
解決しない場合:
sudo dpkg --configure -a sudo apt-get install -f
E: Unable to locate package
E: Unable to locate package foo
リポジトリにパッケージが見当たらない。
sudo apt update sudo apt install パッケージ名
apt update を実行してからインストールすれば、パッケージ一覧の古さが原因のエラーは大半が解消する。
Universe リポジトリが必要な場合(Ubuntu):
sudo add-apt-repository universe sudo apt update sudo apt install パッケージ名
The following packages have been kept back
The following packages have been kept back: foo
依存関係の変更を伴うアップグレードが保留されている。
# 個別パッケージを指定してインストール sudo apt install foo # または保留パッケージをまとめてアップグレード sudo apt full-upgrade
dpkg の破損状態からの復旧
dpkg が途中で中断されると(Ctrl+C、電源断など)、次回操作時に以下のエラーが出る。
dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
復旧手順:
sudo dpkg --configure -a
Setting up libssl1.1:amd64 (1.1.1f-1ubuntu2.20) ... Processing triggers for libc-bin (2.31-13+deb11u7) ...
特定パッケージが原因の場合は個別に指定:
sudo dpkg --configure パッケージ名
--configure でも解消しないパッケージは強制削除して再インストール:
sudo dpkg --remove --force-remove-reinstreq パッケージ名 sudo apt install パッケージ名
dpkg --force-all はすべての依存チェックをスキップする最終手段。システムが不安定になるリスクがあるため、上記手順で解決しない場合のみ検討する。
yum / dnf の依存エラー解決
Transaction Check Error(ファイル競合)
Error: Transaction check error: file /path/to/file conflicts with file from package foo-1.0
ファイルが既存パッケージと競合している。
# 競合ファイルの所有パッケージを確認 rpm -qf /path/to/file
foo-1.0-1.el9.x86_64
# 競合パッケージを削除してから再インストール sudo dnf remove 競合パッケージ名 sudo dnf install 目的パッケージ名
Dependency problems(バージョン不一致)
Error: Problem: package foo-2.0 requires bar >= 2.0, but none of the providers can be installed
# 利用可能なバージョンを確認 dnf list --available bar # distro-sync でパッケージをリポジトリに整合させる sudo dnf distro-sync
dnf distro-sync はインストール済みパッケージを現在のリポジトリの最新バージョンに同期させる。yum 環境なら yum distro-sync でも同じことができる。
EPEL などのサードパーティリポジトリが競合源の場合:
# 問題リポジトリを一時的に無効化してインストール sudo dnf install パッケージ名 --disablerepo=epel
リポジトリ問題のトラブルシューティング
GPG キーエラー
The following signatures were invalid: EXPKEYSIG XXXXXXXXXXXXXXXX
リポジトリの GPG 署名キーが期限切れ。
# Ubuntu / Debian — GPG キーを更新 curl -fsSL https://リポジトリのキーURL | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/repo.gpg sudo apt update # CentOS / Fedora — RPM キーをインポート sudo rpm --import https://リポジトリのキーURL
ロックファイルの競合
E: Could not get lock /var/lib/dpkg/lock-frontend
別の apt プロセスが実行中か、前回の実行が異常終了した状態。
# apt / dpkg を使用中のプロセスを確認 ps aux | grep -E "apt|dpkg"
プロセスが存在する場合: 終了するまで待つ。sudo kill -9 PID は最終手段。
プロセスが存在しない場合(前回の異常終了後):
sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/lib/dpkg/lock sudo dpkg --configure -a
ロックファイルを削除するのは、ps aux で apt/dpkg プロセスが存在しないことを確認した後のみ。稼働中プロセスがあるまま削除するとパッケージデータベースが破損する。
yum / dnf のロック:
# yum ロック sudo rm /var/run/yum.pid # dnf ロック sudo rm /var/cache/dnf/*.lock
診断フロー
依存関係エラーが出たとき、次の順で試す。
| ステップ | コマンド | 効果 |
|---|---|---|
| 1. キャッシュ更新 | apt update / dnf makecache |
リポジトリ情報を最新化 |
| 2. 自動修復 | apt --fix-broken install |
欠損依存を補完 |
| 3. dpkg 完了 | dpkg --configure -a |
未設定パッケージを完了 |
| 4. 強制修復 | apt-get install -f |
依存関係を強制解決 |
| 5. 同期 | dnf distro-sync |
リポジトリに整合 |
--force 系オプションはステップ 1〜4 で解決しない場合のみ検討する。