portage软件包管理系统¶
Contents
根据emerge和equery手册以及gentoo官方文档整理出的一份笔记。
安装时遇到问题的解决办法¶
安装软件包时如果遇到问题,有个优先选择的解决方案:
- 运行revdep-rebuild修复系统先,或者升级整个系统
- 将当前软件的版本mask,安装低版本的
- 将错误提示中设计到的软件或者软件包重新安装
- 有时是由于某些正在安装软件的USE引起的,可以禁用某些特定的USE
常用工具¶
portage
ebuild
egencache
emerge(*)
emerge-webrsync
portageq
quickpkg
repoman
archive-conf
dispatch-conf(*)
比etc-update好用
emaint
env-update
etc-update
fixpackages
regenworld
update-env
update-etc
gentoolkit
eclean(*)
没事的时候来清理一下系统
enalyze
epkginfo
equery(*)
相当强大的搜索工具,不过比 eix 的速度慢很多
eread
eshowkw
euse
glsa-check
revdep-rebuild(*)
检测并修复整个系统中破损的软件包
portage-utils
- qatom
- qcache
- qcheck
- qdepends
- qfile(*)
- qgrep
- qlist
- qlop
- qmerge
- qpkg
- qsearch
- qsize
- qtbz2
- quse
- qxpak
eix
eix(*)
功能极其强大,手册也相当长……
eix-diff
eix-drop-permissions
eix-functions.sh
eix-installed
eix-installed-after
eix-layman
eix-remote
eix-sync
eix-test-obsolete(*)
用来清理 /etc/portage/* 下的配置文件
eix-update
masked-packages
versionsort
eselect(*)
layman(*)
module-rebuild(*)
genlop
命令行日志查看、搜索
elogv
终端界面日志查看
ufed
终端界面修改USE值
demerge
将系统恢复到之前已经备份的一个状态,指安装的软件包
软件包管理¶
安装软件¶
安装软件包
emerge foo
假装安装软件包(--pretend 或 -p),可以用来查看安装信息,比如依赖和USE等等
emerge -p foo
只下载不安装软件包(--fetchonly 或 -f)
emerge -f foo
卸载软件¶
emerge在卸载软件包时,会卸载安装的所有文件,除了用户修改过的配置文件。
当卸载一个被其他软件包依赖的软件包时,emerge不会给出警告。只有卸载那些重要的软件包时才会警告。
卸载软件包(--unmarge 或 -C)
emerge -C foo
卸载不被依赖的软件包(--depclean 或 -c)
emerge -c
卸载孤立依赖的软件包
- 用emerge -DNauv更新整个系统
- 用emerge -c移除孤立的软件包
- 用revdep-rebuild重建依赖关系
更新系统¶
更新portage树
emerge --sync
更新整个系统
emerge -DNuva world -D --deep 代表升级world中的软件包及其依赖的所有软件包,否则不会升级被world的软件包所依赖的软件包 -N --newuse 代表用新的USE,在修改了USE的设置后使用 -u --update -v --verbose -a --ask注意这样升级仍然不包括一些在软件编译、安装过程中所依赖的软件包,使用 --with-bdeps=y 选项可以包括这些。
查询软件包(普通查询)¶
根据名称查询软件包(--search)
emerge -s foo
正则表达式查询(前面加%)
emerge -s '%^emacs'
将软件所属类别名称也归入查询范围,需要加个’%@’。
emerge -s '%@app.*emacs$'
会查询以app开 头以emacs结尾的软件包,例如app-editors/emacs。
在软件包描述中查询软件(--searchdesc)
emerge -S foo
查询已安装的某个文件属于哪个包(belong)
equery b /bin/cat
查询某个包所安装的文件及其位置(file)
equery f foo
查询软件包(高级查询)¶
利用 equery list [options] PKG 这种命令格式,使用一些额外的 选项来执行软件包的高级查询。
注意在不使用-f选项时需要全部匹配,例如equery list ‘emacs’只 会匹配名称 为emacs的软件包,而不是名称包括emacs的所有软件包。而如 果使用了-f选项则 不需要全部匹配,例如下例中即不需要用equery list -f ‘emacs’则会匹配名称 包含emacs的所有软件包。
常用选项
-d, –duplicates List only packages with more than one version installed.
-f, –full-regex The supplied query is a regular expression.
-m, –mask-reason Print the reason why a package was masked.
-I, –exclude-installed Exclude installed packages from being output.
-o, –overlay-tree Include package from overlays in the search path.
-p, –portage-tree Include all packages from the Portage tree in the search path. Use this option to search through all standard Gentoo packages, including those that are not installed.
查询系统中安装的所有软件包
~# equery l '*'
查询系统中安装的两个及以上不同版本的软件包(duplicates)
~# equery l -d '*'
查询名称为’emacs’的软件包
~# equery l 'emacs'
* Searching for emacs ...
[IP-] [ ] app-editors/emacs-23.3-r1:23
查询名称中包含’emacs’的软件包(这里的”名称”不包括软件包 所属的类别名称)
~# equery l '*emacs*'
* Searching for *emacs* ...
[IP-] [ ] app-admin/eselect-emacs-1.13:0
[IP-] [ ] app-editors/emacs-23.3-r1:23
[IP-] [ ] app-emacs/emacs-common-gentoo-1.2-r2:0
[IP-] [ ] app-emacs/emacs-w3m-1.4.437_pre20110310:0
[IP-] [ ] virtual/emacs-23:0
用正则表达式查询(也在软件包所属的类别名称里搜索)
~# equery l -f 'emacs'
* Searching for emacs ...
[IP-] [ ] app-admin/eselect-emacs-1.13:0
[IP-] [ ] app-editors/emacs-23.3-r1:23
[IP-] [ ] app-emacs/autoconf-mode-2.68:0
[IP-] [ ] app-emacs/color-theme-6.6.0-r1:0
[IP-] [ ] app-emacs/dropdown-list-20090814-r1:0
[IP-] [ ] app-emacs/emacs-common-gentoo-1.2-r2:0
[IP-] [ ] app-emacs/emacs-w3m-1.4.437_pre20110310:0
[IP-] [ ] app-emacs/po-mode-0.18.1.1:0
[IP-] [ ] app-emacs/sawfish-1.32:0
[IP-] [ ] app-emacs/yasnippet-0.6.1c:0
[IP-] [ ] virtual/emacs-23:0
~# equery l -f 'app-admin'
* Searching for app-admin ...
[IP-] [ ] app-admin/eselect-1.2.15:0
[IP-] [ ] app-admin/eselect-ctags-1.13:0
[IP-] [ ] app-admin/eselect-emacs-1.13:0
[IP-] [ ] app-admin/eselect-fontconfig-1.0:0
[IP-] [ ] app-admin/eselect-mesa-0.0.10:0
[IP-] [ ] app-admin/eselect-opengl-1.2.1:0
[IP-] [ ] app-admin/eselect-python-20100321:0
[IP-] [ ] app-admin/perl-cleaner-2.7:0
[IP-] [ ] app-admin/python-updater-0.9:0
在整个portage树里搜索(-p),包括没有安装的软件包
看看有那些管理工具
~# equery l -fp 'app-admin'
同上,不包括没有安装的软件包(-I)
看看有那些管理工具没有安装
~# equery l -fIp 'app-admin'
许可证¶
portage允许按照许可证来安装软件,全局设置由变量 ACCEPT_LICENSE 控制。单独的软件包可以设置在 /etc/portage/packages.license 文件中。
如果许可证前面包括’@’则说明这是一个许可证集合。
ACCEPT_LICENSE="* -@EULA"
默认值,表示除了 End User License Agreements 之外的所有许可证。
ACCEPT_LICENSE="-* @FREE"
表示只接受FREE许可证的软件,具体包括哪些许可证,可以查看 /usr/portage/profiles/license_groups 文件。
ACCEPT_LICENSE="*"
接受所有许可证。
重要的文件和目录¶
/etc/ 见make.conf(5)
/etc/portage/make.profile/ or /etc/make.profile/ site-specific overrides go in /etc/portage/profile/
deprecated
eapi
make.defaults
packages
packages.build
package.accept_keywords
package.keywords
package.mask
package.provided
package.unmask
package.use
package.use.force
package.use.mask
package.use.stable.force
package.use.stable.mask
parent
profile.bashrc
use.force
use.mask
use.stable.mask
use.stable.force
virtuals
/etc/portage/
bashrc
categories
color.map
license_groups
make.conf
mirrors
modules
package.accept_keywords
package.env
package.keywords
package.license
package.mask
package.properties
package.unmask
package.use
repos.conf
/etc/portage/env/ package-specific bashrc files
/etc/portage/profile/ site-specific overrides of /etc/portage/make.profile/
/etc/portage/sets/ user-defined package sets
/usr/portage/distfiles/ 已下载软件包的存放目录
/usr/portage/licenses/ 许可证目录
/usr/portage/metadata/layout.conf
/usr/portage/profiles/
arch.list
categories
info_pkgs
info_vars
license_groups 许可证集合文件
make.defaults
package.mask
package.unmask
package.use
package.use.force
package.use.mask
package.use.stable.force
package.use.stable.mask
profiles.desc
repo_name
thirdpartymirrors
use.desc 全局USE列表
use.force
use.local.desc 每个软件包特定的USE标记
use.mask
use.stable.mask
use.stable.force
/var/cache/edb/ misc internal cache files
/var/db/pkg/ database to track installed packages
/var/lib/portage/
config
world 所有手动安装的软件清单,不包括由于被依赖而安装的
world_sets
/usr/share/portage/config/make.globals 系统级的portage默认设置
USE设置¶
USE概述¶
- 全局USE列表 /usr/portage/profiles/use.desc
- 局部USE列表 /usr/portage/profiles/use.local.desc
局部USE列表文件中包含了很长的软件包名单,以及每个软件包特定的USE标记
USE使用优先级(从低到高)
- make.defaults中的USE设定
- /etc/portage/make.conf中的USE设定
- /etc/protage/package.use中的USE设定
- USE环境变量
查看和操作USE标记¶
查看全局USE的最终设定值
emerge --info
查看某软件包使用的USE值
equery uses foo
使用euse查看USE标记,euse是一个专门查看和设置USE的工具。
查看当前激活的USE标记
euse -a
查看当前激活的全局USE标记
euse -a -g
查看当前激活的局部USE标记
euse -a -l
Portage特色功能¶
通过设置 FEATURES 变量来启用或者禁用某些功能,这是一个空格分割的变量,禁用某项功能时,在其前面加 - 即可。默认值如下:
FEATURES="assume-digests binpkg-logs config-protect-if-modified distlocks ebuild-locks fixlafiles merge-sync news parallel-fetch protect-owned sandbox sfperms strict unknown-features-warn unmerge-logs unmerge-orphans userfetch"
列举一些常用的:
distcc
这个功能允许在网络上的其他机子同时进行编译,加速软件的编译过程。
parallel-fetch
并行下载,就是在安装多个软件时,安装编译某个软件的同时会在后台下载其它的软件
ccache
多次编译同一个软件时会减少编译时间。启用后需要安装 ccache ,并且在 make.conf 中设置:
CCACHE_SIZE="2G" CCACHE_DIR="/var/tmp/ccache"
注意:目前 ccache 存在某些已知问题,所以不推荐启用。
make.conf¶
配置文件¶
- 环境变量
- /etc/portage/make.conf
- /etc/make.conf
- /usr/share/portage/config/make.globals
- /usr/portage/profiles/*/make.defaults
1、2是用户配置文件,3、4是默认配置文件。另外4中的 * 表示用户的profile,即 eselect profile list 列出的值。
优先级0>1>2>3>4,即如果都定义了相同的变量,优先级高的文件中的变量会覆盖优先级低的。有三个特殊变量被称为“递归变量”,即 USE 、 CONFIG_PROTECT 和 ACCEPT_KEYWORDS ,他们的值不会简单由更高优先级文件中的定义所覆盖,如果需要彻底清除,需要使用类似于 USE='-*' 的形式。
可用变量¶
ACCEPT_CHOSTS = [space delimited list of CHOST values]
Specifies acceptable CHOST values. Regular expression syntax is supported, so it is necessary to escape CHOST characters if they have special meaning in regular expressions. Defaults to the value of $CHOST.
ACCEPT_KEYWORDS
启用测试分支,例如将其设置为 ~x86 会启用x86架构的测试分支。默认值是 $ARCH 。
ACCEPT_LICENSE
可接受的许可证。默认值是 * -@EULA 。
ACCEPT_LICENSE="*" # 接受所有许可证 ACCEPT_LICENSE="* -public-domain" # 接受所有许可证,除了public-domain ACCEPT_LICENSE="-* @FSF-APPROVED" # 只接受FSF-APPROVED许可证组
CCACHE_DIR
ccache的目录,默认值是/var/tmp/ccache。
CCACHE_SIZE
ccacche的大小,默认值是2G。
CFLAGS CXXFLAGS
编译C和C++程序时的选项。例如
CFLAGS="-O2 -march=i686 -pipe" CXXFLAGS="${CFLAGS}"
CHOST
编译软件时ebuild用 --host=${CHOST} 传递给configure的值。可参考以下文档:
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Submodel-Options.html http://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Submodel-Options.html http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Submodel-Options.html http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_2.html
problems which have not been solved¶
. how to install a package but not including it in the world set?