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

Gentoo で Portage と Entropy を混ぜて運用する

目的

Chromium などビルドにたいへん時間がかかるものを emerge するのはしんどいので, そういうものだけ Sabayon のバイナリパッケージを導入したい.

Entropy の導入

参考文献: HOWTO: Install from an existing Linux system

Sabayon Wiki の説明にはやや問題があって, このままやると上手くいかない. まず equoPortage にあるので layman を使わなくていいとあるが, 2016年3月現在 Portage にある equo-254, entropy-254 は上手く動かない(equo rescue generate が終わらない)ので, sabayon オーバーレイから入れる必要がある.

# emerge layman
# layman -a sabayon
# layman -a sabayon-distro
# emerge equo
# equo rescue generate

sabayon-distro は当初は必要ないが, あとで必要になるので入れておく. equo でパッケージをインストールすると, おおむね gentoo リポジトリから入れたことになる(equery l '*::gentoo' で出る)のだが, 一部は sabayon ないし sabayon-distro リポジトリになるため, sabayon-distro オーバーレイを追加していないと, equo で入れたものを Portage で mask しても emerge -ugentoo リポジトリのものにダウングレードしようとする.

また, equo にバグ(Bug 4858)があって, equo rescue generate はおそらく失敗する. コマンド実行後に /var/lib/entropy/client/database/amd64/equo.db が存在すれば上手くいっているのだが, 作られていない場合, Sabayon の ISO から equo.db を持ってきて(.iso をマウントしてファイルサイズが大きいやつを mount -t squashfs する) equo rescue generate し直すとよい.

# cp /etc/entropy/repositories.conf.d/entropy_sabayonlinux.org{.example,}
# equo update
# equo repo mirrorsort sabayonlinux.org
# equo rescue spmsync

一部のパッケージのみ Entropy でインストールする

このまま equo upgrade してしまえば Gentoo Linux は Sabayon Linux にコンバートされるわけだが, Sabayon を使うくらいなら Arch でいいじゃん, という向きもあり, この記事ではとりあえず Chromium のみ Entropy で管理することを目指す.

そのためには, Entropy ですべて mask しておいて Chromium のみ unmask したいのだが, Entropy は残念ながら package.maskワイルドカードを(部分的にしか)サポートしておらず, また, unmask より mask のほうが優先度が高いため, package.mask* と書いて package.unmaskwww-client/chromium と書くような運用はできない. そこでしょうがないので Entropy にパッチを当てる.

Entropyですべてマスクする

こいつを /etc/portage/patches/sys-apps/entropy/ に置く. このパッチをあてておくと, equo update の後に equoリポジトリ側の packages.db.mask* を追加してくれる. これで自動的にすべてのパッケージが mask されるが, /etc/entropy/packages/package.unmask はもちろんこれより優先度が高いので, 一部だけ unmask するという運用ができるようになる.

# emerge entropy
# equo update --force

equo upgrade -av して何もアップグレードされなければ成功である.

Chromium だけ Entropy でインストールする場合

Portage::sabayon, ::sabayon-distro, www-client/chromium::gentoo を mask して Entropy で www-client/chromium を unmask すると, emerge -uChromium は無視されて equo upgradeChromium だけがアップグレードされる.

# >> /etc/portage/package.mask <<EOF
*/*::sabayon
*/*::sabayon-distro
www-client/chromium::gentoo
EOF
# >> /etc/portage/package.unmask <<EOF
sys-apps/entropy::sabayon
app-admin/equo::sabayon
EOF
# >> /etc/entropy/packages/package.unmask <<EOF
www-client/chromium
EOF

emerge したら自動的に equo rescue spmsync する

Entropy は Portage でインストールされたパッケージのリストを持っていて, emerge したら equo rescue spmsync で更新することが望ましい. これを自動化する.

# cat >> /etc/portage/bashrc
post_pkg_postinst() {
  if test "$AMANDA_SERVER_TAPE" != sabayon; then
    equo rescue spmsync
  fi
}

equoPortage を呼び出してパッケージをインストールさせるため, post_pkg_postinst() で無条件に equo rescue spmsync すると, equo から post_pkg_postinst() が呼ばれて equo が実行され, デッドロックに陥る. これを回避するため, post_pkg_postinst()equo から呼ばれていないか判断しなければならないが, env してみたところ AMANDA_SERVER_TAPE 環境変数が使えそうだったので, 上のコードではとりあえずこれを使っている. ロックファイルなど, もっと適切なものがあるかもしれない.