在安装了gentoo以后
为了更好的使用,我又做了一些工作,这里稍微记录一下,将来需要时翻阅。
USE的使用
gentoo在编译时使用USE系统调整配置参数,以此可以编译出不同的二进制文件以支持不同的需求。
全局参数
如果是想要全局使用的参数,则要编辑
nano /etc/portage/make.conf
中的
USE="blabla blabla -nouse"
其中输入的参数就是要增加的,如果要去掉某个参数,则要在前面加一个减号
package.use总和文件内的参数
另外,USE系统还会读取/etc/portage/package.use文件里的内容,比如
www-client/firefox pgo lto -hwaccel
# required by kde-misc/kweather-23.08.4::gentoo
# required by kde-apps/kdeutils-meta-23.08.4-r1::gentoo
# required by kde-apps/kdeutils-meta (argument)
>=dev-qt/qtpositioning-5.15.12:5 geoclue# required by kde-apps/kdenlive-23.08.4::gentoo
# required by kde-apps/kdemultimedia-meta-23.08.4::gentoo
# required by kde-apps/kdemultimedia-meta (argument)
=media-video/ffmpeg-4.4.4-r8 libass
意思就是说在编译www-client/firefox这个软件时,增加pgo和lto这两个USE选项,并且去掉hwaccel这个选项。
而如果dev-qt/qtpositioning这个软件包在版本大于5.15.12的时候,就加上geoclue这个USE参数。
而如果media-video/ffmpeg在版本号等于4.4.4时,增加一个USE参数libass
在这个文件中每一行代表一个软件的选项。如果有多个软件就可以写多行
package.use目录设置
还有一种更加灵活的方式。
/etc/portage/package.use不再是一个文件,而是一个目录,这个目录里有多个文件,每个文件内都有一些USE参数适用于不同的软件包。
比如说前面的配置内容,可以放在/etc/portage/package.use目录下firefox、qtpositioning、ffmpeg这3个文件里
这样管理可以更灵活
USE冲突
有时候软件内会有USE参数的冲突,比如说gcc的异常模型,你选了seh就不能选sjlj;再比如说hdf5选择了mpi,那么hdf5的mpi是基于mpich的,那么其他基于openmpi 的就无法安装了。
通常来讲,emerge系统会自动判断USE冲突,如果发现则会停止进行并给出提示。这个时候一般来说可以用命令
etc-update
给出解决方案,按提示操作即可。实际上这个操作会把相关的USE修改添加到/etc/portage/package.use文件的末尾或者/etc/portage/package.use目录下按照字母顺序排列最后的一个文件的末尾。
为了收集这个增加的操作,我会用
touch /etc/portage/package.use/zzz
命令创建一个按照字母顺序排列一定位于最后的空文件来收集系统自动调整的USE参数。然后用文本编辑器来查看,必要的时候把其中一些内容转移到对应的包的文件里面
ACCEPT_KEYWORDS参数
在使用emerge安装一个软件时,有时会有提示
masked by: ~amd64 keyword
这个masked意思就是说gentoo官方不建议用户安装使用这个软件包,而对它进行了屏蔽。而这个keyword就是屏蔽它的原因。更多的内容,可以到
检索该软件包,然后根据官网提示的信息来看。有一些原因是这个软件包太过老旧,或者已经停止维护,有一些是发现了严重的安全漏洞。
不过我个人用下来,发现最多的情况是版本太新,还没有经过严格的测试,所以暂时屏蔽。这个应该是跟个人的使用习惯有关。
Knowledge Base:Accepting a keyword for a single package - Gentoo wiki
如果想要安装这个特定的软件,那么就要根据上面的维基进行调整。在/etc/portage/package.accept_keywords文件中增加一行
www-client/firefox:rapid ~amd64
意思就是说,对于www-client/firefox这个软件的rapid版本,放开~amd64关键字的限制。
和package.use类似,如果想要更加灵活,就把/etc/portage/package.accept_keywords设定成目录,然后在目录下创建一个个单独的文件,通常来讲这个文件的文件名和软件包名相同,然后分别设置。
依赖库改变USE参数
当一个底层库改变了USE参数,需要重新编译
emerge --ask --newuse package_name
但是不要忘了,当底层库更新的时候,依赖于该底层库的其他软件也要对应的重新编译才行,但是要如何才能知道有哪些软件依赖于该底层库呢?如果有太多依赖者,而且它们还有更多的依赖者,这个链条会很长很多,操作起来特别麻烦。gentoo提供了一个简单的工具来处理
@preserved-rebuild - Gentoo wiki
emerge --ask @preserved-rebuild
就可以直接筛选出所有需要重新编译的库,然后自动处理。
emerge的简单用法
安装一个包
emerge --ask --verbose net-proxy/tinyproxy
--ask参数表示安装,--verbose表示提供更多提示信息
搜索一个包
emerge --search proxy # 搜索软件包名中包含proxy的包
emerge --searchdesc proxy # 搜索软件包名和描述中包含proxy的包
emerge -s '%^python$' # 使用正则表达式搜索
emerge -s '@net-ftp' # 列出某一个目录下的所有包
删除一个包
emerge --ask --verbose --depclean net-proxy/tinyproxy
--depclean代表删除这个包
不推荐用
emerge --ask --verbose --unmerge net-proxy/tinyproxy
emerge -C net-proxy/tinyproxy # 缩写-C代表--unmerge
这样会强制删除,可能会损害系统软件包的依赖关系
也可以用
emerge --ask --depclean
删除孤儿包
查询一个包的信息
查询一个包
equery --quiet list gcc
equery --quiet list sys-devel/gcc
equery --quiet list '>=sys-devel/gcc-4'
equery check zilla # 如果包名给的不全是查不到的
equery check '*zilla*' # 但是可以使用通配符
这会列出符合要求的所有版本,比如说gcc可能存在13.2.1、12.3.1等多个版本。有时候,我们需要特定的版本,比如说ffmpeg,在kde-plasma中,依赖的是ffmpeg-4.x,而在新版的kde6中才能使用ffmpeg-6.x
大多数查询支持多个参数作为输入参数
equery hasuse sse sse2
一些模块还允许完整的正则表达式
equery -q list --portage-tree --full-regex '[kr]?flickr.*'
查找文件来自哪一个包
equery belongs -e /usr/bin/glxgears
检查包的完整性
equery check gentoolkit
列出依赖该包的所有包
equery depends pygtk
获取依赖图
equery depgraph mozilla-firefox
列出一个包安装的所有文件
equery files --tree gentoolkit
寻找具有特定USE参数的包
equery hasuse qt3 qt4
查找一个包的USE参数
equery uses gst-plugins-meta
清理emerge的临时文件
如果在emerge一个大软件的时候,发现一个地方的设置错了,不如说USE参数落下一个,这个时候需要终端当前进程,然后重新emerge。就需要清理emerge的临时文件。
这些文件在/var/tmp/portage目录下,直接删除即可
eselect选择特定的方案
系统内有一些配置是可选的,比如说默认编译器可以是gcc,也可以是llvm,而有些软件需要llvm作为默认编译器,这个时候就要用eselect
eselect modules
可以列出支持eselect的所有软件包
eselect module_name
可以列出在对应的模块下,eselect支持什么附加参数,比如说fontconfig就支持enable/disable/list这3个参数,而profile模块就支持list/set/show这3个参数,不同的模块是不一样的
然后根据提示进行操作即可
别的module不管,记得一定要把blas和lapack给改过来,因为它们严重影响科学计算的速度
Blas-lapack-switch - Gentoo wikis
使用第三方源
官方源大概率是无法满足所有人的需求的,可能有些软件直接就缺失,也有可能版本过低。所以需要第三方源。
早年有一个layman的软件用来管理gentoo第三方源,现在已经废弃了。现在用的都是eselect repository
sudo emerge --ask app-eselect/eselect-repository
eselect repository list
# 启用源
eselect repository enable gentoo-zh
# 停用源但保留
eselect repository disable gentoo-zh
# 停用源而且删除
eselect repository remove gentoo-zh
nano /etc/portage/repos.d/eselect.conf # 修改源地址,因为大部分源都是github的,所以需要使用国内镜像
rm /var/db/repos/gentoo-zh/ -rf # 清空旧数据
emaint sync -r gentoo-zh # 同步第三方源
有很多人会说gentoo-zh源的字体、输入法都很好,但是我更喜欢的是clash-verge-bin这个软件,是在Linux上比较少见的可以使用的梯子软件
emerge -avl net-proxy/clash-verge-bin