Gentoo Prefix on Arch Linux
@ wgjak47 | 星期二,一月 7 日,2020 年 | 4 分钟阅读 | 更新于 星期二,一月 7 日,2020 年

Arch Linux上安装Gentoo Prefix

Arch Linux上安装Gentoo Prefix

背景

archlinuxcn的emacs突然更新到了28,吓了我一跳,27都还有发布呢。然后更新了几次发现Bug比较多。目前的情况是27的开发已经冻结,进入修复bug阶段,过一段时间就能发布了(鬼知道啥时候)。我更新了几次28之后,发现不太稳定,开一段时间之后treemacs会失效, 正好也想试试lsp-ui的webkit渲染文档功能,而archlinuxcn打包的版本并没有增加相关的编译选项。于是我重新研究起在Mac上安装失败的Gentoo Prefix了(注:关于Mac安装失败的原因参见:https://bugs.gentoo.org/701720)

介绍

Gentoo Prefix(现在也叫Gentoo alt),是一种在其它系统上体验Gentoo的一种方式,支持范围从其它Linux发行版到BSD,到Mac甚至是Windows(Cygwin)

安装

安装前必要的参数

export GENTOO_MIRRORS=http://mirrors.tuna.tsinghua.edu.cn/gentoo

在运行bootstrap-prefix.sh前执行这个命令可以指定镜像源,加快源码下载的速度,而想要加快portage的同步速度就要修改${EPREFIX}/etc/portage/repos.conf了,这个就要等stage3之后修改了。

wget https://gitweb.gentoo.org/repo/proj/prefix.git/plain/scripts/bootstrap-prefix.sh
chmod +x bootstrap-prefix.sh
./bootstrap-prefix.sh

注意1,不要试图以非交互模式运行这个脚本,例如curl https://gitweb.gentoo.org/repo/proj/prefix.git/plain/scripts/bootstrap-prefix.sh | bash -, 这会一些选项失效。 注意2,请确认你安装了必要的编译工具和rsync,后者是用来同步Portage

然后根据提示填写相关配置,等待它执行好了(我在i7-8565u上用5个线程大约安装了5个小时左右)。中间随时可以中断,脚本会从上次中断的位置执行下去。

使用

Gentoo Prefix的使用相当简单,打开终端,假设你Gentoo Prefix安装在$HOME/Gentoo,下,执行./startprefix.sh即可,这里会启用一个新的终端会话,增加Gentoo Prefix的Path,然后运行强大的emerge安装你想要的软件吧。

注:我实验了安装带webkit支持的emacs,居然要编译webkit-gtk,太可怕了。不过几个小时之后,最终启动没有任何问题,终端运行emacs顺利的打开了emacs的图形界面。 注: pam在prefix下不能正常使用,请在make.conf里添加-pam

乱码问题

如果你和我一样,用到了zsh,配置了花里胡哨的Powerline,结果乱码,修改${EPREFIX}/etc/locale.gen, 增加你需要的语言编码,例如:

en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8

然后进入Gentoo Prefix环境执行locale-gen即可

原理解析

Gentoo Prefix与homebrew不同,它使用的是一套完全独立的工具链和库,因此除了操作系统内核,几乎完全不受其他的环境影响。整个安装过程只是会利用当前系统的一些工具链来编译stage1,用于安装和运行Portage,然后进入stage2,会继续安装一些核心工具,例如gcc等编译器,然后进入stage3,重新编译@system中所有的包。这个过程中像gcc要重新编译2次。但是这样的好处是你可以hack一些比较重要的库,比如glibc,而不用担心搞坏整个系统。 经过stage 1 2 3,就可以在$HOME目录下,得到一个完整的Gentoo Prefix环境,你甚至在mount --rbind诸如sys,/proc的目录之后chroot进去。当然gentoo prefix不是这样用的,你应该运行startprefix这个脚本,这个脚本主要做了两件事情:

  1. 给你的PATH环境变量加上Gentoo Prefix的路径,方便你访问Gentoo Prefix中的可执行程序
  2. 由于Gentoo Prefix使用自己的glibc,所以直接使用的话可能会出现用户名是非法的问题,这里会同步宿主的/etc/passwd/etc/group的部分信息到Prefix里面的/etc/password/etc/group中,详情参见:https://wiki.gentoo.org/wiki/Project:Prefix/FAQ#Username_becomes_invalid_inside_Prefix

替代品

如果Bootstrap时间对你实在太长,而你其实只是没有root权限安装软件或者把一些软件安装到隔离的环境,我推荐使用以下替代:

参考资料

https://wiki.gentoo.org/wiki/Project:Prefix#Getting_started