Gentoo 上恢复 GCC

最近好久没升级 Gentoo,冒出一堆新 profile,于是手贱的 eselect profile set xxx,呃,选了一个 no-multilib。

奇妙的是,我居然按照提示重新编译了整个 world。

懵逼了,回不去 multilib 了,手贱要剁手。

Gentoo 什么都好,就是一旦完成了 no-multilib,就再也无法简单的切换到 multilib 了。

不过,天无绝人之路,办法总是有的。stage 3 中就有现成的 GCC 的二进制版,我们需要的只是打包一下,copy 到原系统安装。

简单操作

提取 GCC

创建一个目录,如同第一次安装 Gentoo 时候那样做,下载最新的 stage 3,chroot 进去,打包 GCC。

mkdir /mnt/gentoo
cd /mnt/gentoo
wget http://mirrors.163.com/gentoo/releases/amd64/autobuilds/current-stage3-amd64-systemd/stage3-amd64-systemd-20180113.tar.bz2
tar xvpf stage3-amd64-systemd-20180113.tar.bz2
chroot /mnt/gentoo /bin/bash
quickpkg sys-devel/gcc
exit
安装二进制 GCC

将打包的二进制 GCC 拷贝到原来系统对应的目录,安装他。

mkdir -p /usr/portage/packages/sys-devel
cp -v /mnt/gentoo/usr/portage/packages/sys-devel/gcc-*.tbz2 /usr/portage/packages/sys-devel
emerge -1 --usepkgonly gcc
重建工具链

选择刚才安装的 GCC,并且重建下工具链,呃,这一步之前,可能需要重新编译下 sys-apps/sandbox

gcc-config -l
gcc-config N
source /etc/profile
FEATURES='-sandbox -usersandbox' emerge -1 sys-apps/sandbox
emerge -1 sys-devel/libtool sys-devel/binutils sys-libs/glibc

通用操作

一般情况下,问题至此解决。

不过呢,实际情况是非常复杂的,譬如 stage 3 的 keywords 并非 ~x86 ~amd64,而你的系统可能就是 ~x86 ~amd64,版本不一致。没关系,chroot 之前当作安装全新的 Gentoo 那样去操作,chroot 之后升级到最新版本呢,然后提取相关二进制包。

创建chroot临时目录,下载最新的 stage 3 与 portage。

mkdir /mnt/gentoo
cd /mnt/gentoo
wget http://mirrors.163.com/gentoo/releases/amd64/autobuilds/current-stage3-amd64-systemd/stage3-amd64-systemd-20180113.tar.bz2
tar xvpf stage3-amd64-systemd-20180113.tar.bz2
wget http://mirrors.163.com/gentoo/releases/snapshots/current/portage-latest.tar.bz2
tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr

拷贝一些必要的文件,为了 USE flage 一致。

cp -rf /etc/portage /mnt/gentoo/etc/
cp -L /etc/resolv.conf /mnt/gentoo/etc/

挂载必要的目录,否则一些包可能无法顺利编译,譬如 sys-libs/glibc

mount /dev/sda2 /mnt/gentoo                 # 你的根目录所在
mount -t proc /proc /mnt/gentoo/proc
mount -R /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys         # 如果想调整 systemd
mount -R /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev         # 如果想调整 systemd

chroot 之后呢,可以将对应的版本升级到最新版。

eselect profile list
eselect profile set N
env-update && source /etc/profile
emerge --sync
emerge -avu sys-devel/gcc
gcc-config -l
gcc-config N
source /etc/profile

是的,按照全新系统的步骤去操作,可以更新整个 portage 到最新,编译你需要的工具链版本,打包二进制。当然,你可以一次性的在这里将其他的包也编译成二进制,譬如 sys-apps/sandboxsys-devel/libtoolsys-devel/binutilssys-libs/glibc等。

emerge -1 sys-apps/sandbox sys-devel/libtool sys-devel/binutils sys-libs/glibc
quickpkg sys-devel/gcc sys-apps/sandbox sys-devel/libtool sys-devel/binutils sys-libs/glibc

随后,推出 chroot 环境,将二进制包拷贝到原系统中,通过 --usepkgonly 安装到原系统中即可。