読者です 読者をやめる 読者になる 読者になる

解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【Gentoo】eix でリポジトリの更新内容がわかりやすくなる

eix (app-portage/eix) ( https://github.com/vaeth/eix/ )をインストールしなくてもGentoo自体は動きますが、インストールしないと管理が手間取るので、インストールはほぼ必須だと思います。 それくらい便利なツールです。

便利なコマンド eix-sync

例えば、 eix-sync というコマンドは、デフォルトでは以下の処理を行います。(いわゆる wrapper です。)

  1. emerge --syncの実行(リポジトリの更新)
  2. eix 自身の古いキャッシュをバックアップ(cp /var/cache/eix/portage.eix /var/cache/eix/previous.eix
  3. eix 自身のキャッシュを更新(eix-update コマンドの実行)
  4. この eix の新旧キャッシュの差分、つまりリポジトリの更新内容を表示(eix-diff コマンドの実行)

また、以上のほかに、/etc/eix-sync.conf をカスタマイズすることで、さまざまなコマンドを実行させることも可能です。

とにかくまず、eix-sync を実行すれば、Portageパッケージマネージャのリポジトリ更新コマンドである emerge --sync は実行されるので、別途に実行する必要はありません。

eix自身が使用するキャッシュも、 eix-synceix-update も実行するので更新されます。

そして、 eix-diff が実行されるので、リポジトリの更新内容が表示されます。 この eix-diff のために、リポジトリ更新前に予めキャッシュをバックアップするわけです。(cp /var/cache/eix/portage.eix /var/cache/eix/previous.eix

eix-diff は例えば以下のように表示します。

$ eix-diff
Diffing databases (19888 -> 19888 packages)
[>]   == media-libs/libshout (2.3.1-r1 -> (~)2.4.1): library for connecting and sending data to icecast servers

eix-sync をしない場合には

Portage以外のパッケージマネージャ(Paludis や Pkgcore)を利用するのでemerge --syncを実行されては困るときなど、eix-sync を使用しない場合もあるでしょう。

もしも eix-sync コマンドを使用しないのであれば、

  1. リポジトリ更新前に cp /var/cache/eix/portage.eix /var/cache/eix/previous.eix
  2. リポジトリを更新(cave sync / pmerge --sync
  3. eix-update

という手順を踏まないと、 eix-diff コマンドの意味がありませんので、注意が必要です。

eix -u はアップグレード可能なパッケージを表示

eix-diffリポジトリの更新内容を表示しますが、eix-u オプションは、アップグレード可能なパッケージを表示します。 つまり、インストール済パッケージのうち、アップグレード可能なバージョンがあるものを表示します。

デフォルトでは、スロットが異なる場合でも表示します。 例えば、 GTK+ のバージョン2系しかインストールしていない状態だと、 バージョン3系のバージョンも「アップグレード可能だ」ということで表示されます。 これを避けるには、UPGRADE_TO_HIGHEST_SLOT=false という variable を与えて実行します。

$ UPGRADE_TO_HIGHEST_SLOT=false eix -u

UPGRADE_TO_HIGHEST_SLOT=false のときにはスロット超えのバージョンアップは表示されませんので、例えば gentoo-sources のようなカーネルも、アップグレード可能でも表示されませんので、気をつけてください。

ちなみに、表示が詳しすぎるのでパッケージ名だけ表示させたいという場合には、-# オプションを組み合わせます。ただしシェルでは#は特別な意味をもつ特殊文字なので、エスケープする必要があります。

$ eix -u\#

もちろん、シングルクオーテーションによるエスケープでもかまいません。

$ eix -u'#'

emergeeix の相異

たしかに、 emerge -upvt @worldemerge --update --pretend --verbose --tree)を実行すれば、何がアップグレード可能かが表示されます。

しかし emerge はあくまでもインストールのコマンドです。他方の eix は、リポジトリ検索のためのツールです。

つまり、emerge -upvt @world は、実際に何がアップグレード可能(インストール可能)かを表示します。 eix -u は、現実にインストール可能かどうかは承知していません。

emerge は、-D (--deep) オプションを与えないと、 dependency で自動的にインストールされたパッケージ(runtime depend;${RDEPEND}に相当)までは更新を試みません。(この仕様は、不必要な更新を避けて更新作業を少なくしたい場合に有用です。)

また、--with-bdeps y オプションを与えないと、インストール時のみに必要なだけの dependency (${DEPEND}に相当)は更新を試みません。例えば、コンパイラや、ドキュメントを生成するためのパーサなど、その多くは更新必須ではないものとして外されてしまいます。

ですから、 emerge コマンドでアップグレード可能なものをなるだけ多く表示させたいのであれば、 emerge -upvtD --with-bdeps y というコマンドになります。 しかしそれでも、eix -u が純粋にバージョンナンバーだけをみて表示しているのと異なり、 emerge では完璧に全て出てくるとは言い切れません。 これは、emergeeix のそれぞれの目的がそもそも異なるのですから当然で、しかたのないことだと言えます。

重要なのは、 emerge で更新をしているだけだと「取りこぼし」が出る、ということを知っているか否かです。 取りこぼしがあっても大概は支障は出ないのですが、旧バージョンがずーっと放置されたままというのは、(致命的ではなかったとしてもなんらかの)バグのあるバージョンがインストールされたままになるだろうといえます。 「emerge -uDN world をやっていればいいだろう」と惰性で続けているだけでもたしかに動くシステムではあり続けるでしょうけれど、「更新は完璧ではなく取りこぼしがある」ということ自体は知っておいたほうがよいし、知っていればなんらかの不審なことが起こったときに原因究明に役立つでしょうから。


この投稿は Gentoo Advent Calendar 2015 - Qiita 18日めの記事です。

ところで、近年のコンピュータは画期的なまでに省電力で高性能になって、最近のマシンでは GentooFreeBSD(Ports) などをやっていても電力消費の差はほとんどなくなっています。 高性能な GPU や CPU が必要な3Dゲームの方がずっと電力消費が膨大なのですが(発熱の多さ、ファンの騒音をみてもわかりますよね)、そちらの方が沢山のカネが動くということで世間からは喜ばれていますね(ゲーマーがいないと、パーツ屋やNVIDIAなんかはとっくに潰れていると思います)。 5年や10年昔まではGentooFreeBSDをやっていたら「電力の無駄遣いだ」と言われればそのとおりでしたが、今はもうその非難があたらない時代になりましたね。 むしろ、電力消費の少ないマシンを使うこと自体が重要だと思います。