Handbook:Parts/Working/Portage/zh-cn

欢迎使用 Portage
Portage 系统是 Gentoo 在软件管理方面最显著的创新之一. 由于 Portage 的高度灵活性和数量庞大的功能，它时常被誉为 Linux 下最好的软件管理工具.

Portage 是用 Python 和 Bash 两种语言编写的. 因为它们都是脚本语言所以用户可以直接阅读它的代码.

大多数用户通过 来调用 Portage. 本章的内容不是复述 emerge 的 man page. 要了解 emerge 的所有可用选项，请查阅 emerge 的 man page：

Ebuilds
当 Gentoo 的文档介绍关于某个软件包的时候，这意味着 Gentoo 的用户们可以在 Gentoo 的软件仓库里找到它. ebuild 是一种包含了所有 Portage 维护软件（比如安装，搜索，查询等等）所需信息的文件，而 Gentoo 的软件仓库是它们的一个集合. 这些 ebuild 文件默认储存在.

Portage 的对于软件的行为都是基于本地的 ebuild. 为了能收到新的软件包，安全更新等等，时常更新本地 ebuild 是一件很重要的事情.

更新 Gentoo 软件仓库
Gentoo 的软件仓库通常使用 进行同步，rsync 是一个快速的文件增量传输工具. 要使用它很简单，Portage 的命令行前端 提供了一个调用  的方法：

有时一些防火墙会干扰 与镜像们的连接. 在这时，我们可以使用 来自动下载和安装 Portage 树的快照版本：

使用 的另一个好处是可以只安装由 Gentoo release engineering 团队的 GPG 密钥签名过的快照. 与此有关的详细信息可以在 fetching validated Gentoo repository snapshots 找到

搜索软件
有很多方法可以在 Gentoo 的软件仓库寻找软件. 其中之一是使用 本身. 在默认情况下 会返回所有符合搜索条件的包名.

举个例子，找出所有名字里含有 “pdf” 的包：

如果要根据描述进行搜索，可以使用  （或  ）选项:

需要注意的是它会输出很多信息. 不过由于都有很清楚的标识，我们就不再赘述它们的意思了：

安装软件
当你找到了软件包的名字，安装它只需要简单得使用. 举个例子，如果要安装 gnumeric：

由于很多软件依赖其它的软件，在安装该软件的同时很可能还会安装它的一些以来. 不要担心，Portage 可以很好得处理依赖关系. 如果要知道 Portage 会安装什么软件，可以在命令中加入  选项. 举个例子：

在安装软件期间，Portage将从Internet下载必要的源代码（如果需要），并将其默认存储在 中. 之后，它将解压缩，编译和安装包. 要让Portage仅下载源代码而不安装软件，请添加 选项到emerge命令：

查找已安装软件的文档
许多软件包中包含有自己的文档，有些时候， 的USE标记决定了软件包中的自带文档是否会被安装. 您可以通过 命令来检查是否存在 USE 标志：

最好的启用  USE 的方式是在 里对想要启用的包单独启用，这样你就能只获得你想要的软件文档. 了解更多信息请阅读 USE flags chapter.

当一个软件包安装结束后，它的文档通常会存放在目录下的，以软件包名命名的子目录中：

列出已安装文档文件的更可靠方法是使用 的   选项. 用于查询Portage的数据库，并作为 包的一部分：

The  option can be used with other rules to view the install locations for many other types of files. Additional functionality can be reviewed in 's man page:.

卸载软件
当您想把一个软件包从系统中移除的时候，使用 命令. 命令执行完成后，Portage将会移除此软件包安装到您系统中的所有文件，除了那些在安装软件后您修改过的配置文件. 保留这些修改过的配置文件是为了便于您今后再次使用它.

当您从系统中移除一个软件包时，之前那些为了满足其依赖关系而被自动安装的软件包将会被保留在系统中. 要使Portage找到现在可以删除的所有依赖项，可以使用  功能. 稍后我们将介绍这一点.

更新系统
要保持您的系统在最佳状态（更不用说安装那些最新的安全更新），您需要定期的更新您的系统. 由于Portage只能检查本地已有文件，因此您首先应该更新您的Portage树. 当您的Portage树更新后，您可以用 命令来更新系统. 在下一个例子里，我们还会使用  选项来控制Portage显示它要更新的软件包列表， 并让您决定是否继续更新.

Portage将搜索已安装的程序的新版本. 但是，它只会验证安装的应用程序在- 中列出的应用程序的版本 - 它不会检查它们的依赖关系. 要更新这些包的依赖关系，请添加 选项：

但是，这并不意味着更新所有的包：在编译和构建程序的过程中需要系统上的一些依赖程序，但是一旦安装了这些软件，就不再需要这些依赖. Portage调用那些“构建依赖”. 要在更新这些内容，请添加 ：

因为有时开发者会为那些您没有明确要求安装（但被其他软件包依赖而装入系统中）的包推出安全更新，我们也推荐偶尔运行一下这个命令.

每当您改变了系统中任何的USE标记后，最好加入 选项. 这样Portage将会验证这个USE标记的变动是否导致需要安装新的软件包或者将现有的包重新编译.

Meta软件包
Gentoo中的一些软件包并没有包含任何实际的内容，而只是用来安装一系列软件包的集合. 例如， 包就是一个包含了一系列与Plasma相关的互相依赖的软件包的集合，您可以通过安装它来在系统中搭建起一个完整的KDE Plasma 桌面环境.

如果您试图从系统中移除一个这样的软件包的集合体，只是单纯地使用 命令并不能完成您的要求，原因在于这些包的依赖关系仍然保留在系统中.

不用担心，Portage也提供了移除孤立依赖的软件包的功能，但由于软件包间的依赖关系是动态的，您首先需要充分地更新您的整个系统，包括更改USE标记设定而导致的变化. 在这之后您可以运行来移除那些完全没有被其他包依赖的软件包. 移除之后你需要重新编译那些曾经与刚刚移除的这些包动态连接过的应用程序，因为实际上这些程序不需要那些包.

所有这些可以用以下三个命令来实现：

工具由 包提供；使用前别忘了首先安装它：

授权协议
从Portage版本2.1.7开始，可以根据其授权协议接受或拒绝安装软件. portage 树中的所有包在其ebuild中包含一个 LICENSE 选项. 运行 将显示软件包的许可证.

默认情况下，Portage允许所有授权协议，除了需要阅读和签署接受协议的“最终用户许可协议（EULA）”.

控制允许的许可证的变量称为 ACCEPT_LICENSE ，可以在文件中设置. 在下一个示例中，将显示他的默认值：

使用此配置，在安装期间需要进行人机交互以接受其EULA的软件包将无法安装. 不带EULA的软件包将可安装.

可以在 ACCEPT_LICENSE 中全局设置t ACCEPT_LICENSE ，或者在 文进行配置.

举个例子，要允许 包的的授权协议， 把下面的内容添加到 :

这允许安装 程序包，但禁止安装 程序包，即使它具有相同的 授权协议.

在 ACCEPT_LICENSE 变量中定义的许可证组前缀为 符号. 如果要设置成只允许安装自由软件和文档，要完成此操作：删除所有当前接受的许可证（使用(using )），然后只允许FREE组中的许可证如下：

在这种情况下，“free”主要由 FSF 和 OSI 定义. 任何其许可证不符合这些要求的软件包将无法在系统上安装.

简介
正如我们之前指出的那样，Portage是一个非常强大并支持许多特性的软件包管理工具，而这是其他类似工具所欠缺的. 为了理解这一点，我们为您粗略地解释一些Portage的面貌.

通过使用Portage，一个软件的不同版本可以共存于一个系统中. 其他发行版倾向于直接在软件包名字中包含版本号（例如freetype 和 freetype2），Gentoo的Portage使用一种我们称之为''SLOT'的技术来实现这种并存. 一个ebuild为它自身的版本声明了一个确切的SLOT. 具有不同SLOT的同一软件的Ebuild可以共存于同一个系统中. 例如，上例中那个freetype包就拥有不同的ebuilds，里面分别有 SLOT="1" 和SLOT="2"的标志

有一些不同的软件包提供了类似的功能. 比如metalogd，sysklogd和syslog-ng都是系统日志记录工具. 那些依赖于“系统日志记录工具”的程序并不能随便的依赖于其中之一，比如metalogd. 因为其他的系统日志工具可能也是很好的选择. 好在Portage允许使用虚拟包：每一个系统日志记录工具都可以提供包，因此应用程序们可以设定成仅仅依赖于virtual/syslog即可.

Portage树中的软件可以存在于不同的分支中. 您的系统默认只会接受那些Gentoo认为稳定的软件包. 绝大多数新提交的软件会被添加到测试分支里. 这意味着在此软件被标示为稳定版前需要进行更多的测试. 尽管您可以看到那些软件的ebuilds已经加入Portage数据库，在它们未被加入稳定分支前Portage将不会安装它们.

有些软件只能在某几个体系结构上使用. 或者在其他体系结构中还不能运行，或者仍需要对其进行更多的测试，或者将软件提交到Portage树中的开发者还不能确定这个软件能否运行于其他体系结构.

每一个Gentoo安装都依附于一个确定的profile，此文件里除了其他信息外还包含了一个正常工作的系统需要的软件包的列表.

被阻挡的包
Ebuilds文件中包含了特定的字段，里面为Portage提供了此软件的各种依赖关系的信息. 总计有两种可能的依赖关系：一种是编译依赖，在 DEPEND 区域进行声明;另一种是“运行时”依赖，在 DEPEND 区域中进行声明. 如果上述两种依赖关系中任何一个明确指明某个实体或者虚拟包（译注：可能已安装和正要安装）与要安装的包不相容的时候，就会阻挡软件的安装.

虽然Portage的最新版本足够聪明，可以在没有用户干预的情况下解决轻微的问题，但偶尔也需要手动解决此类问题.

为了使安装得以继续进行，您可以选择不安装这个软件包，或者先将发生冲突的包卸载. 例如，在我们给出的这个例子中，您可以选择不安装postfix，或者先卸载ssmtp.

你也可能会遇到某些特定版本的包被屏蔽的情况，比如. 在这种情况下，升级到一个更新的版本就能解决问题.

也有可能两个需要安装的包互相阻挡. 这种少见的情况下，您应该明确自己为什么需要同时安装它们. 绝大多数时候您只需要安装它们之中的一个就可以了. 如果不是这样，请您到 Gentoo's bugtracking system 中提交一个bug.

被屏蔽的包
当您想安装一个对于您系统不可用的软件包. 您会收到类似这样的屏蔽错误提示. 您应该试着安装那些对于您系统可用的程序或者等待那些不可用的包被置为可用的. 通常一个软件包被屏蔽的原因在于：

USE必要的更改
如果未使用 参数，则错误消息也可能显示如下：

当请求安装包时，发生这种警告或错误，这不仅取决于另一个包，而且还要求该包使用特定的USE标志（或一组USE标志）构建. 在给定的示例中，包应用文本/感觉需要使用 USE="test"构建，但此系统上未设置此USE标志.

要解决这个问题， 到编辑里面的USE标志, 或者去.

缺失依赖
这表示您正尝试安装的应用程序依赖于您的系统不可用的另外一些软件包. 请到bugzilla查看是否有此问题的记录，如果没有查找到相关信息的话请提交一个报告. 除非您的系统混用了不同分支，否则这类问题不应该发生，若发生了那就是一个bug.

意指不明的软件包
您要安装的应用程序对应有多个同名的包. 您需要同时指定类别的名称. Portage会列出所有可供选择的名称匹配的包.

循环依赖
两个（或多个）您想安装的包由于循环依赖而不能安装. 这很可能源于Portage树中的bug. 请等一段时间后重新sync再尝试安装. 您也可以去 Bugzilla 看看是否已经有此问题的报告，或者提交一个关于它的报告.

下载失败
当Portage下载指定软件的源代码失败时，它会尝试继续安装其它（若适用）的应用程序. 源代码下载失败可能源于镜像服务器没有正确同步，也可能因为ebuild文件给出了错误的下载地址. 那些保存源代码的服务器也可能因为某些原因宕机.

一小时后重试一次，看看问题是否仍然存在.

系统Profile保护
您要求移除系统核心软件包中的一个. 它是您的profile中所列出的必需的软件，因此不能从系统中移除.

Digest验证失败
This is a sign that something is wrong with the Gentoo repository - often, caused by a mistake made when committing an ebuild to the Gentoo ebuild repository.

When the digest verification fails, do not try to re-digest the package personally. Running will not fix the problem; it quite possibly could make it worse.

Instead, wait an hour or two for the repository to settle down. It is likely that the error was noticed right away, but it can take a little time for the fix to trickle down the rsync mirrors. Check Bugzilla and see if anyone has reported the problem yet or ask around on (IRC). If not, go ahead and file a bug for the broken ebuild.

Once the bug has been fixed, re-sync the Gentoo ebuild repository to pick up the fixed digest.