Ubuntuの「壊れた変更禁止パッケージがあります」エラーにaptitudeで対処する方法


このエントリーをはてなブックマークに追加

Ubuntu 16.04にて、少し前からapt-getで新しいパッケージを入れようとすると「壊れた変更禁止パッケージがあります」エラーが出てインストールできない事象に悩まされていました。

$ sudo apt-get install libgfortran3  
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 libgfortran3 : 依存: gcc-5-base (= 5.3.1-14ubuntu2) しかし、5.4.0-6ubuntu1~16.04.4 はインストールされようとしています
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

aptitudeを使ってこの問題への対応を試みました(参考:apt - E: Unable to correct problems, you have held broken packages - Ask Ubuntu)。以下にその方法について記します。自分でもこれが正しい方法なのかよくわかっていません。試す場合は自己責任でお願いします。

$ sudo aptitude install libgfortran3

とすると、以下のように、壊れたパッケージを修正するための改善案が表示されます。改善案を受け入れるならY、他の改善案を探すならnです。

以下の新規パッケージがインストールされます:
  libgfortran3{b} 
0 個のパッケージを更新、 1 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。
260 k バイトのアーカイブを取得する必要があります。 展開後に 1,290 k バイトのディスク領域が新たに消費されます。
以下のパッケージには満たされていない依存関係があります:
 libgfortran3 : 依存: gcc-5-base (= 5.3.1-14ubuntu2) [5.4.0-6ubuntu1~16.04.4 が既にインストール済みです]
以下のアクションでこれらの依存関係の問題は解決されます:

     以下のパッケージを現在のバージョンに一時固定する:
1)     libgfortran3 [インストールされていません]      



この解決方法を受け入れますか? [Y/n/q/?]

私の場合、Yとしてもパッケージをインストールできなかったので、nで次の改善案を探しました。その結果が以下です。

以下のアクションでこれらの依存関係の問題は解決されます:

      以下のパッケージを削除する:                                              
1)      build-essential                                                        
2)      g++                                                                    
3)      g++-5                                                                  
4)      gcc                                                                    
5)      gcc-5                                                                  
6)      libasan2                                                               
7)      libatomic1                                                             
8)      libcilkrts5                                                            
9)      libgcc-5-dev                                                           
10)     libitm1                                                                
11)     liblsan0                                                               
12)     libmpx0                                                                
13)     libstdc++-5-dev                                                        
14)     libtsan0                                                               
15)     libubsan0                                                              

      以下のパッケージをインストールする:                                      
16)     tcc [0.9.27~git20151227.933c223-1 (xenial)]                            

      以下のパッケージをダウングレードする:                                    
17)     cpp-5 [5.4.0-6ubuntu1~16.04.4 (now) -> 5.3.1-14ubuntu2 (xenial)]       
18)     gcc-5-base [5.4.0-6ubuntu1~16.04.4 (now) -> 5.3.1-14ubuntu2 (xenial)]  
19)     libcc1-0 [5.4.0-6ubuntu1~16.04.4 (now) -> 5.3.1-14ubuntu2 (xenial)]    
20)     libgomp1 [5.4.0-6ubuntu1~16.04.4 (now) -> 5.3.1-14ubuntu2 (xenial)]    
21)     libquadmath0 [5.4.0-6ubuntu1~16.04.4 (now) -> 5.3.1-14ubuntu2 (xenial)]
22)     libstdc++6 [5.4.0-6ubuntu1~16.04.4 (now) -> 5.3.1-14ubuntu2 (xenial)]  

      以下の依存関係を未解決のままにする:                                      
23)     codeblocks が gcc | g++ を推奨                                         
24)     dpkg-dev が build-essential を推奨                                     
25)     cmake が gcc を推奨                                                    


この解決方法を受け入れますか? [Y/n/q/?] 

ここでYとすると、無事所望のパッケージをインストールできました。しかし、今度はgccとg++がアンインストールされ、利用できなくなってしまいました。

sudo aptitude install g++

以下の新規パッケージがインストールされます:
  g++ g++-5{a} gcc{a} gcc-5{a} libasan2{a} libatomic1{a} libc-dev-bin{a} 
  libc6-dev{ab} libcilkrts5{a} libgcc-5-dev{a} libitm1{a} liblsan0{a} 
  libmpx0{a} libstdc++-5-dev{a} libtsan0{a} libubsan0{a} linux-libc-dev{a} 
  manpages-dev{a} 
0 個のパッケージを更新、 18 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。
26.5 M バイトのアーカイブを取得する必要があります。 展開後に 101 M バイトのディスク領域が新たに消費されます。
以下のパッケージには満たされていない依存関係があります:
 libc6-dev : 依存: libc6 (= 2.23-0ubuntu3) [2.23-0ubuntu7 が既にインストール済みです]
以下のアクションでこれらの依存関係の問題は解決されます:

     以下のパッケージを現在のバージョンに一時固定する:    
1)     g++ [インストールされていません]                   
2)     g++-5 [インストールされていません]                 
3)     libc6-dev [インストールされていません]             
4)     libstdc++-5-dev [インストールされていません]       

     以下の依存関係を未解決のままにする:                  
5)     gcc が libc6-dev | libc-dev を推奨                 
6)     gcc-5 が libc6-dev (>= 2.13-0ubuntu6) を推奨       
7)     libgcc-5-dev が libc6-dev (>= 2.13-0ubuntu6) を推奨

Yで答えましたが、まだgccもg++も利用できません。再びsudo aptitude install g++で、いちどnしたあとの

以下のアクションでこれらの依存関係の問題は解決されます:

     以下のパッケージをダウングレードする:                      
1)     libc6 [2.23-0ubuntu7 (now) -> 2.23-0ubuntu3 (xenial)]    
2)     libc6-dbg [2.23-0ubuntu7 (now) -> 2.23-0ubuntu3 (xenial)]

Yで受け入れると、gccとg++が使えるようになりました。