試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

不必要なPortageツリー同期と再ビルドを避けるための覚え書き

最新パッケージ情報を参照して、必要なときだけPortageツリーを同期

gentoo-portage.comというサイトがあり、パッケージの検索、ebuild*1や変更履歴(ChangeLog)の参照などができるのだが、新しく追加されたパッケージの情報もRSSで配信している。
http://gentoo-portage.com/Newest
から、キーワード(「x86*2「~x86*3amd64*4「~amd64*5など)ごとのページを開き、「RSS」の画像のリンク先URLをRSSリーダに貼り付けて使用する。
例えば、x86_64上では

の2つを登録しておく。
これを使用することで、「最新バージョンが出たら上げたい」というパッケージが一覧に含まれていればPortageツリーの同期*6を行ってもよいが、関係なさそうなパッケージしかない場合には同期しなくてもよくなる。
なお、gentoo-portage.comは、たまにアクセスできなくなることがある。

不必要な再ビルドを避ける

大部分のパッケージでは、処理中にビルド*7作業が自動で行われるのだが、これはCPU負荷と時間をかける作業にも関わらず、パッケージ管理システム上、ebuildファイルに付けられたバージョンがシステム上のパッケージのバージョンとなっているため、ときにはebuildファイルに少しの修正が入ったことによりバージョンが上がり*8、システム更新(全てのパッケージのバージョンを上げる)時に再ビルドを行う必要の出るパッケージが出る場合がある。
その中には、不必要な再ビルドを避けることのできるケースもあり、ビルドに時間のかかりそうなものだけでも、再ビルドが本当に必要なのかを確認するようにするとよい。

例(media-gfx/inkscape)

Inkscapeのバージョン0.46が出たときに上げたのだが、バージョン0.46-r1が少し後に追加された。このとき
http://gentoo-portage.com/media-gfx/inkscape
の「ChangeLog」から、「dev-python/lxml」がインストールされていない場合にエフェクトが正常に処理されないという現象が発生するため、依存関係の記述を追加した、ということが分かった。
問題が起きることは確認したが、

この場合、Pythonの追加モジュール*9が足りないのが原因だったため、後から「dev-python/lxml」をインストールすることで問題は解決した。

インストール済みバージョン情報の操作

パッケージ内容は0.46-r1と等価であっても、内部的には「media-gfx/inkscape」のインストール済みバージョンは「0.46」として登録されている状態となっていて、システム更新時に「0.46-r1」に上げされられてしまうことになる。
Gentoo Linuxのインストール済みパッケージ情報は/var/db/pkg/[分野名]/[パッケージ名]-[バージョン]/以下の小さなファイル群に格納されていて、バージョン番号はこのディレクトリ名の一部となっている。
今回のInkscapeの場合は

$ sudo mv /var/db/pkg/media-gfx/inkscape-0.46{,-r1}

でバージョン0.46-r1が入っているように見せかけることができ、結果として、システム更新時の不必要な再ビルドを避けることができた。

*1:パッケージインストールのための指示を記述したbashシェルスクリプト

*2:x86_32の安定版パッケージ

*3:x86_32のテスト/不安定版パッケージ

*4:x86_64の安定版パッケージ

*5:x86_64のテスト/不安定版パッケージ

*6:利用できるパッケージ情報(ebuildファイルなど)を最新のものにする作業で、実行コマンドは「emerge --sync」だが、パッケージを高速で検索するeixを使用していればeix-syncを実行する

*7:プログラムのコードから機械語の実行ファイルや共有オブジェクトに変換する

*8:ebuild自体の修正によるバージョン番号は「-r[ebuildの更新数(1から)]」というルールで上がっていく

*9:インストール時に入っているがどうかは無関係で、後からインストールしても動的に読み込めるため問題ない