Gentoo emerge
emerge
是 Portage
的命令行接口,也就是大多数用户和Portage交互所使用的,是Gentoo Linux最重要的命令之一。
emerge
可以提供有关将进行的哪些更改的丰富输出,并提供各个包或系统的信息和警告。 --ask
/ --pretend
/ --verbose
选项可以让Portage显示更多有用信息。
常用参数组合
-atv
表示--ask
,--tree
和--verbose
,可以让emerge
在实际执行前询问,显示软件包依赖树关系,以及详细的输出信息:
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 ):
备注
不要混淆 -c
( --depclean
)参数和 -C
( --unmerge
)参数:
-c
(--depclean
)参数是安全的,不会破坏系统-C
(--unmerge
)是高风险参数,能够删除影响系统运行的关键软件包, 不要使用 -C (大写)参数
清理孤儿软件包
清理孤儿软件包分两个步骤:
首先完成完整的 升级Gentoo :
emaint -a sync
emerge -avuDN @world
然后结合
--ask --depclean
参数清理孤儿软件包:
--ask --depclean
参数清理孤儿软件包emerge --ask --depclean
保留特定软件包
可以通过 --noreplace
参数来确保某个软件包不被 emerge --depclean
清理掉:
emerge --noreplace <atom>
解决冲突文件
在执行 升级Gentoo 时候,有时候会遇到ebuild更新包和现有安装包的文件冲突,例如执行:
emerge -avuDN @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
使用如下参数:
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不升级
使用 Gentoo Equery 检查当前系统的glibc版本
glibc
版本equery --quiet list glibc
输出信息:
glibc
版本,显示是 2.37-r7sys-libs/glibc-2.37-r7
配置
mask
将>=
当前系统安装glibc版本mask掉,这样就不会在 升级Gentoo 时候出现升级glibc:
>=
当前系统安装的glibc扳本可以避免glbc特定版本被升级echo ">=sys-libs/glibc-2.37-r7" >> /etc/portage/package.mask/glibc
检查"孤儿"软件包
eix
( app-portage/eix
)工具可以检查孤儿软件包:
eix-test-obsolete
在修改了USE之后需要对系统重构
emerge --ask --changed-use --deep @world
emerge
代理
一些emerge使用了GitHub的git仓库,此时会遇到GFW的阻塞导致无法完成安装部署。解决的方法是使用 proxychains 来强制tcp连接通过代理服务器,例如 SSH Tunneling: 动态端口转发 构建的 socks5
代理