package 管理トラブルシューティング - 依存関係エラーの解決法

package 管理トラブルシューティング - 依存関係エラーの解決法

依存関係エラーとは?

依存関係エラーは「パッケージ A のインストールにはパッケージ B が必要だが、B が存在しない・バージョンが合わない」状態で発生する。原因の大半は①リポジトリの不整合、②途中で中断されたインストール、③サードパーティリポジトリの混在のいずれかだ。

解決の基本方針

  1. まず apt update / dnf makecache でリポジトリ情報を最新化する
  2. apt --fix-broken install / dpkg --configure -a で自動修復を試みる
  3. それでも解決しない場合のみ、個別対処に入る

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 パッケージ名

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

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 で解決しない場合のみ検討する。

次に読む