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を試してみたり、色々やってたなあ。