備忘録 blog

Docker/Machine Learning/Linux

Gentoo Linuxでうどんワールドする

tl;dr

Gentoo LinuxPortageを使う際、

# emerge --uDNva @world

をしたときに大量に循環依存やエラーメッセージが出た場合の対処策。

まずはメッセージを読む

$ man emerge

emergeコマンドの説明(できれば英語版のようがよい)を読みながら、出力の意味を理解する。 USEフラグを立てろと言われた場合は、メッセージの通りに設定してもよいですが、私はflaggieを使って管理しています。 maskしろと言われた場合も同様。

例:app-emulation/dockerでaufsフラグを立てたい場合

$ sudo flaggie app-emulation/docker +aufs

それとnewsを読むと役に立つ情報が手にはいります。

$ eselect news read

循環参照じたいは、メッセージで表示されるパッケージに関わるUSEフラグを適当に-gtkとか-emacsとかしておいてからemergeして片方ずつ入れれば解決することが多いです。

ghcperlのコンフリクトを解決する

ghcperlといったプログラミング言語本体のパッケージの更新が関わってくると、バージョンの違いによって依存するライブラリがエラーを吐くことがあります。このときは関連するライブラリは入れずに、まずはghcperlだけを先に更新し、それからライブラリをツールを使って一括で更新する、ということでエラーメッセージを回避することができます。

@worldからやると関連のライブラリを更新しようとするためにエラーメッセージが出ることがあり、@systemをまず対象とするとエラーメッセージが出ないかもしれません。そうでない場合は個別にghcperlを選択し、更新をかけましょう。

その後しばしば@preserved-rebuildをしろというメッセージが出るので、実行しましょう。これによってパッケージの更新によって壊れた依存関係を解決してリビルドしてくれます。

emerge -1 @preserved-rebuild

ここで-1というフラグをつけることで、--oneshotつまり、ここで指定したパッケージは@worldに含まずに更新することができます。こうすることで、どうでもいいパッケージの更新を追尾せずにすむので、@worldの肥大化を防げます。

その後、perlであればperl-cleaner --all, pythonであればpython-updatorといったコマンドが用意されているので、その言語固有のパッケージの更新をかけることで、バージョンアップに伴う依存関係の再構築を行うことが可能です。

dispatch-confする

/etc/以下のファイルを、emergeによって推奨する設定に書き換えるとき、それらの作業は手動で行われなければなりません。 古い文献ではetc-updateしろと書いてある場合がありますが、dispatch-confのほうが良さそうです。

dispatch-conf の使い方 - WebOS Goodies

あとは最後に、不要となったパッケージを整理するだけです。

$ emerge --depclean

参考ページ

d.hatena.ne.jp

hanepjiv: Gentoo Linux / gentooのアップデート