Gentoo 勉強会資料

はじめに

あの時は資料もなく、かなり行きあたりばったりに話してさらに時間が経って忘れかけているのもありますが思い出しつつこの前のGentoo勉強会の資料を書いてみましょう。

想定層は Gentoo いれてみて、ちょっと上を目指したいあたりでしょうか?

/etc/make.conf

とりあえず、 /etc/make.conf をながめました。/etc/make.conf は Gentoo の設定の中核をなすと言っても過言ではないでしょう。

コンパイラ設定
CFLAGS="-march=k8-sse3 -mcx16 -msahf --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512 -mtune=k8 -O2 -fomit-frame-pointer -pipe"
CXXFLAGS="${CFLAGS}"
  
CHOST="x86_64-pc-linux-gnu"

CFLAGS 長いですね。しかし、これは CFLAGS="-mach=native -O2 -fomit-frame-pointer -pipe" を展開したものです。"-march=native" は gcc-4.2 から導入された gcc がCPUを自動判定して、CPU用の最適化オプションをつけてくれものです。 (http://en.gentoo-wiki.com/wiki/Safe_Cflags#-march.3Dnative)

しかし、これには一つ問題があります。distcc や icecc といった分散コンパイル環境ではこのオプションはうまく動作しない可能性があるのです。この "-march=native" が分散された先の CPU の設定を行なってしまうためです。

これを回避すべく、 "-march=native" を展開して CFLAGS に設定しておきます。展開するスクリプトid:tmatsuu さんの記事(gcc -march=nativeが生成する最適化オプション - Dマイナー志向)を見てください。このスクリプトの動きを簡単に解説すると、 gcc に "-v" をつけることで実際にコンパイラをどう起動しているかが表示されます。それを "-march=native" 付きと付いていないものとで比較し差分を見ているわけです。

残り CXXFLAGS は CFLAGS と同じはまぁ定石でしょうか。 CHOST は Linux ではほとんど変えることがないでしょう。 Gentoo/{FreeBSD,DragonFly} では "i686-gentoo-freebsd8.0", "i686-gentoo-dragonfly2.6" のように、元にしているBSDのバージョンをつけることになっています。(変えなくてもだいた動作していますが…) 変えた場合は、 emerge -e system で変更を binutils や libc あたりに適用しましょう。

コンパイル性能系
#MAKEOPTS="-j -l3"

#FEATURES="ccache distcc parallel-fetch metadata-transfer"
FEATURES="ccache parallel-fetch metadata-transfer"
CCACHE_DIR="/var/tmp/ccache"
CCACHE_SIZE=2G

#PORTAGE_NICENESS=19
#PORTAGE_TMPDIR="/dev/shm"
#EMERGE_DEFAULT_OPTS="-j --load-average 6 -avt"

Gentoo は、とにかくコンパイルをするディストリビューションなのでコンパイル速度を向上したり、また負荷を下げたりする設定がいろいろとあります。

まず MAKEOPTS。 make に渡される引数ですね。 "-j" は普通は "-j3" のように数字をつけて使い、並列ビルドのジョブ数を指定します。IO待ちの間に走らせることを考えて「(CPU数)x2+1」など指定するようです。ぼくは数字をつけていませんが、この場合無数にジョブ数を増やします。それだと際限がないので、 "-l3" で(他にジョブが走っていて) load average が 3.0 以上であればそれ以上ジョブを起動しないようにします。今はOFFになっていますが、これは結構多くのパッケージで依存関係がおかしくなっていて並列にするとうまく動かないことがあるためです…。

次に FEATURES。 ccache はコンパイルの結果をキャッシュしておいて、再度コンパイルする際にそのキャッシュから結果を取ってくることでコンパイルを速くします。CCACHE_DIR でキャッシュの保管ディレクトリ、 CCACHE_SIZE でキャッシュサイズを指定しています。 FEATURESに戻って、今は OFF にされてますが distcc は distcc による分割コンパイル機能をONにするものです。(http://www.gentoo.org/doc/ja/distcc.xml) parallel-fetch ではコンパイルしている最中に裏で次以降のコンパイルで使うソースコードを取得しにいくようにするもの。 metadata-transfer は依存解決を速くするために portage cache を SQLite で管理する時に必要になります。これはあまり気にしなくていいです。

PORTAGE_NICENESS は見たまんまに emerge の nice値を決めます。昔はemerge がCPU食ってレスポンスが悪くなるのだと思って 19 にしていましたが、最近どうも tar による展開などのIOを食うシーンでレスポンスが悪くなっているのに気がつき emerge を "ionice -c 3 emerge ..." と起動するほうに切り替えました。"ionice -c 3" は Linux kernel 2.6.25 以降で使えます。他のプログラムがIOをしばらくの間使っていない時にこのプログラムが走るようにしてくれます。

PORTAGE_TMPDIR は、ようするに portageコンパイルするディレクトリを指定しています。 "/dev/shm" に指定することで、/dev/shm に多分 mount されてあるであろう tmpfs 上でコンパイルを行ないます。 mount されてなかったら /etc/fstab を見てみてください。多分エントリあるので。さて、 tmpfs は動的に容量を変化できる ramdisk でして、ようするにメモリ上のファイルシステムコンパイルが動く、ということです。これによりIOがかなり低減されます。ただ、メモリをたくさんつんでいないと容量不足で止まってしまったりもします。一応使ってない部分を swap out してくれるので、 swap を 5Gほど取って on にして /etc/fstab で tmpfs の容量を5,6Gに設定しておけばいいかと思います。できるだけ、メモリで作業して足りない分は swap に流してくれます(多分)

EMERGE_DEFAULT_OPTS は emerge のデフォルトの引数を指定するものです。 "-j --load-average 6" の部分はさきほどの make の並列ビルドをパッケージ単位で行なうものです。注意する点としては… "--load-average 6" としていてもなぜかついうっかり load average を超えてしまうことがよくあります…。まぁ多分ジョブを起動するかの判定を unpack 前後、コンパイル前後、インストール前後などでやってるからでしょう…。 "-a" は emerge 前の確認。 "-v" で USE flag なんかを表示するようになります。"-t" はインストールされるパッケージ依存関係を "-a" による確認の際にツリーで表示します。インストールしたくないもの、ブロックしているものがどこからの依存かを見るなどに使います。

パッケージ設定
USE="zeroconf bonjour avahi acpi alsa apache2 bdf bl bzip2 cddb cdparanoia cdr cjk cvs \
     dga directfb divx dvd dvdr dvdread dynamicplugin emacs \
     encode fbcon firefox gcj gd gif gnus gtk gzip-el hddtemp \
     immqt-bc java jpeg lm_sensors maildir matrox mbrola mikmod \
     mozilla mp3 mplayer msn mule mysql nsplugin nss ogg openal \
     opengl php png qt3 qt3support qt4 quicktime ruby sdl \
     sensord sound spell sqlite subtitles svg sysfs tetex threads \
     toolkit-scroll-bars truetype tse3 usb vorbis wmp X xface xft \
     xine xinetd xml xscreensaver xvid zip zsh-completion kde \
     -gnome -eds esd -berkdb -ldap -kerberos 3dnow 3dext 3dnowext \
     -gstreamer fortran mmxext ithreads amr -bluetooth xulrunner gmp -dts -x264 ssse3 joystick offensive xcb xinerama"

LINGUAS="ja"

INPUT_DEVICES="evdev mouse keyboard joystick"
VIDEO_CARDS="vesa vga fbdev amd matrox mga nvidia"

SANE_BACKENDS="pixma"

ACCEPT_KEYWORDS="~amd64"
ACCEPT_LICENSE="skype-eula DOOM3 dlj-1.1 googleearth AdobeFlash-10.1"

USE大増殖してますね…。確かなにかの USE flag manager 使ったせい…。本来は profile がある程度やってくれてるのでそこから必要な分だけ足したり引いたりしましょう。今は、 portage-utils に入っている quse を使い、 "quse -D toolkit-scroll-bars" などとして USE flag が global かどうか、と flag の説明とを見ます。 global ならば /etc/make.conf に書いて、 local ならば /etc/portage/package.use に個別に書いてます。global と local の違い? よく使われているかどうかですかね…。

LINUGUAS, INPUT_DEVICES, VIDEO_CARDS, SANE_BACKENDS。それぞれ多言語対応、X入力デバイス、X出力デバイス、スキャナデバイスでなにを使うかを設定しています。

ACCEPT_KEYWORDSは普通に使っている人は設定するものではないでしょう…。 "~amd64" とすることで amd64用テスト中パッケージをインストールするようになります。バグ出しどんどんやってやる、という人向け。

ACCEPT_LICENSE は最近追加されたものですかね。この変数に LICENSE名を書いてどの LICENSE のものをインストールするかを決めます。man に載っている例とデフォルトの "* -@EULA" を解説しておきます。

# どんなライセンスでもOK
ACCEPT_LICENSE="*"
# "public-domain" というライセンス以外はOK
ACCEPT_LICENSE="* -public-domain"
# FSF-APPROVED というライセンスグループのものだけがOK
ACCEPT_LICENSE="-* @FSF-APPROVED"
# エンドユーザ用ライセンスは確認
ACCEPT_LICENSE="* -@EULA"

といったところです。

portage-utils

portage-utils は Gentoo を使う上でかかせない便利なパッケージです。 http://www.gentoo.org/doc/ja/portage-utils.xml も参考にどうぞ。

qgrep

ebuild の中を grep します。一般ユーザで使う前に "q -r" を root で動かすことが必要です。

$ qgrep foo
        # --with-foo are broken, any use of --with/--without disable the
        # --with-foo are broken, any use of --with/--without disable the
        # --with-foo are broken, any use of --with/--without disable the
        # --with-foo are broken, any use of --with/--without disable the
        #epatch "${FILESDIR}"/${PV}/${PV}-foo.patch
        #epatch "${FILESDIR}"/${PV}/${PV}-foo.patch
# $Header: /var/cvsroot/gentoo-x86/app-dicts/sword-lightfoot/sword-lightfoot-1.0.ebuild,v 1.1 2009/01/10 23:46:39 beandog Exp $
SWORD_MODULE="Lightfoot"
DESCRIPTION="John Lightfoot Commentary"
HOMEPAGE="http://crosswire.org/sword/modules/ModInfo.jsp?modName=Lightfoot"
<snip>
qlist

"qlist portage" などのようにすることで、パッケージ名に "portage" を含むパッケージのファイルリストが出力されます。

$ qlist portage
/usr/share/doc/autounmask-0.27/Changelog.bz2
/usr/bin/autounmask
/etc/eixrc
/usr/share/man/man1/eix.1.bz2
/usr/share/doc/eix-0.20.6/eix-db.txt.bz2
/usr/share/doc/eix-0.20.6/eix-xml.txt.bz2
/usr/share/doc/eix-0.20.6/html/eix-xml.xsd
/usr/share/doc/eix-0.20.6/ChangeLog.bz2
/usr/share/doc/eix-0.20.6/AUTHORS.bz2
/usr/bin/eix
<snip>
/usr/sbin/fixpackages
/usr/sbin/archive-conf
/usr/sbin/dispatch-conf
/usr/sbin/update-etc
/usr/sbin/env-update
/usr/sbin/update-env
/usr/sbin/emerge-webrsync
/usr/sbin/regenworld
/usr/sbin/emaint
/usr/sbin/etc-update

"qlist -I portage" で、パッケージ名に "portage" を含むパッケージのリストが出力されます。

$ qlist -I portage
app-portage/autounmask
app-portage/eix
app-portage/g-cpan
app-portage/gentoolkit
app-portage/layman
app-portage/overlay-utils
app-portage/pfl
app-portage/portage-utils
app-portage/profuse
app-portage/ufed
sys-apps/portage

"qlist -Iv portage" で、さきほどのものにバージョン名がつきます。

$ qlist -Iv portage
app-portage/autounmask-0.27
app-portage/eix-0.20.6
app-portage/g-cpan-0.16.2
app-portage/gentoolkit-0.3.0_rc10-r1
app-portage/layman-1.4.1
app-portage/overlay-utils-0.2.1
app-portage/pfl-2.0
app-portage/portage-utils-0.4
app-portage/profuse-0.25.4
app-portage/ufed-0.40.1
sys-apps/portage-2.1.8.3
qsize

"qsize portage" などのようにすることで、パッケージ名に "portage" を含むパッケージの使っているファイル容量を表示します。

$ qsize portage
sys-apps/portage-2.1.8.3: 364 files, 46 non-files, 2032.553 KB
app-portage/autounmask-0.27: 2 files, 5 non-files, 11.701 KB
app-portage/pfl-2.0: 2 files, 9 non-files, 14.242 KB
app-portage/g-cpan-0.16.2: 10 files, 18 non-files, 90.747 KB
app-portage/portage-utils-0.4: 37 files, 11 non-files, 228.432 KB
app-portage/gentoolkit-0.3.0_rc10-r1: 147 files, 35 non-files, 846.37 KB
app-portage/layman-1.4.1: 30 files, 18 non-files, 168.195 KB
app-portage/overlay-utils-0.2.1: 3 files, 5 non-files, 24.119 KB
app-portage/eix-0.20.6: 16 files, 9 non-files, 1139.212 KB
app-portage/ufed-0.40.1: 4 files, 8 non-files, 48.992 KB
app-portage/profuse-0.25.4: 2 files, 5 non-files, 57.950 KB
qcheck

インストールされたファイルのMD5パーミッションなどを確認します。 tripwire 的に使えるんですかね…。

qsearch

パッケージ名とその説明を検索します。 正直なところ eix でいいと思いますね。

$ qsearch foo
app-dicts/sword-lightfoot John Lightfoot Commentary
app-misc/unfoo A simple bash driven frontend to simplify decompression of files
app-xemacs/footnote Footnoting in mail message editing modes.
dev-python/foolscap The next-generation RPC protocol, intended to replace Perspective Broker.
dev-python/snakefood Generate dependency graphs from Python code
games-sports/bygfoot GTK+2 Soccer Management Game
games-sports/foobillard 8ball, 9ball, snooker and carambol game
games-sports/foosball foosball game that uses SDL
net-print/foo2zjs Support for printing to ZjStream-based printers
net-print/foomatic-db Printer information files for foomatic-db-engine to generate ppds
net-print/foomatic-db-engine Generates ppds out of xml foomatic printer description files
net-print/foomatic-db-ppds linuxprinting.org PPD files for postscript printers
net-print/foomatic-filters Foomatic wrapper scripts
net-print/foomatic-filters-ppds linuxprinting.org PPD files for non-postscript printers
net-print/foomatic-gui GNOME interface for configuring the Foomatic printer filter system
net-zope/cmfoodocument Zope/CMF for handling OpenOffice documents
quse

"quse emacs" で USE に emacs を含むパッケージをリストアップします。

$ quse emacs
app-admin/puppet/puppet-0.25.4-r1.ebuild augeas emacs ldap rrdtool shadow vim-syntax 
app-admin/puppet/puppet-0.25.5.ebuild augeas emacs ldap rrdtool shadow vim-syntax 
app-admin/puppet/puppet-2.6.0-r1.ebuild augeas emacs ldap rrdtool shadow vim-syntax 
app-admin/puppet/puppet-2.6.0.ebuild augeas emacs ldap rrdtool shadow vim-syntax 
app-editors/jasspa-microemacs/jasspa-microemacs-20091011-r1.ebuild nanoemacs X xpm 
app-editors/leafpad/leafpad-0.8.17.ebuild emacs 
app-emacs/company-mode/company-mode-0.4.3.ebuild ropemacs semantic 
app-emacs/company-mode/company-mode-0.5.ebuild ropemacs +semantic 
app-emacs/emacs-common-gentoo/emacs-common-gentoo-1.2-r1.ebuild X emacs22icons 
app-emacs/emacs-common-gentoo/emacs-common-gentoo-1.2.ebuild X emacs22icons 
<snip>

"quse -D esd" で USE flag の説明が表示されます。 これを見ながら、ON/OFF選ぶとよいでしょう。

$ quse -D esd
 global:esd: Adds support for media-sound/esound (Enlightened Sound Daemon)
 local:esd:app-emulation/qemu: Enable esound output for sound emulation
 local:esd:app-emulation/qemu-kvm: Enable esound output for sound emulation
 local:esd:app-emulation/qemu-kvm-spice: Enable esound output for sound emulation
 local:esd:app-emulation/qemu-softmmu: Enable esound output for sound emulation
qdepends

"qdepends emacs-vcs" で "emacs-vcs" をパッケージ名にふくむパッケージの依存情報を表示します。

$ qdepends emacs-vcs
app-editors/emacs-vcs-23.2.9999: sys-libs/ncurses >=app-admin/eselect-emacs-1.2 net-libs/liblockfile media-libs/alsa-lib sys-libs/gpm sys-apps/dbus x11-libs/libXmu x11-libs/libXt x11-misc/xbitmaps media-libs/giflib media-libs/jpeg:0 media-libs/libpng >=gnome-base/librsvg-2.0 media-libs/tiff x11-libs/libXpm media-libs/fontconfig media-libs/freetype x11-libs/libXft x11-libs/gtk+:2 dev-util/pkgconfig app-arch/gzip =sys-devel/automake-1.11* >=sys-devel/autoconf-2.61 >=sys-devel/libtool-2.2.6b >=dev-vcs/bzr-1.5
app-editors/emacs-vcs-24.0.9999: sys-libs/ncurses >=app-admin/eselect-emacs-1.2 net-libs/liblockfile media-libs/alsa-lib sys-libs/gpm sys-apps/dbus x11-libs/libXmu x11-libs/libXt x11-misc/xbitmaps media-libs/giflib media-libs/jpeg:0 media-libs/libpng >=gnome-base/librsvg-2.0 media-libs/tiff x11-libs/libXpm media-libs/fontconfig media-libs/freetype x11-libs/libXft x11-libs/gtk+:2 dev-util/pkgconfig app-arch/gzip =sys-devel/automake-1.11* >=sys-devel/autoconf-2.61 >=sys-devel/libtool-2.2.6b >=dev-vcs/bzr-1.5

"qdepends -Q vim" で依存に vim を持つパッケージをリストします。

$ qdepends -Q vim
app-vim/gentoo-syntax-20100215
qpkg

"qpkg sl" で app-misc/sl のバイナリパッケージを作ります。やばめの作業をする時に作っておくと安心ですね。 glibc をダウングレードしたり、 python の実験的なものを試してみたり…。

qfile

"qfile sl" で sl をファイル名に含むをファイルをインストールしたパッケージを表示します。 *これはインストールしてあるパッケージにしか使えません*

$ qfile sl
sys-apps/man (/usr/share/man/sl)
sys-apps/man (/usr/share/locale/sl)
app-misc/sl (/usr/bin/sl)
app-admin/gkrellm (/usr/share/locale/sl)
x11-libs/wxGTK (/usr/share/locale/sl)
games-arcade/frozen-bubble (/usr/share/locale/sl)
dev-libs/newt (/usr/share/locale/sl)
app-emulation/qemu-kvm (/usr/share/qemu/keymaps/sl)
kde-base/kdelibs (/usr/share/apps/ksgmltools2/customization/sl)
kde-base/kdebase-data (/usr/share/locale/l10n/sl)
file: opendir(/var/db/pkg/world) failed: Not a directory
net-print/libgnomecups (/usr/share/locale/sl)
sci-misc/boinc (/usr/share/locale/sl)
games-strategy/wesnoth (/usr/share/man/sl)
games-strategy/wesnoth (/usr/share/games/wesnoth/translations/sl)
app-office/openoffice (/usr/lib64/openoffice/basis3.2/share/template/wizard/letter/sl)

ちなみに、こいつ BSD では動いてません。CVS HEAD には patch 送ってるのでそのうち直るでしょうが…。待てなければ、うちの overlay 使ってください。

qlop

emerge のログを解析して、 emerge 時刻やかかった時間などを表示します。

リストアップ

# qlop -l
<snip>
Sat Aug  7 14:34:58 2010 >>> app-text/pandoc-1.6
Sat Aug  7 14:37:09 2010 >>> dev-vcs/darcs-2.4.4-r1
Sat Aug  7 14:37:16 2010 >>> media-video/nvidia-settings-195.36.24
Sat Aug  7 14:38:10 2010 >>> media-video/dvdrip-0.98.11
Sat Aug  7 14:40:36 2010 >>> x11-themes/fvwm-crystal-3.0.6-r1
Sat Aug  7 14:40:50 2010 >>> x11-wm/awesome-3.4.6
Sat Aug  7 14:44:56 2010 >>> dev-python/pythonmagick-0.9.2
Sat Aug  7 14:46:29 2010 >>> sci-misc/boinc-6.10.58
Sat Aug  7 14:55:01 2010 >>> app-portage/pfl-2.0
Tue Aug 10 22:31:52 2010 >>> sys-apps/groff-1.20.1-r3

経過時間(-t) を人間に読みやすい形で(-H) -H がない場合、秒単位で表示されます。

# qlop -tH openoffice
openoffice: 9 hours, 38 minutes, 53 seconds for 3 merges

overlay

そろそろ overlay について話しましょう。 Gentoo のパッケージ管理システム portageebuild というファイルを読んで、それに書いてある「コンパイルの仕方」を読んでソースを持ってきてはコンパイルをして…ということを行ないます。その ebuild ファイルが置いてあるディレクトリを portage tree などと呼びます。普通は /usr/portage ですね。 emerge --sync で更新される場所です。

portage tree は膨大なパッケージ数をほこりますが、時々ここにも入っていなかったりバグっているものも中にはあります。そういう時に、 portage tree のパッケージを上書きするものとして overlay が使われます。たとえば sunrise という overlay (http://www.gentoo.org/proj/en/sunrise/) は、まだ portage tree に登録されていない、ユーザ(Gentoo developer ではない)から投稿された ebuild を保管する overlay です。

Gentoo にはいくつもの公式の?overlayがあります。その1つ1つを手で登録して更新して…というのは大変ですから overlay を管理する "layman" というパッケージがあります。 "emerge layman" しましょう。

"layman -l" で自分が使っている(layman 管理下の) overlay の一覧が、 "layman -L" で(layman 管理下の) 全てのoverlayの一覧が表示されます。

$ layman -l
* arcon                     [Mercurial ] (https://arcon.googlecode.com/hg/                                                                                                                              )
* d                         [Subversion] (http://subversion.assembla.com/svn/d-overlay                                                                                                                  )
* emacs                     [Subversion] (svn://overlays.gentoo.org/proj/emacs/emacs-overlay                                                                                                            )
* gamerlay                  [Git       ] (git://git.overlays.gentoo.org/proj/gamerlay.git                                                                                                               )
* games                     [Subversion] (svn://overlays.gentoo.org/proj/games                                                                                                                          )
* gentoo-bsd                [Git       ] (git://git.overlays.gentoo.org/proj/gentoo-bsd.git                                                                                                             )
* haskell                   [Darcs     ] (http://code.haskell.org/gentoo/gentoo-haskell/                                                                                                                )
* java-overlay              [Subversion] (svn://overlays.gentoo.org/proj/java/java-overlay/                                                                                                             )
* kvm                       [Git       ] (git://github.com/dang/kvm.git                                                                                                                                 )
* php-testing               [Subversion] (svn://overlays.gentoo.org/proj/php/testing                                                                                                                    )
* pythonhead                [Subversion] (svn://overlays.gentoo.org/dev/pythonhead                                                                                                                      )
* ruby                      [Git       ] (git://git.overlays.gentoo.org/proj/ruby-overlay.git                                                                                                           )
* soor-overlay              [Git       ] (git://repo.or.cz/gentoo-soor-overlay.git                                                                                                                      )
* sunrise                   [Subversion] (svn://overlays.gentoo.org/proj/sunrise/reviewed/                                                                                                              )
* tomoyo                    [Subversion] (http://svn.sourceforge.jp/svnroot/tomoyo/tags/htdocs/repos/gentoo-overlay/                                                                                    )
* voip                      [Subversion] (svn://overlays.gentoo.org/proj/voip/trunk                                                                                                                     )
* vps                       [Subversion] (svn://overlays.gentoo.org/proj/vps                                                                                                                            )
* xemacs                    [Subversion] (svn://overlays.gentoo.org/proj/emacs/xemacs-overlay                                                                                                           )
* xen                       [Subversion] (svn://overlays.gentoo.org/proj/xen/overlay                                                                                                                    )
* zugaina                   [Rsync     ] (rsync://gentoo.zugaina.org/zugaina-portage                                  

$ layman -L
* DuPol                     [Git       ] (git://git.o.g.o/user/DuPol.git, ht...)
* THE                       [Git       ] (git://zen-sources.org/zen/THE.git    )
* akoya                     [Mercurial ] (https://hg.poildetroll.net/hg/gent...)
* alexcepoi                 [Git       ] (git://git.o.g.o/user/alexcepoi.git...)
<snip>
* sunrise                   [Subversion] (svn://o.g.o/proj/sunrise/reviewed/   )
<snip>
* x11                       [Git       ] (git://git.o.g.o/proj/x11, http://g...)
* xemacs                    [Subversion] (svn://o.g.o/proj/emacs/xemacs-overlay)
* xen                       [Subversion] (svn://o.g.o/proj/xen/overlay         )
* xfce-dev                  [Git       ] (git://git.o.g.o/proj/xfce.git, htt...)
* xgr                       [Git       ] (git://github.com/dgoncharov/xgr.git  )
* xhub                      [Git       ] (git://git.o.g.o/user/xhub.git, htt...)
* xmms-zombie               [Git       ] (git://git.goodpoint.de/overlay-xmm...)
* xwing                     [Rsync     ] (rsync://gentoo.xwing.info/xwing-ov...)
* yporti                    [Git       ] (git://gitorious.org/yporti/overlay...)
* zugaina                   [Rsync     ] (rsync://gentoo.zugaina.org/zugaina...)


"layman -a sunrise" で、"sunrise" overlay が追加され、 "layman -s sunrise" で sunrise overlay の更新、 "layman -S"で登録してある全ての overlay が更新されます。

これだけでは portage は overlay を使ってはくれません。 /etc/make.conf の最後に "source /var/lib/layman/make.conf" と書いて layman の設定ファイルを読みこませましょう。 /var/lib/layman/make.conf を見るとわかりますが、 これは PORTDIR_OVERLAY に overlay のディレクトリを設定しているだけのファイルです。 これで emerge ccs-sources とすると TOMOYO Linux のパッチがあたったカーネルソースパッケージがインストールされたりします。

最後に、自分でも overlay を作った場合 /etc/make.conf に PORTDIR_OVERLAY="/home/naota/src/gentoo/portage-overlay/ $PORTDIR_OVERLAY" のように追加すればよいでしょう。

eix

Gentoo には膨大なパッケージがあってそこを探せばだいたいのものが見つかります…しかしそれを探すのが大変ですね…。そんなあなたに eix です。さっそく emerge eix しましょう。

"eix chromium" とすると chromium をパッケージ名に含むパッケージをリストします。

$ eix chromium
* games-action/chromium
     Available versions:  0.9.14 (~)0.9.14.1 {+mixer nls +sdl}
     Homepage:            http://chromium-bsu.sourceforge.net/
     Description:         Chromium B.S.U. - an arcade game

[I] www-client/chromium
     Available versions:  5.0.375.125 (~)6.0.472.33-r1 [M](~)6.0.490.1 **9999 {cups gnome +plugins-symlink sse2}
     Installed versions:  6.0.472.33-r1(18時02分08秒 2010年08月20日)(cups sse2 -gnome)
     Homepage:            http://chromium.org/
     Description:         Open-source version of Google Chrome web browser

* www-client/chromium-bin
     Available versions:  (~)6.0.451.0_p51005 (~)6.0.470.0_p52843 **9999 {+plugins-symlink}
     Homepage:            http://code.google.com/chromium/
     Description:         Open-source version of Google Chrome web browser (binary version)

Found 3 matches.

"eix -S civ" とすると、パッケージの説明文に "civ" を含むパッケージをリストします。

$ eix -S civ
[I] games-strategy/freeciv
     Available versions:  2.2.1 (~)2.2.2 {auth dedicated ggz gtk ipv6 nls readline sdl +sound}
     Installed versions:  2.2.2(05時54分01秒 2010年08月06日)(gtk ipv6 nls readline sdl sound -auth -dedicated -ggz)
     Homepage:            http://www.freeciv.org/
     Description:         multiplayer strategy game (Civilization Clone)

eix のパッケージ情報データベースは eix-update を使って更新します。 emerge --sync で portage tree を更新、 layman -S で overlay を更新、 eix-update でパッケージ情報データベースを更新とするのは面倒ですね。"/etc/eix-sync.conf" に "*" (アスタリスク一つだけ) 書いておきましょう。 あとは eix-sync 1つで、 上記3つの作業を行なってくれます。

さて、 overlay と eix を見て「取得してない overlay も検索できたらいいのに」と思った方もいるかもしれません。 できます。"eix-remote update" でネット経由で全ての公式 overlay を網羅したキャッシュを取得してきて補完してくれます。 ただし、このキャッシュは「仮想キャッシュ」として扱われますので、そのままでは eix-update (eix-sync) 時に消えてしまいます。 "EEP_VIRTUALS=true" と /etc/eixrc に書いておきましょう。

e-file

あのコマンドが使いたい!でも、どこにあるかわからない!

そんな時には e-file です。 emerge pfl しましょう。 ここで USE=network-cron しておくと、自分がインストールしているパッケージの情報を、ネット経由でこいつが使っているデータベースに週一でレポートするようになります。ぜひ協力を。

"e-file lspci" で lspci をファイル名に持つファイルをインストールするパッケージがリストされます。

$ e-file lspci
 *  net-misc/pxes
        Available Versions:     1.0 0.9-r1 0.9 0.8 
        Matched Files:          /opt/pxes-1.0/stock/dist/bin/lspci; /opt/pxes-0.9/stock/dist/bin/lspci; /opt/pxes-0.8/stock/dist/bin/lspci; 

[I] sys-apps/pciutils
        Available Versions:     2.2.4-r3 2.2.4-r2 2.2.4-r1 2.2.4-r0 3.1.7 2.2.3-r2 3.1.4 2.2.3-r1 3.1.7-r0 2.2.10-r0 3.1.4-r0 2.2.0-r1 3.1.2-r0 3.0.2-r0 3.0.0-r0 2.2.9-r0 2.2.8-r0 2.2.7-r1 2.2.7-r0 2.1.11-r5 2.1.11-r4 2.1.11-r3 
        Last Installed Ver:     3.1.7(2010年08月05日 13時18分56秒)
        Homepage:               http://atrey.karlin.mff.cuni.cz/~mj/pciutils.html
        Description:            Various utilities dealing with the PCI bus
        Matched Files:          /usr/sbin/lspci; /sbin/lspci; 

/etc/portage

/etc/make.conf が portage の大枠の設定だとすると、 /etc/portage にはこまごまとした調整の設定を書きます。

/etc/portage/package.mask

バグってるなどでうまく動かないパッケージをマスクします。

# xemacs-21.4.22 はいれない
=app-editors/xemacs-21.4.22
# emacs-vcs (bzr 先端からコードを取得してビルド)の 23-lexbind branch のものはいれない
app-editors/emacs-vcs:23-lexbind
# glibc-2.3.6 より新しいものはいれない
>cross-i686-pc-linux-gnu/glibc-2.3.6

"app-editors/emacs-vcs:23-lexbind" について。 ":" 以降は "SLOT" の名前です。 SLOT とは、「同じ名前のパッケージの中でのさらに下の階層の名前」…でしょうか。 たとえば gcc を見てみましょう。

[I] sys-devel/gcc
     Available versions:  
        (2.95)  *2.95.3-r9 ~*2.95.3-r10!s
        (3.1)   *3.1.1-r2
        (3.2)   **3.2.2!s *3.2.3-r4
        (3.3)   (~)3.3.6-r1!s
        (3.4)   3.4.6-r2!s
        (4.0)   ~*4.0.4!s
        (4.1)   4.1.2!s
        (4.2)   (~)4.2.4-r1!s
        (4.3)   4.3.2-r3!s (~)4.3.2-r4!s (~)4.3.3-r2!s 4.3.4!s (~)4.3.5!s
        (4.4)   (~)4.4.1!s (~)4.4.2!s 4.4.3-r2!s (~)4.4.3-r3!s (~)4.4.4!s (~)4.4.4-r1!s
        (4.5)   [M]**4.5.0!s [M]**4.5.1!s
        {altivec bootstrap boundschecking build d doc fixed-point fortran gcj graphite gtk hardened ip28 ip32r10k java libffi lto mudflap multilib multislot n32 n64 nls nocxx nopie nossp nptl objc objc+
+ objc-gc openmp static test vanilla}
     Installed versions:  4.4.4-r1(4.4)!s(19時28分54秒 2010年08月06日)(fortran gcj gtk mudflap multilib nls nptl openmp -altivec -bootstrap -build -doc -fixed-point -graphite -hardened -libffi -multislo
t -n32 -n64 -nocxx -nopie -nossp -objc -objc++ -objc-gc -test -vanilla)
     Homepage:            http://gcc.gnu.org/
     Description:         The GNU Compiler Collection.

"Available versions"の場所に "(2.95)" "(3.1)" などと書いていますね。これが SLOT名です。 gcc など一部のパッケージでは複数のバージョンを一度にいれておきたいことがあります。SLOT名がなければ、gcc-4.1.2 -> gcc-4.2.4-r1 のように前者が削除され後者に更新されてしまいますが、 SLOT名をそれぞれ "4.1", "4.2" とすることでこういった状況をふせげます。

/etc/portage/package.unmask

さきほどとは逆に maks されているものを解除します。

app-emulation/ies4linux
app-editors/xemacs
games-roguelike/slashem
app-editors/emacs-vcs

パッケージ名だけ書いて全てのバージョンで mask を解除していますね。

/etc/portage/package.use

/etc/make.conf の USE flag はシステム全体の USE flag を設定しますが、このファイルはパッケージごとの USE の ON/OFF を制御します。

app-admin/conky -ipv6
app-editors/emacs source
app-editors/emacs-vcs source
app-emulation/qemu-kvm -modules
app-i18n/uim -gtk prime
app-office/gnucash quotes hbci webkit
app-office/ledger gnuplot
app-text/lcdf-typetools kpathsea

autounmask

マイナーなアーキテクチャ(x86-fbsd, x86-dfbsd, x86-macos あと amd64 も時々)のユーザには*必須アイテム*。 emerge autounamsk しましょう。

まず、目的のパッケージのカテゴリ、パッケージ名、バージョンを確認。

$ eix jailkit
* app-admin/jailkit
     Available versions:  ~*2.10
     Homepage:            http://olivier.sessink.nl/jailkit/
     Description:         Allows you to easily put programs and users in a chrooted environment

ということで目的は "app-admin/jailkit-2.10" です。マスクされてますので、このままでは emerge できません。 手で解除していこうとすると大変です。これを解除しても、もしかするとこれが依存しているパッケージがまたマスクされているかも…? そこで autounmask の出番。

# autounmask app-admin/jailkit-2.10
 autounmask version 0.27 (using PortageXS-0.02.09 and portage-2.1.8.3)

 * Using repositories:
     /usr/portage
     /usr/portage/local/pc_local/
     /home/naota/src/gentoo/portage-overlay/

 * Using package.keywords file: /etc/portage/package.keywords/autounmask-jailkit
 * Using package.unmask file: /etc/portage/package.unmask
 * Using package.use file: /etc/portage/package.use

 * Unmasking app-admin/jailkit-2.10 and its dependencies.. this might take a while..

 * Added '=app-admin/jailkit-2.10 **' to /etc/portage/package.keywords/autounmask-jailkit
 * done!

これ一つで依存なども含めて、 /etc/portage 以下のファイルに追記し emerge できるようにしてくれます。今回は特定のバージョンだけにしましたが、 "-n" をつけることでそのパッケージの全てのバージョンを unmask することが可能です。しかし、この時もバージョン名を指定することは必須です…。

まとめ?

まだいろいろとネタ(sunrise に commit しようぜ!とかオレオレ overlay のススメとか、 g-cpanCPANから ebuild を自動生成とか、 paludis でさくさくインストールとか、 SoC なにやってたのとか…)ありますが……収拾つかなくなるので、とりあえずこのへんで…。ネタフリしていただければいろいろ書きやすかったりするので、コメで疑問質問要望あればお願いします。