emerge
是 Portage
的命令行接口,也就是大多数用户和Portage交互所使用的,是Gentoo Linux最重要的命令之一。
emerge
可以提供有关将进行的哪些更改的丰富输出,并提供各个包或系统的信息和警告。 --ask
/ --pretend
/ --verbose
选项可以让Portage显示更多有用信息。
-atv
表示--ask
,--tree
和--verbose
,可以让emerge
在实际执行前询问,显示软件包依赖树关系,以及详细的输出信息:
../desktop/tmux/gentoo_tmux
在输出信息中分别有以下状态字符表明一个软件包将要进行的动作:
U
: upgrade, 该软件包将要被升级D
: downgrade, 该软件包将要被降级R
: re-emerge, 该软件包将要重新编译安装N
: new, 该软件包是新安装--search
参数提供了搜索软件包名关键字,--searchdesc
则软件包名和描述的关键字,并且搜索支持正则表达式:
gentoo_emerge/search
在Gentoo中,卸载(uninstall)软件包的命令参数是 --depclean
,缩写是 -c
,所以通常可以使用如下命令(案例是卸载 nginx
):
gentoo_emerge/uninstall_nginx
Note
不要混淆 -c
( --depclean
)参数和 -C
( --unmerge
)参数:
-c
(--depclean
)参数是安全的,不会破坏系统-C
(--unmerge
)是高风险参数,能够删除影响系统运行的关键软件包, 不要使用 -C (大写)参数
清理孤儿软件包分两个步骤:
- 首先完成完整的
upgrade_gentoo
:
upgrade_gentoo/emaint_short
upgrade_gentoo/emerge_world_short
- 然后结合
--ask --depclean
参数清理孤儿软件包:
gentoo_emerge/depclean
可以通过 --noreplace
参数来确保某个软件包不被 emerge --depclean
清理掉:
emerge --noreplace <atom>
在执行 upgrade_gentoo
时候,有时候会遇到ebuild更新包和现有安装包的文件冲突,例如执行:
upgrade_gentoo/emerge_world_short
报错显示冲突:
gentoo_emerge/emerge_world_collisions
解决方法是针对文件冲突的软件包进行独立 emerge
使用如下参数:
gentoo_emerge/emerge_world_collisions_protect-owned
之后就可以重新进行 upgrade_gentoo
有时候需要知道自己系统上已经安装了那些软件包(及版本),比较简单的方法是使用 equery
(通过 app-portage/gentoolkit
提供):
gentoo_emerge/list_installed
例如,我需要找出系统中哪个软件包的版本是 1.7.2
以排查 gentoo_sway_fcitx
报错的软件包版本:
gentoo_emerge/list_installed_1.7.2
输出显示:
gentoo_emerge/list_installed_1.7.2_output
有时候因为兼容性问题,不能升级系统的某个软件包版本,例如我在 gentoo_image
最初没有指定64位镜像版本,导致glibc升级时出现 multilib glibc
冲突报错,所以我暂时pin住glibc不升级
- 使用
gentoo_equery
检查当前系统的glibc版本
gentoo_equery/equery_glibc
输出信息:
gentoo_equery/equery_glibc_output
- 配置
mask
将>=
当前系统安装glibc版本mask掉,这样就不会在upgrade_gentoo
时候出现升级glibc:
gentoo_emerge/mask
eix
( app-portage/eix
)工具可以检查孤儿软件包:
eix-test-obsolete
gentoo_use_flags/rebuild_world_after_change_use
一些emerge使用了GitHub的git仓库,此时会遇到GFW的阻塞导致无法完成安装部署。解决的方法是使用 proxychains
来强制tcp连接通过代理服务器,例如 ssh_tunneling_dynamic_port_forwarding
构建的 socks5
代理