Ubuntuのパッケージが壊れてしまった場合

buntuがWindowsと違い、GUIやapt自体でさえも削除できる自由があります。その高い自由度時々危険さが高いです。パッケージをインストールする時などにパッケージマネージャー( )がapt-get動かなくなることがあります。

パッケージが通じない場合

エラーメッセージ

$ sudo apt-get install <パッケージ名>

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package <パッケージ名>

または

E: Package '<パッケージ名>' has no installation candidate

解決方法

初めとしてをsudo apt-get updateしましょう。

パッケージがまだ行っていない場合、Ubuntu の完成パッケージリスト(下記)があってないを意味します。

/etc/apt/sources.list

以下のコマンドでリストを追加できますが、正しいパッケージはインストールしたいパッケージによって異なります。 Googleで検索することをおすすめします。

$ sudo apt-key adv --fetch-keys <パッケージリストのURL>
$ sudo apt-get update

パッケージのコンフリクトがあった場合

パッケージのコンフリクトがあった場合、既にインストールされているパッケージの依存関係ツリーとインストールしようとしているパッケージの依存関係ツリーのバージョンは非互換です。そのため、パッケージをインストールする時のログを注意し、確認事で新たな問題が発生してしまう可能性があります。

エラーメッセージ

以下のようなエラーメッセージが表示された場合、パッケージの矛盾があることを意味します。

$ sudo apt-get install <パッケージ名>

Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
n
The following packages have unmet dependencies:
 nvidia-jetpack : Depends: nvidia-jetpack-runtime (= 5.0.1-b118) but it is not going to be installed
                  Depends: nvidia-jetpack-dev (= 5.0.1-b118) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

適切に解決する方法

コンフリクトを解決できる事もありますが、apt全ての問題解決コマンドを試してみる事をおすすめします。その他のパッケージの問題もある場合にお役に立ちます。

$ sudo apt-get update
$ sudo apt-get clean
$ sudo apt-get autoremove
$ sudo apt-get autoclean
$ sudo apt-get --fix-broken install
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade

1つずつのパッケージの正しいバージョンをインストールする事でコンフリクトを解決できますが、関連パッケージの関連パッケージなども含むと数パッケージから数百パッケージのバージョンを自分で修正する必要があるかもしれません。

残念ながら、aptはコンフリクトに得意ではありませんが、その代わりというaptitudeツールがあります。

適性について

aptitudeaptと違い、コンフリクトがあった時、複数の解決方法を表示してくれますapt

aptitudeがUbuntuの優れたパッケージマネージャーではないため、インストールする必要があります。

$ sudo apt-get install aptitude

aptitudeでのパッケージのインストールコマンドがaptでのコマンドと同じであり、使いやすいと思います。

$ sudo aptitude install <パッケージ名>

コマンド実行の結果の例を紹介します。

The following NEW packages will be installed:
  nvidia-container{ab} nvidia-jetpack nvidia-jetpack-dev{a} nvidia-jetpack-runtime{a} 
0 packages upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 117 kB of archives. After unpacking 795 kB will be used.
The following packages have unmet dependencies:
 nvidia-container : Depends: nvidia-docker2 (= 2.10.0-1) but 2.11.0-1 is installed
                    Depends: libnvidia-container-tools (= 1.9.0-1) but 1.11.0-1 is installed
                    Depends: nvidia-container-toolkit (= 1.9.0-1) but 1.11.0-1 is installed
                    Depends: libnvidia-container1 (= 1.9.0-1) but 1.11.0-1 is installed
                    Depends: nvidia-container-runtime (= 3.9.0-1) but 3.11.0-1 is installed
The following actions will resolve these dependencies:

     Keep the following packages at their current version:
1)     nvidia-container [Not Installed]                   
2)     nvidia-jetpack [Not Installed]                     
3)     nvidia-jetpack-dev [Not Installed]                 
4)     nvidia-jetpack-runtime [Not Installed]             



Accept this solution? [Y/n/q/?] n

最初に紹介されるコンフリクトの解決方法がaptと同様であるため、nを記入し、スキップします。

The following actions will resolve these dependencies:

     Remove the following packages:                                                  
1)     nvidia-container-toolkit-base [1.11.0-1 (bionic, now)]                        

     Downgrade the following packages:                                               
2)     libnvidia-container-tools [1.11.0-1 (bionic, now) -> 1.9.0-1 (bionic, stable)]
3)     libnvidia-container1 [1.11.0-1 (bionic, now) -> 1.9.0-1 (bionic, stable)]     
4)     nvidia-container-runtime [3.11.0-1 (bionic, now) -> 3.9.0-1 (bionic, stable)] 
5)     nvidia-container-toolkit [1.11.0-1 (bionic, now) -> 1.9.0-1 (bionic, stable)] 
6)     nvidia-docker2 [2.11.0-1 (bionic, now) -> 2.10.0-1 (bionic, stable)]          

Accept this solution? [Y/n/q/?] Y

この例で次に紹介された解決方法がdowngradeでました。 変更されるパッケージを確認し、問題がなさそうなダメYを記入しました。

The following packages will be DOWNGRADED:
  libnvidia-container-tools libnvidia-container1 nvidia-container-runtime nvidia-container-toolkit nvidia-docker2 
The following NEW packages will be installed:
  nvidia-container{a} nvidia-jetpack nvidia-jetpack-dev{a} nvidia-jetpack-runtime{a} 
The following packages will be REMOVED:
  nvidia-container-toolkit-base{a} 
0 packages upgraded, 4 newly installed, 5 downgraded, 1 to remove and 0 not upgraded.
Need to get 1,817 kB of archives. After unpacking 4,485 kB will be freed.
Do you want to continue? [Y/n/?] Y

変更されるパッケージの再度の確認の上をY記入しますとパッケージが実際にインストールし始めます。

Get: 1 https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/arm64  nvidia-docker2 2.10.0-1 [5,536 B]
...

途中で得られるエラー

ただし、途中で以下のようなエラーが表示されることもあります。

debconf: delaying package configuration, since <依存パッケージの名前> is not installed

その場合はそのパッケージを事前にインストールし、aptitude install再度実行する必要があります。

$ sudo apt-get install <依存パッケージの名前> -y
$ sudo aptitude install <パッケージ名>

または、以下のようなエラーメッセージも表示される事があります。

trying to overwrite '/etc/.../config.toml', which is also in package <依存パッケージの名前> <パッケージのバージョン>

その場合、事前に<依存パッケージの名前>を削除してから、または全ての依存パッケージをアンインストールしてくださいaptitude install

$ sudo apt-get remove <依存パッケージの名前> -y
$ sudo aptitude install <パッケージ名>

まとめ

Ubuntuのパッケージ管理が自由であるため、aptパッケージの依存関係ツリーが壊れてしまう事があります。

aptが対応できない場合、情報が多いため、aptitudeの使用をおすすめします。

カテゴリー: 未分類 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です