うならぼ

申し訳程度のアフィリエイトとか広告とか解析とかは/aboutを参照

EAPIの壁を越えてPortageを更新する

Windows使いとしては、1年以上GentooLinuxを更新せずに放置するとか、やっぱりあるわけです。で久々にうどんワールドしようかなとか思うと、大量のエラーに見舞われるわけです。

まあPortage更新すりゃいいんでしょ。

$ emerge -p1v portage

...

!!! All ebuilds that could satisfy "dev-python/pyblake2[python_targets_pypy(-)?,-python_single_target_pypy(-),python_targets_python2_7(-)?,-python_single_target_python2_7(-),python_targets_python3_4(-)?,-python_single_target_python3_4(-),python_targets_python3_5(-)?,-python_single_target_python3_5(-)]" have been masked.
!!! One of the following masked packages is required to complete your request:
- dev-python/pyblake2-1.1.0::gentoo (masked by: EAPI 6)
- dev-python/pyblake2-0.9.3-r1::gentoo (masked by: EAPI 6)

The current version of portage supports EAPI '5'. You must upgrade to a
newer version of portage before EAPI masked packages can be installed.
(dependency required by "sys-apps/portage-2.3.13-r1" [ebuild])
(dependency required by "portage" [argument])
For more information, see the MASKED PACKAGES section in the emerge
man page or refer to the Gentoo Handbook.

🙄

sys-apps/portage 自体は EAPI 5 であるものの、その依存パッケージが EAPI 6 だけになってしまったようです。

PortageはROOT環境変数ないし --root オプションを使うことでインストール先の環境を変更することができます。これを使って、正常にPortageが動作する環境、stage3から更新をかけてみます。

chrootまで

まずはインストール時と同様にchrootできる状態にします。

# mkdir /mnt/gentoo
# tar xvpf stage3-*.tar.xz -C /mnt/gentoo

# mount --rbind /dev /mnt/gentoo/dev
# mount --rbind /proc /mnt/gentoo/proc

Portageツリーは更新してしまったのがあるのでそれを、またインストール先である / を適当なディレクトリにbindマウントしておきます。

# mkdir /mnt/gentoo/usr/portage
# mount --bind /usr/portage /mnt/gentoo/usr/portage

# mkdir /mnt/gentoo/mnt/parent
# mount --bind / /mnt/gentoo/mnt/parent

ROOTを指定するとROOTにある /etc/portage/* が読み込まれますが、これをそのまま使うと依存関係がまたややこしくなるので、stage3のものをベースにします。MAKEOPTSやFEATURESはよしなに。

# mv /etc/portage /etc/portage_
# ln -s /mnt/gentoo/etc/portage /etc/portage

そしてROOTを毎回指定しなくていいように、chrootしたらexportしてしまいます。

# chroot /mnt/gentoo /bin/bash

# export ROOT=/mnt/parent

いつものemergeバトル

# emerge -p1u portage
...
[blocks B      ] <dev-lang/python-3.3.5-r4:3.3 ("<dev-lang/python-3.3.5-r4:3.3" is blocking dev-lang/python-exec-2.4.5)
[blocks B      ] app-emulation/emul-linux-x86-baselibs ("app-emulation/emul-linux-x86-baselibs" is blocking sys-libs/ncurses-6.0-r1)

手前のは例によって dev-lang/python-exec を足したら消えた、というか最初はこれ出てたはずなんだけど再現できない…。

問題は後者。amd64として構築したGentoo環境では基本的にamd64向けのバイナリしかビルドされないが、バイナリ配布しかないソフトウェアの中にはx86版しかないものがあります。ここでx86版のライブラリも同時にインストールしておこうというのがmultilibプロジェクトで、以前はemul-linux-なんちゃらというパッケージに定番ライブラリのx86バイナリを詰めこんで配布していました。ただこれだと個別のパッケージをユーザー側でどうこうできないしパッチ当ても別になるしで微妙だったので、USEフラグの仕組みでビルド・インストール・依存するABIを選択できるようにしたのがgx86-multilibと呼ばれるものです。

でー…なんかこの環境にはその移行から数年経ってそうなemul-linuxのパッケージが残っていたわけですね。かといってgx86-multilibに乗りかえると該当するパッケージのリビルドが走ってだるい…。

emerge -cpv emul-linux-x86-baselibs から始めて、emul-linuxパッケージを足していきながら、なにに要求されているのかを確認してみると nvidia-drivers だけでした。どのみちEFIブート周りではまって nouveau を検討していましたし、とりあえず今はXは全く使えなくても問題ないです。emerge -C で強引に消してしまう手もありますが、穏便に行きましょう。

# INPUT_DEVICES="" VIDEO_CARDS="" emerge -a1u xorg-drivers
# emerge -ac emul-linux-x86-{baselibs,db,medialibs,soundlibs,xlibs,opengl} nvidia-drivers

これであとは emerge -a1u portage して目標達成です。pythonふたつを含む10パッケージほどが更新されました。/etc/portage/ディレクトリじゃないからリネームしといたよとか言われてますが、まあいいでしょう。後で再mergeするだろうし…。

しかしここからが大変そうだなあ…。

grub2でEFIブートに移行した

メインのGentoo環境(年一回未満syncするだけと化している)がBIOSブートだったのを忘れてGPTディスクに移してあれなことになったので、やっと移行しました。*1

systemrescuecdで起動して、諸々マウントして、chrootして、emerge grub:2 を叩いて、適当に済ませるだけです。日本語の資料は Gentoo WIki にも Arch Wiki にもあるので、安心ですね。

以下どうでもいい話。

  • efifbとnvidia-driversが競合してsystemrescuecdが真っ暗
    →KMSを無効化して起動するオプションを使う
  • なんかESPの前にパーティションが余ってるから結合しよう
    →gdiskで…リサイズが面倒だ、partedで…終了位置指定するのが面倒だ、やっぱりgparted。
  • chroot内でgrub2-installしたのにブートエントリ登録されてなくない?? →efishellで直接起動して、改めてgrub2-installしたらちゃんと登録されたっぽい。

あとgrub.conf見てたら懐かしくなったので供養。

splashimage (hd0,2)/boot/splash.xpm.gz
foreground fcb595
background 643426

# jp keymap
setkey at bracketleft
setkey doublequote at
setkey ampersand caret
setkey quote ampersand
setkey parenleft asterisk
setkey parenright parenleft
setkey tilde parenright
setkey equal underscore
setkey plus colon
setkey colon quote
setkey asterisk doublequote
setkey bracketleft bracketright
setkey braceleft braceright
setkey bracketright backslash
setkey braceright bar
setkey backslash equal
setkey underscore plus
setkey backslash bracketleft
setkey bar braceleft
setkey F9 equal
setkey F10 bracketleft
setkey equal k73
setkey bracketleft k7d

#0x361=1280x800 0x33e=640x400 0x31b=1280x1024

title Gentoo Linux 3.12.13 (Highres/Splash)
root (hd0,2)
kernel /boot/kernel-3.12.13-gentoo root=/dev/sdb3 video=vesafb:mtrr:2,ywrap vga=0x361 splash=silent,theme:MyNewLinux console=tty1
initrd /boot/splash/MyNewLinux.gz

title Gentoo Linux 3.12.13
root (hd0,2)
kernel /boot/kernel-3.12.13-gentoo root=/dev/sdb3 video=vesafb:mtrr:2,ywrap vga=0x33e

ブートメニューの背景に凝ってみたり、jp106配列の記号類をマッピングしたり、高解像度化のためにvgaをいじったり、fbsplashを試してみたり、色々やってたなあ。

*1:grub2でEFIブートな環境も作ったことはあったけれど、この環境はMBMからGRUB Legacyをチェインロードするという時代を感じる構成だった。EFIEFIで共通のストアを使うのが便利でもあるしはまりポイントな気もするし、うーん。