portage软件包管理系统

根据emerge和equery手册以及gentoo官方文档整理出的一份笔记。

小技巧

  • 安装一个软件,但不想将其记录在 world 文件中

    使用 emerge -1 进行安装

安装时遇到问题的解决办法

安装软件包时如果遇到问题,有个优先选择的解决方案:

  1. 运行revdep-rebuild修复系统先,或者升级整个系统
  2. 将当前软件的版本mask,安装低版本的
  3. 将错误提示中设计到的软件或者软件包重新安装
  4. 有时是由于某些正在安装软件的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

    将系统恢复到之前已经备份的一个状态,指安装的软件包

参考: http://en.gentoo-wiki.com/wiki/Gentoo_maintenance

软件包管理

安装软件

  • 安装软件包

    emerge foo
    
  • 假装安装软件包(--pretend-p),可以用来查看安装信息,比如依赖和USE等等

    emerge -p foo
    
  • 只下载不安装软件包(--fetchonly-f)

    emerge -f foo
    

卸载软件

emerge在卸载软件包时,会卸载安装的所有文件,除了用户修改过的配置文件。

当卸载一个被其他软件包依赖的软件包时,emerge不会给出警告。只有卸载那些重要的软件包时才会警告。

  • 卸载软件包(--unmarge-C)

    emerge -C foo
    
  • 卸载不被依赖的软件包(--depclean-c)

    emerge -c
    
  • 卸载孤立依赖的软件包

    1. 用emerge -DNauv更新整个系统
    2. 用emerge -c移除孤立的软件包
    3. 用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 选项可以包括这些。

验证软件包的完整性

检查软件包foo的完整性(其中的k代表check)

equery k foo

软件包的依赖关系

直接依赖于foo的所有软件包(其中的d代表depends)

equery d foo

直接或间接依赖于foo的软件包(g代表depgraph)

equery g foo

查询软件包(普通查询)

根据名称查询软件包(--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使用优先级(从低到高)

  1. make.defaults中的USE设定
  2. /etc/portage/make.conf中的USE设定
  3. /etc/protage/package.use中的USE设定
  4. 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 存在某些已知问题,所以不推荐启用。

eix

常用选项

-s -C -c -e

make.conf

配置文件

  1. 环境变量
  2. /etc/portage/make.conf
  3. /etc/make.conf
  4. /usr/share/portage/config/make.globals
  5. /usr/portage/profiles/*/make.defaults

1、2是用户配置文件,3、4是默认配置文件。另外4中的 * 表示用户的profile,即 eselect profile list 列出的值。

优先级0>1>2>3>4,即如果都定义了相同的变量,优先级高的文件中的变量会覆盖优先级低的。有三个特殊变量被称为“递归变量”,即 USECONFIG_PROTECTACCEPT_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?