当前位置: 首页 > 文档资料 > Gentoo Linux 手册 >

2. Portage 与软件包

优质
小牛编辑
127浏览
2023-12-01

2.a. 获取软件包信息

工具之王者: emerge

Portage 工具中用户用得最多的便是 emerge. 我们在安装 Gentoo 的时候以及前面的一些章节里都用过它了, 不过当时我们仅仅简单地介绍了一些用法. 本章将为您细述如何使用 emerge 以及如何以它来满足您软件相关的需求.

emerge 是一个用以安装, 卸载, 查询以及维护软件的命令. 它是 ebuild 的一个前端 (front-end); 有兴趣成为 Gentoo 专家的您可以在稍后学习到如何使用 ebuild. 目前我们的焦点是 emerge, 因为它具备 ebuild 所欠缺的一些功能 (如依赖关系的解决 (resolving dependencies), Portage 树的搜索等等).

由于 emerge 对 Gentoo 用户而言是最重要的工具之一, 因此它的手册页也写得非常详尽, 您可以通过 man emerge 来阅读. 您还可以通过运行 emerge --help 来获得嵌入命令 (in-command) 中的帮助.

代码清单 1: 获取 emerge 的帮助
# man emerge
# emerge --help

Portage 树

在开始阐述 emerge 之前, 我们先来看看 Portage 树的样子. 我们去到 /usr/portage 目录并列出其下的子目录看看. 我们使用 ls --classify 列出目录下的内容, 该命令会在目录后添加一个 "/":

代码清单 2: 查看 Portage 树
# cd /usr/portage; ls --classify
app-admin/       dev-ml/            gnome-libs/     net-print/
app-arch/        dev-perl/          gnome-office/   net-wireless/
app-benchmarks/  dev-php/           header.txt      net-www/
app-cdr/         dev-python/        incoming/       net-zope/
app-crypt/       dev-ruby/          jython/         packages/
app-dicts/       dev-tcltk/         kde-apps/       profiles/
app-doc/         dev-tex/           kde-base/       releases/
app-editors/     dev-util/          kde-i18n/       scripts/
app-emacs/       distfiles/         kde-libs/       sec-policy/
app-emulation/   eclass/            licenses/       skel.ChangeLog
app-games/       experimental/      media-fonts/    skel.ebuild
app-gnustep/     files/             media-gfx/      skel.metadata.xml
app-i18n/        fresco-base/       media-libs/     snapshots/
app-misc/        games-action/      media-plugins/  sys-apps/
app-office/      games-arcade/      media-radio/    sys-build/
app-pda/         games-board/       media-sound/    sys-cluster/
app-portage/     games-emulation/   media-tv/       sys-devel/
app-sci/         games-engines/     media-video/    sys-fs/
app-shells/      games-fps/         metadata/       sys-kernel/
app-text/        games-kids/        net-analyzer/   sys-kmods/
app-vim/         games-misc/        net-apache/     sys-libs/
app-xemacs/      games-mud/         net-dialup/     unix2tcp/
berlin-base/     games-puzzle/      net-dns/        x11-base/
dev-ada/         games-roguelike/   net-firewall/   x11-libs/
dev-cpp/         games-rpg/         net-fs/         x11-misc/
dev-db/          games-server/      net-ftp/        x11-plugins/
dev-dotnet/      games-simulation/  net-im/         x11-terms/
dev-embedded/    games-sports/      net-irc/        x11-themes/
dev-games/       games-strategy/    net-libs/       x11-wm/
dev-haskell/     games-util/        net-mail/       xfce-base/
dev-java/        glep/              net-misc/       xfce-extra/
dev-lang/        gnome-apps/        net-nds/
dev-libs/        gnome-base/        net-news/
dev-lisp/        gnome-extra/       net-p2p/

如您所见, Portage 树中包含有好些子目录. 它们中的大部分是用以存放 Gentoo 软件包的一个个类别. 我们来看看 aap-office:

代码清单 3: 查看一个类别
# cd app-office; ls --classify
abiword/     gnotime/   kmymoney2/  ooodi/              plan/     timestamp.x
dia/         gnucash/   koffice/    oooqs/              qhacc/
dia2code/    gnumeric/  lxbank/     openoffice/         sc/
facturalux/  ical/      lyx/        openoffice-bin/     scribus/
gaby/        kbudget/   mdbtools/   openoffice-ximian/  siag/
gnofin/      khacc/     mrproject/  phprojekt/          texmacs/

在一个类别里, 可以看到许多属于这个类别的软件包, 每个软件包都有一个自己的目录. 我们来看看 openoffice 软件包:

代码清单 4: 查看一个软件包
# cd openoffice; ls --classify
ChangeLog  files/        openoffice-1.0.3-r1.ebuild  openoffice-1.1.0-r2.ebuild
Manifest   metadata.xml  openoffice-1.1.0-r1.ebuild  openoffice-1.1.0.ebuild

在示例目录中, 存放了四个 ebuild. 一个 ebuild 就是一个脚本, 它包含了一个特定版本软件包所有的必要的信息. ebuild 的名字几乎都是一样的; 不同之处仅在于版本号部分. 您可以很方便地查看每个 ebuild 的内容: 它们都是纯文本的. 我们暂时不讨论它, 因为仅仅要用好 Gentoo 的话, 了不了解它都无关紧要.

其他文件包括 ChangeLog (包含了 ebuild 的变更列表), Manifest (包含了目录中所有文件的 checksum (Cure: 用以校验文件完整性, 如 MD5 算出来的值) 及其大小), 以及 metadata.xml (包含了关于软件包的更多信息, 像负责该软件开发的团队 -- 被称为 herd -- 以及更多其他的描述信息).

在 files 目录下, 您还可以找到 Portage 需要的其他的一些文件: digests (某版本软件包所需的那些文件的名字, 大小, 以及 checksum), 补丁包, 示例配置文件等等.

代码清单 5: 查看其他的一些文件
# cd files; ls --classify
1.0.3/  digest-openoffice-1.0.3-r1  digest-openoffice-1.1.0-r1
1.1.0/  digest-openoffice-1.1.0     digest-openoffice-1.1.0-r2
# cd 1.1.0; ls --classify
fixed-gcc.patch      ooffice-wrapper-1.3
newstlportfix.patch  openoffice-1.1.0-linux-2.6-fix.patch
no-mozab.patch       openoffice-1.1.0-sparc64-fix.patch
nptl.patch

如果回到 Portage 树的根目录, 您还会发现有一些其他的, 非类别 (non-category) 的目录. 我们会在本章稍后的部分讨论它们.

搜寻软件包

如果您刚接触 Linux 或是 Gentoo, 您或许不知道要完成某项工作到底需要哪个软件包. 为了让搜索更容易 (To facilitate searching), emerge 为您提供了一个搜索系统中软件包的功能. 有两种方式可以进行软件包搜索: 以其名字, 或其名字描述.

代码清单 6: 显示 mozilla 的相关信息
# emerge search mozilla
Searching...   
[ Results for search key : mozilla ]
[ Applications found : 5 ]
(此处略去一些输出信息以方便阅读)
*  net-www/mozilla
      Latest version available: 1.5-r1
      Latest version installed: 1.4-r3
      Size of downloaded files: 29,153 kB
      Homepage:    http://www.mozilla.org
      Description: The Mozilla Web Browser
*  net-www/mozilla-firebird
      Latest version available: 0.7
      Latest version installed: [ Not Installed ]
      Size of downloaded files: 37,850 kB
      Homepage:    http://www.mozilla.org/projects/firebird/
      Description: The Mozilla Firebird Web Browser
(...)

如果您想搜索描述信息, 则使用 --searchdesc 参数:

代码清单 7: 搜寻描述信息
# emerge --searchdesc mozilla
Searching...   
[ Results for search key : mozilla ]
[ Applications found : 10 ]
(此处略去一些输出信息以方便阅读)
*  dev-libs/nss-3.8
      Latest version available: 3.8
      Latest version installed: 3.8
      Size of downloaded files:  2,782 kB
      Homepage:    http://www.mozilla.org/projects/security/pki/nss/
      Description: Mozilla's Netscape Security Services Library that implements PKI support

如您所见, emerge 会告诉您一个软件包所属的类别与名字, 可用的版本, 已安装的版本, 需下载文件的大小, 其主页以及一份小小的描述.

看到一些新东西? 没错, 已下载的文件 (downloaded files). 当您让 Portage 安装某个软件包时, 当然需要有这软件的源码 (或预编译包). 因此它会去 /usr/portage/distfiles 中看看必要的文件都在不在. 如果没有, 它就会去下载并将它们放到这个目录中.

查看变更日志 (ChangeLog)

在浏览 Portage 树时, 我们会看到每个软件包都有一个 ChangeLog (变更日志). 您可以用 emerge 来查看可用版本和已安装版本之间的变更内容. 使用 --pretend --changelog (缩写为 -pl) 参数. 我们以 gnumeric 为例:

代码清单 8: 查看 gnumeric 的变更日志
# emerge --pretend --changelog gnumeric
(此处略去一些输出信息以方便阅读)
*gnumeric-1.2.2
  27 Nov 2003; foser <foser@gentoo.org> gnumeric-1.2.2.ebuild :
  New release, requested in #34492
  updated deps
  12 Nov 2003; Jason Wever <weeve@gentoo.org> gnumeric-1.2.0.ebuild:
  Marked stable on sparc, fixes bug #32405.
  14 Oct 2003; Jason Wever <weeve@gentoo.org> gnumeric-1.0.8.ebuild:
  Added ~sparc keyword.  Fixes bug #31150.

2.b. 更新 Portage

简介

Portage 的搜索是件很不错的事 (Searching through Portage is nice), 不过您要是不时常更新 Portage 树, 系统中的软件会停留在一些版本上 (you will be stuck with the packages and versions available on your system). 这意味着, 您的系统会很快变得过时 (outdated), 且对一些可能存在的安全问题缺少必要的修复 (This means that your system will get outdated pretty soon and that you will be missing bugfixes and remedies for possible security problems).

有几种方法可以更新您的 Portage 树. 最常用的办法便是使用我们 rsync 镜像. 另一种方法则是使用 Portage 快照 (在防火墙或网络原因导致无法使用 rsync 服务器的情况下).

为 rsync 选择一个镜像

非常建议您首先选择一个离您最近的最快的镜像, 您可以手工地 (在 /etc/make.conf 中设置 SYNC 变量) 做这事或让 mirrorselect 为您自动完成. SYNC 变量会在稍后讨论, 目前我们的焦点先放在 mirrorselect 的使用. 首先 emerge 以安装它:

代码清单 9: 安装 mirrorselect
# emerge --usepkg mirrorselect

然后运行 mirrorselect 让它自动为您选择镜像 (它还会为 Portage 配置好源码包的镜像).

代码清单 10: 运行 mirrorselect
# mirrorselect -a -s3

更新 Portage

要以 rsync 更新 Portage, 只需简单地运行 emerge sync:

代码清单 11: 用 merge sync 更新 Portage
# emerge sync

如果不成功 (网络原因或防火墙原因), 您可以试试用 emerge-websync, 这会使用 wget 去下载一个 Portage 树的快照. 这也意味着, 需要的话还可以使用代理. 我们在之前安装 Gentoo 的时候就已经讨论过如何让您的系统使用代理了:

代码清单 12: 用 emerge-webrsync 更新 Portage
# emerge-webrsync

2.c. 软件维护

编译还是预编译?

Gentoo 提供了 ebuild, 以及 Gentoo 软件包 (Gentoo provides ebuilds, the Gentoo packages if you like). 当您想安装这样一个 ebuild 的时候, 您可以选择编译该软件包或使用预编译包. 那么, 两者的长处/短处在哪里, 它们能否共存?

您或者已经猜想到了, 编译一个软件包需要很多的时间 (尤其当您没有什么资源 (Cure: 好的机器...) 或想编译 KDE, OpenOffice.org 这样的庞然大物时). 通过编译软件包, 您可以使用 USE 设置来把软件调整到完全符合系统所需. 当然, 您同时还可以设置很高的优化参数 (在 CFLAGS 和 CXXFLAGS 中设置) 来编译它.

使用预编译包可以极大地减少安装时间 (因为不需要在编译上花时间), 但您将失去 USE 设置和 CFLAGS, CXXFLAGS 所能带来的好处.

前面提到过, 预编译包存放在 /usr/portage/packages/All 中, 而源码软件包则存放在 /usr/portage/distfiles. 在您安装完一个软件后, 您就可以把它的预编译包或源码包从上述的目录中删除. 不过, 您最好能留着这些预编译包/源码包的最新版本, 因为有时您会需要重装它 (免得再去重新下载).

从源码安装软件

好了, 说得够多了, 我们开始动手吧 (?. let's cut to the chase). 我们使用 emerge 来安装软件包. 如果您不想使用任何预编译包, 您只需 emerge <软件包名> 或 emerge <类别>/<软件包名>. 以 gnumeric 为例:

代码清单 13: 编译安装 gnumeric
# emerge gnumeric

这将为您下载其源码并解压, 编译最终把软件安装到您的系统上. 对于其依赖包也会以同样的方式处理. 如果您想查看都有哪些依赖包会被同时安装进来, 请使用 --pretend 参数 (简写为 -p):

代码清单 14: "假想 (Pretending)" 编译安装 gnumeric
# emerge --pretend gnumeric

如果您仅仅想下载源码包及其依赖包, 而不打算编译它, 则请用 --fetchonly 参数 (简写为 -f):

代码清单 15: 获取 gnumeric 的源码
# emerge --fetchonly gnumeric

如果您想看看 emerge 究竟会从哪里下载这些源码包, 则请同时使用 --fetchonly 和 --pretend 参数:

代码清单 16: 列出 gnumeric 源码包的 URL
# emerge --fetchonly --pretend gnumeric

您还可以安装一个软件包的某个指定版本. 例如, 您想安装一个版本低于 1.2 的 gnumeric -- 因为这样那样的某些原因:), 您可以输入:

代码清单 17: 安装指定版本的 gnumeric
# emerge "<gnumeric-1.2"

当然还可以使用 ">" (更高的版本) 以及 "=" (就是某个版本).

安装预编译软件包

您要想安装预编译包, 请使用 --usepkg 参数 (简写为 -k). 当您想安装的软件版本与 /usr/portage/package/All 中可用的二进制包一致时, 软件就会被安装.

代码清单 18: 安装 gnumeric 的预编译包
# emerge --usepkg gnumeric

即便版本不一致, 您还是想使用二进制包, 则请用 --usepkgonly 参数 (简写为 -K):

代码清单 19: 安装 gnumeric 的预编译包
# emerge --usepkgonly gnumeric

注: Gentoo 并未提供任何包含了这些预编译包的服务器或镜像. Portage 是应社区要求而加入这一功能的.

如果您的系统中没有这一二进制软件包, 您就需要下载它, 请用 --getbinpkg 参数 (简写为 -g):

代码清单 20: 下载并安装 gnumeric 的预编译包
# emerge --getbinpkg gnumeric

这将下载软件包及其相关信息并安装到您的系统中, 同时还会装上其依赖包. 如果您想知道都有哪些依赖包会被装进来, 请使用 --pretend 参数 (简写为 -p):

代码清单 21: 假想下载 gnumeric 的预编译包
# emerge --getbinpkg --pretend gnumeric

您还可以选择下载预编译包, 而不检查本地系统的信息且不用系统上已有的预编译包 (如果适用的话) (You can also opt to download the prebuilt package (and the package-related information) without checking the information on your local system and without using the prebuilt package already on your system (if applicable)), 请用 --getbinpkgonly 参数 (简写为 -G):

代码清单 22: 不使用本地信息 (local information) 而安装一个预编译包
# emerge --getbinpkgonly gnumeric

您还可以安装一个软件包的某个指定版本. 例如, 您想安装一个版本低于 1.2 的 gnumeric -- 因为这样那样的某些原因:), 您可以输入:

代码清单 23: 安装指定版本的 gnumeric
# emerge --usepkg "<gnumeric-1.2"

当然还可以使用 ">" (更高的版本) 以及 "=" (就是某个版本).

处理 (Working with) 依赖性

Portage 对依赖性的处理提供充分的 (extensive) 支持. 尽管在通常情况下您完全可以想都不想这些问题 (因为 Portage 能够全自动地处理好依赖关系), 不过呢, 有些用户还是希望能了解如何使用 emerge 以及处理依赖关系.

例如, 您要假想某个软件包的依赖包一个都没装, 可使用 --emptytree (简写为 -e). 再加上 --pretend 参数, 就可以列出某个软件包的整个依赖关系树 (a complete tree of dependencies) (Cure: 即列出该软件包所依赖的所有的其他软件包), 这功能很有用. 如果不用 --pretend, emerge 就会 (重) 编译列出来的所有软件包.

代码清单 24: 列出 gnumeric 的所有依赖关系
# emerge --emptytree --pretend gnumeric

另一个参数是 --nodeps, 这将告诉 Portage 不理会某个软件的依赖关系而直接安装它. 这通常会导致安装不成功:

代码清单 25: 不理会依赖关系而安装 gnumeric
# emerge --nodeps gnumeric

与 --nodeps 相反的是 --onlydeps, 这将让 Portage 安装某个软件包的所有依赖包, 而不安装该软件本身:

代码清单 26: 安装 gnumeric 的依赖关系
# emerge --onlydeps gnumeric

当您卸载一个软件的时候, Portage 不会自动把一些不需要的依赖包 unmerge 掉. 如果您想处理掉这些不用的依赖包以 "清洁" 系统, 可以使用 emerge depclean. 这将从您已安装的软件中符合如下条件的软件包: 1. 那些不是由您明明白白安装上来的, 且; 2. 那些不为您明明白白安装上来的软件包所依赖的软件包 (This will search for all installed software that you haven't installed explicitly and that isn't a dependency of software that you have installed explicitly) (Cure: 译得颇为拗口, 实际上意思很简单, emerge depclean 会清除掉符合如下条件的软件包: 1. 不是我们自己装上来的, 通常是装某个软件包时被作为依赖包自动装进来的, 并且; 2. 这些软件不被我们所装的任一软件所依赖, 也就是说, 原来依赖于它的某个软件包, 可能已经被卸载了, 于是, 它就不再有存在的必要. emerge depclean 会清除掉这些软件包).

敬告: 使用 depclean 很有可能严重地损坏您的系统 (seriously impair your system). 请小心慎用, 并在实际删除前反复检查依赖关系包列表. (Cure: depclean 有可能会删掉有用的东西!)

代码清单 27: 列出与删除已不需要的 (orphaned) 依赖关系
# emerge -p depclean
(在您认真检查过输出的列表之后, 开始卸载不用的依赖关系包)
# emerge depclean

更新您的系统

Portage 知道两个表示软件包集合的特殊标签: systemworld. 在安装 Gentoo 时, 如果您不是从 stage3 开始安装的话, 您应该就已经见过前者了. 我们来重新回忆一下 (To refresh things): system核心 (core) 软件包的一个集合, 这些软件包是 Gentoo 系统要正常运作所必需的.

world 标签则由您自己安装到系统中的所有软件包所组成, 加上 system 的信息. 换句话说, 每次您用 emerge <软件包名> 的方式安装了一个软件, <软件包名> 就会被注册到 world 文件中 (/var/cache/edb/world). 依赖包不会是 world 文件的一部分 (Cure: 也就是说, emerge 一个软件包时, 这个软件包的名字会被记录到 world 文件里, 而它所依赖的那些软件包则不会), 我们稍后会说它.

如果您想更新 system 的软件包, 请使用 --update 参数 (简写为 -u):

代码清单 28: 更新系统软件包
# emerge --update system

对于 world 软件包, 同样:

代码清单 29: 更新整个系统
# emerge --update world

如果您想知道 emerge 都会更新些什么, 请同时使用 --pretend 与 --update 参数:

代码清单 30: 假想更新整个系统
# emerge --pretend --update world
(此处略去一些输出信息以方便阅读)
[ebuild     U ] net-misc/wget-1.9-r1 [1.9] 
[ebuild     UD] media-video/dvdauthor-0.5.0 [0.5.3] 
[ebuild     U ] net-analyzer/ethereal-0.9.16 [0.9.14] 

在单词 "ebuild" 旁边您可以看到一个字母 (或字母的组合), 这可为您提供更多关于软件包的信息:

  • B (blocks) 左边列出来的软件因为冲突原因将阻碍右边列出来的软件的安装
  • N (new) 对于您的系统来说这是一个新软件, 且为第一次安装
  • R (replace) 不是新软件, 不过会被重新 emerge (reemerged)
  • F (fetch) 该软件要求您先把源码手工地下载回来 (例如因为许可 (licencing issues) 的缘故)
  • U (update) 软件包已安装, 不过将被升级
  • UD (downgrade) 软件包已安装, 不过将被降级

我们已经说到过 world 文件不包含依赖关系. 当您运行 emerge --update world 时, 仅有 world 文件中列出的那些软件包及其直接的 (immediate) 依赖包会被检查或, 必要的话, 会被更新. 如果您想让 emerge 检查所有的依赖关系 (包括依赖包的依赖包), 则请加多一个 --deep 参数:

代码清单 31: 更新整个系统, 且包括所有依赖关系
# emerge --update --deep world

当然, 虽然我们这里讲的是 systemworld, 您还是可以把这些操作应用到单个软件包上的.

卸载 (Removing) 软件

如果想卸载软件, 您可以使用 unmerge 参数 (简写为 -C - 大写的 C):

代码清单 32: 卸载软件
# emerge unmerge gnumeric

如果您想尝试性地卸载 (而不是真正地卸载), 可以再次使用 --pretend 参数:

代码清单 33: 假想卸载软件
# emerge --pretend unmerge gnumeric

敬告: Portage 不会检查某个软件是不是被其他一些软件所依赖. 即便该软件是系统要正常运作所不可或缺的一部分, 它也不会警告您.

unmerge 开始的时候, 您会看到长长的属于该软件的文件名列表. 其中有些文件名的左边会显示一个标识. !mtime, !empty 和 cfgpro 这些标识是用来说明为什么某些文件没有被删除的原因的. 所有没被标上任意一个这些标识的文件都已从系统中成功删除. 这三个标识说明如下原因:

  • !mtime: 目标文件在安装后被您或被一些工具修改过
  • !empty: 目标目录不为空
  • cftpro: 目标文件在受保护的目录内, 不去碰它以策安全

2.d. 处理 (Working with) 掩藏 (Masked) 的软件包

ARCH 或非 ARCH?

当 Gentoo 的开发人员把一个 ebuild 放到网上时, 该 ebuild 会告诉 Portage 如何根据体系以及软件的稳定性情况来处理该软件. 开发人员通过在 ebuild 里定义 KEYWORDS (关键字) 来做到这点. 这个变量包含了一个或多个体系且给它们标以特殊的标识. 下表将给出所有标识的说明.

标识描述
ARCH在该体系上运作良好
~ARCH在该体系上应该都能运作正常, 不过需要更多的测试工作
-ARCH在该体系上不能运作
-*在任何体系上都不能运作或非常危险

我们来看个例子:

代码清单 34: KEYWORDS 设置例
KEYWORDS="x86 -sparc ~alpha ~ppc"

该例子可以这么理解:

  • 该 ebuild 在 x86 机器上运作良好
  • 在 sparc 机器上不能运作
  • 在 alpha 机器上应该运作正常, 不过需要更多的测试
  • 在 ppc 机器上应该运作正常, 不过需要更多的测试
  • 在其他体系的机器上或许能够运作, 不过暂时没试过

您的系统默认会使用 ARCH. 如果您有兴趣活在边缘地带 (live on the edge), 不在意时不时有一些软件出点毛病, 系统出问题了自己也能够处理并且想给 bugs.gentoo.org 提交臭虫报告, 那您不妨选择 ~ARCH 软件包. 要让您的系统 "转型 (move)" 为使用 ~ARCH 的系统 (a ~ARCH-using system). 那就把 /etc/make.conf 中的 ACCEPT_KEYWORDS 变量的值改成 ~ARCH. (x86 系统就是: ~x86, 依此类推)

不过请留意, 要从 ~ARCH 回到 ARCH 可就没这么容易了 (甚至不可能).

此时如果您想更新系统, 您很可能发现有一大堆的软件要更新!

掩藏的 (Masked) 软件包

在您安装软件包的时候, 有时会遇到这样的信息:

代码清单 35: 被掩藏的软件包的信息
Calculating dependencies   
!!! all ebuilds that could satisfy <your package> have been masked.

一个软件包会因为如下几个原因而被掩藏:

  1. 软件包在 ~ARCH 中而您用的是 ARCH
  2. 软件包被严厉掩藏 (hard-masked) 了
  3. 软件包在您的 ARCH 上不可用
  4. 软件包被您的 profile 掩藏了

Portage 会告诉您为什么一个软件安装不了:

  • ~arch 关键字: 该软件包在给定的体系上可以运作, 不过需要更多的测试, 而您的系统要的是可以运作得很好的 (work well)
  • -arch 关键字: 该软件包在给定的体系上不能运作
  • -* 关键字: 该软件包在任何体系上都不能运作
  • package.mask: 该软件包列在 package.mask 文件中, 这意味着它会破坏一些东西 (break something), 让您的系统崩溃, 有安全性问题或一些更坏的情况
  • profile: 该软件对您的 profile 而言不可用 (the package is not available for your profile)

如果某软件包因 ~arch 关键字 而被掩藏, 而您又真的很想安装它 (您也清除知道它确实因为一些原因而在 ARCH 上不可用), 您可以通过把 ~ARCH 关键字添加到 /etc/portage/package.keywords 中来接受 ~ARCH 版本的所有软件包:

代码清单 36: 接受 ~ARCH 版本的软件
(如果 /etc/portage 目录不存在则创建它)
# mkdir /etc/portage
# echo "app-office/gnumeric ~x86" >> /etc/portage/package.keywords
# emerge gnumeric

类似的, 如果您不顾我们给您的警告而执意要安装某个被标记为 -arch 关键字-* 关键字的软件包, 则可以编辑 /etc/portage/package.keywords 并为该软件包加上所需的关键字:

代码清单 37: 接受 -arch 或 -* 版本的软件
(如果 /etc/portage 目录不存在则创建它)
# mkdir /etc/portage
# echo "app-office/gnumeric -x86" >> /etc/portage/package.keywords
(或)
# echo "app-office/gnumeric -*" >> /etc/portage/package.keywords
# emerge gnumeric

如果您只想允许某个特定版本或某个版本范围内的软件被安装, 您可以使用 "<, <=, =, >= 或 >" 运算符:

代码清单 38: 接受指定版本的 ~arch-掩藏的软件
# echo "=app-office/gnumeric-2.0 ~x86" >> /etc/portage/package.keywords

一个软件如果被列在 /usr/portage/profiles/package.mask 里, 就会因为 package.mask 而被掩藏. 如果您查看这个文件, 就会知道某个软件包为何被严厉掩藏 (hardmasked) 了的原因 (以注释的形式). 如果您无论如何还是要安装这个软件 (不管我们给过什么 "破坏系统", "破坏其他软件包", 或 "亟需测试" 诸如此类的警告), 请创建 /etc/portage/package.unmask, 并把该软件列进去 (以 /usr/portage/profiles/package.mask 中相同的格式).

代码清单 39: 让一个应用程序不再被严厉掩藏 (Unmasking a hard-masked application)
(如果 /etc/portage 目录不存在则创建它)
# mkdir /etc/portage
# echo "=app-office/gnumeric-1.2.12" >> /etc/portage/package.unmask

不要修改 /usr/portage/profiles/package.mask 文件, 因为一旦您更新 Portage, 所有的修改都将付诸东流 (undone).

有时您需要严厉掩藏 (hardmask) 一个 (些) 软件包. 这种情况通常是, 某个软件的新版本不支持您需要的一些功能了, 或者这些版本的软件将破坏您系统环境中的另些东西 (break something else in your environment).

要严厉地掩藏一个软件, 请创建 /etc/portage/package.mask, 并将该软件列于其中 (使用与上面提到的一样的格式):

代码清单 40: 严厉掩藏一个软件包 (Hard-masking a package)
(如果 /etc/portage 目录不存在则创建它)
# mkdir /etc/portage
# echo ">app-office/gnumeric-1.2.10" >> /etc/portage/package.mask

当 Portage 告诉您某个软件因为 profile 的缘故而不能安装, 这说明您当前使用的 profile 不允许安装该软件. 那么, profile 到底是什么?

一个 profile 包含了一份软件包名的列表以及 Portage 所使用的一些默认配置选项 (options). 这些文件告诉 Portage 允许, 不允许, 或按要求的方式处理 (treat as required) 某些软件或某些软件的特定版本. 用户可以通过修改一个符号链接 (/etc/make.profile) 来切换不同的 profile.

您无法让 profile 对某个软件包的阻挡失效 (You cannot override a package that is blocked due to profile); 如果您非要用这个软件, 那就切换到另一个 profile 吧.

您可以在我们的级联式 (Cascading) Profiles 文档.

受阻挡的 (Blocked) 软件包

您有时可能会遇到这样的出错信息:

代码清单 41: 受阻挡的软件
[blocks B     ] gnome-base/bonobo-activation (from pkg gnome-base/libbonobo-2.4.0) 

上例中, 软件包 bonobo-activation 与 libbonobo 冲突, 将无法 emerge libbonobo. 要解决这一问题, 只需删除 bonobo-activation 然后继续:

代码清单 42: 解决冲突问题
# emerge unmerge bonobo-activation