Gentoo emerge

emergePortage 的命令行接口,也就是大多数用户和Portage交互所使用的,是Gentoo Linux最重要的命令之一。

emerge 可以提供有关将进行的哪些更改的丰富输出,并提供各个包或系统的信息和警告。 --ask / --pretend / --verbose 选项可以让Portage显示更多有用信息。

常用参数组合

  • -atv 表示 --ask , --tree--verbose ,可以让 emerge 在实际执行前询问,显示软件包依赖树关系,以及详细的输出信息:

gentoo安装tmux
emerge -atv app-misc/tmux

在输出信息中分别有以下状态字符表明一个软件包将要进行的动作:

  • U : upgrade, 该软件包将要被升级

  • D : downgrade, 该软件包将要被降级

  • R : re-emerge, 该软件包将要重新编译安装

  • N : new, 该软件包是新安装

  • --search 参数提供了搜索软件包名关键字, --searchdesc 则软件包名和描述的关键字,并且搜索支持正则表达式:

emerge 的搜索功能案例
# 搜索软件包名关键字proxy
emerge --search proxy

# 搜索软件包名和描述关键字proxy
emerge --searchdesc proxy

# 使用正则表达式搜索
emerge -s '%^python$'

# 列出一个分类中的所有软件包
emerge -s '@net-ftp'

删除(uninstall)软件包

在Gentoo中,卸载(uninstall)软件包的命令参数是 --depclean ,缩写是 -c ,所以通常可以使用如下命令(案例是卸载 Nginx ):

使用 emerge 卸载 Nginx
emerge -acv www-servers/nginx

备注

不要混淆 -c ( --depclean )参数和 -C ( --unmerge )参数:

  • -c ( --depclean )参数是安全的,不会破坏系统

  • -C ( --unmerge )是高风险参数,能够删除影响系统运行的关键软件包, 不要使用 -C (大写)参数

清理孤儿软件包

清理孤儿软件包分两个步骤:

使用emaint更新仓库
emaint -a sync
使用emerge升级整个系统
emerge -avuDN @world
  • 然后结合 --ask --depclean 参数清理孤儿软件包:

结合 --ask --depclean 参数清理孤儿软件包
emerge --ask --depclean

保留特定软件包

可以通过 --noreplace 参数来确保某个软件包不被 emerge --depclean 清理掉:

emerge --noreplace <atom>

解决冲突文件

在执行 升级Gentoo 时候,有时候会遇到ebuild更新包和现有安装包的文件冲突,例如执行:

使用emerge升级整个系统(简化参数)
emerge -avuDN @world

报错显示冲突:

emerge World文件冲突
 * Detected file collision(s):
 * 
 * 	/usr/share/rime-data/luna_pinyin.dict.yaml
 * 	/usr/share/rime-data/essay.txt
 * 	/usr/share/rime-data/luna_quanpin.schema.yaml
...
 * Package 'app-i18n/rime-data-0.38.20180515' NOT merged due to file
 * collisions. If necessary, refer to your elog messages for the whole
 * content of the above message.
...

解决方法是针对文件冲突的软件包进行独立 emerge 使用如下参数:

emerge World文件冲突处理
FEATURES="-collision-detect -protect-owned"  proxychains emerge -av1 app-i18n/rime-data 

之后就可以重新进行 升级Gentoo

检查已经安装的软件包

有时候需要知道自己系统上已经安装了那些软件包(及版本),比较简单的方法是使用 equery (通过 app-portage/gentoolkit 提供):

检查系统已经安装的软件包版本
equery list "*"

例如,我需要找出系统中哪个软件包的版本是 1.7.2 以排查 Gentoo Linux Sway fcitx中文输入 报错的软件包版本:

检查系统已经安装的软件包版本包含 1.7.2 版本信息
equery list "*" | grep 1.7.2

输出显示:

检查系统已经安装的软件包版本包含 1.7.2 版本信息输出内容
app-text/hunspell-1.7.2
gui-apps/swaylock-1.7.2
sys-libs/libunwind-1.7.2

pin住Gentoo安装软件包版本不升级

有时候因为兼容性问题,不能升级系统的某个软件包版本,例如我在 Gentoo镜像 最初没有指定64位镜像版本,导致glibc升级时出现 multilib glibc 冲突报错,所以我暂时pin住glibc不升级

检查主机安装的 glibc 版本
equery --quiet list glibc

输出信息:

检查主机安装的 glibc 版本,显示是 2.37-r7
sys-libs/glibc-2.37-r7
  • 配置 mask>= 当前系统安装glibc版本mask掉,这样就不会在 升级Gentoo 时候出现升级glibc:

mask掉所有 >= 当前系统安装的glibc扳本可以避免glbc特定版本被升级
echo ">=sys-libs/glibc-2.37-r7" >> /etc/portage/package.mask/glibc

检查”孤儿”软件包

eix ( app-portage/eix )工具可以检查孤儿软件包:

eix-test-obsolete

在修改了USE之后需要对系统重构

在修改了全局 USE flag 之后对整个系统进行更新
emerge --ask --changed-use --deep @world

emerge 代理

一些emerge使用了GitHub的git仓库,此时会遇到GFW的阻塞导致无法完成安装部署。解决的方法是使用 proxychains 来强制tcp连接通过代理服务器,例如 SSH Tunneling: 动态端口转发 构建的 socks5 代理

参考