Changchun Master Li

Linux Sea 中文翻译 第九章 Gentoo软件管理

2016-12-14

软件管理

Gentoo Portage

在这一节,我们会告诉大家怎样在Gentoo中安装软件、Gentoo的Portage系统是什么、Portage树是什么。这一节内容是Gentoo特有的,事实上,如果你不是一个Gentoo用户,你还是会感到愉悦,尽管不能使用。

简介

Gentoo主要是一个基于源代码的Linux发行版。这意味着不像其他操作系统,Gentoo不只是在你的文件系统里放置已经编译好的文件。而是从互联网拉取你需要的源代码、配置编译环境、生成软件。

当然,在两个层面上,Gentoo也支持二进制包的安装:

    1. 在系统中生成会耗费很长的时间的软件(比如流行的LibreOffice.org办公套件)可以获取它的二进制包。在这种情况下,Gentoo下载二进制文件并将其安装在文件系统上。
    1. 预编译好的包也同样被支持,基于不同gentoo系统生成的软件,作为二进制格式文件提供给其他使用相同设置的Gentoo系统(否则二进制包可能与系统不兼容)。

第二个层面是一种更加高级的方法,因为Gentoo不提供二进制包本身。您需要自己创建和维护生成环境或使用第三方repo。 这样,我将专注于源代码安装和第一个二进制包层面(即自动支持)。

包管理器:Portage

负责管理已安装软件的软件称为软件包管理器。 对于用户来说,它是安装和卸载软件,升级系统,搜索可用软件、配置软件的接口。

对于Gentoo,默认包管理器称为Portage。 我说“默认”,因为有其他包管理器也可用于Gentoo(如Paludis和pkgcore)。这些包管理者通常有相同的功能,但行为有点不同。尽管如此,由于Gentoo使用的包装结构的标准方法,它们都是兼容的。

包管理器管理一个称为Portage树的本地repo。这个repo是一组软件包元数据(所以没有源代码或二进制包),相关软件可以在Gentoo上安装。

你可以在/usr/portage找到Portage树。

包的构造: Ebuilds

软件包元数据文件称为ebuilds,ebuilds包含有关包的信息:

  • 包的名称,您可以在其中找到有关软件和软件包版本的信息的Internet站点
  • 软件包的依赖关系(为了成功生成或运行此软件,需要什么其他软件)
  • 下载软件源代码的位置(或二进制文件,如果是二进制包——第一个层面)
  • 软件的生成指令(记住,Gentoo主要是基于源代码的发行版)
  • 软件使用的许可证
  • 包支持的USE flags(USE flags将在后面描述)
  • 生成和安装后完成安装所需的配置说明

因为所有这些信息很简单,ebuild文件是一个文本文件。这允许用户容易地了解ebuild实际做什么(虽然这需要关于脚本和ebuild格式本身的知识,这不在本章的范围内)。

这些软件包是软件安装和管理的主要来源。为了跟踪新的软件版本发布,您需要更新ebuild的集合(Portage树)。

USE flags

USE flags是Gentoo的主要优势之一。USE flags是简单的术语(例如dvd、X、mysql…),并且使用ebuild来检测在生成软件时要启用(或禁用)的选项。

大多数应用程序都可选择支持一个或多个工具和库。 例如,在撰写本文时,Gentoo中的Firefox应用程序支持以下flags(我删除了语言相关的flags,这些flags启用/禁用在输出中对特定语言区域的支持,以使其更易于阅读):

1
$ equery uses firefox

其他发行版在生成软件时选择了他们想要启用或不启用的支持。因为Gentoo自己生成软件,所以您有机会设置USE flags启用或禁用这些功能。

您可以在/etc/portage/make.conf中设置全局USE flags。要禁用某一项USE flag,请在其前面加上’-‘。

1
2
3
# nano -w /etc/portage/make.conf
(...)
USE="acpi apm pmu sasl howl -cdr -dvdread ..."

由于Gentoo支持的大量USE标志,知道和理解他们中的每一个不是你的工作。 Gentoo为你设置了一个理想的USE变量默认值。显示你当前的USE flags(基于Gentoo的默认USE flags加上/etc/portage/make.conf中启用或禁用的USE flags),请使用emerge –info:

1
$ emerge --info | grep USE

要获取有关USE flags的一些信息,可以使用euse命令:

1
$ euse --info mp3

如果你想在每个包级别上管理USE标志(比如你想在mplayer中包括MP3支持,而不是在vlc中),可以在/etc/portage/package.use中设置per-package USE标志。

这个位置可以是一个简单的文本文件,但你如果想要更容易地管理USE定义,也可以使它成为一个包含许多文本文件的目录。 (例如通过聚合与媒体相关的USE标志设置)后一个功能非常有趣。 Gentoo的Portage将读取此目录中的所有文件。

1
2
3
# mkdir /etc/portage/package.use
# nano -w /etc/portage/package.use/media-flags
media-video/vlc mp3

维护你的软件栈

软件栈的维护,意思是安装和卸载软件,更新系统和跟踪系统的安全补丁。

获取最近的Portage树

如前所述,Portage树是ebuild的集合(从现在开始我们称为“packages”),您可以在系统上安装它。 无论您是要更新系统,安装新软件还是获取最新的安全修补程序,首先需要更新Portage树。

更新Portage树的命令是emerge –sync。sync告诉你emerge(Portage的主要软件管理工具)将做什么:它将利用Gentoo镜像站同步您的本地Portage树。

1
# emerge --sync

你可以很容易配置emerge使用的镜像。 打开/etc/portage/repos.conf或/etc/portage/repos.conf/gentoo.org并找到sync-type和sync-uri设置:

1
2
3
4
# nano -w /etc/portage/repos.conf/gentoo.conf
(...)
sync-type = uri
sync-uri = rsync://rsync.us.gentoo.org/gentoo-portage

sync-uri为公共Portage镜像设置。

您注意到该设置引用rsync协议。 事实上,rsync用于同步您的本地Portage树。选择这个工具(或协议),是因为它仅传输两个文件之间的差异,而不是下载整个新树。

如果你不能使用rsync(例如因为防火墙设置),你可以使用emerge-webrsync(没有任何参数)。此工具将使用HTTP或FTP协议获取包含整个Portage树的归档,并在本地同步此归档。 当然,当下载整个树时,需要更多的网络流量。

此外,rsync镜像每小时更新其Portage树。webrsync取回的快照每天更新。

获取Gentoo的公告

使用最新的Portage树,您还将收到Gentoo给其用户的最新公告。Gentoo的新闻系统允许Gentoo通知其用户最终用户在盲目开始升级之前应该阅读的更改。这也是为什么我在开始使用软件做任何事情之前提到它的原因。

当添加新闻项目时,您将在Portage更新会话结束时收到通知:

  • IMPORTANT: 21news items need reading for repository ‘gentoo’.
  • Use eselect news to read news items.

当您在更新结束时发现此类通知时,可以使用eselect了解更多信息:

1
# eselect news list

然后你可以一个一个阅读新闻项目(eselect news read <数字>),但我更喜欢只是告诉eselect显示未读新闻项目的内容:

1
# eselect news read new

查询软件

在你的指尖有数以万计的软件,你怎么知道什么软件可用(或什么软件,你目前已经安装)? 或者查询有关软件本身的信息(如已安装或可安装的文件,依赖等等),不管该软件是否已安装在您的系统上? 有很多工具可以帮助你…

  • 用emerge搜索软件

你可以使用 –search 或 –searchdesc 搜索

使用emerge –search,您可以查找其标题(或部分)与您的选择相匹配的软件:

1
$ emerge --search acroread

如果使用–searchdesc,搜索也会尝试匹配描述字段:
运行–searchdesc需要相当长的时间。 我建议您使用索引工具加快搜索速度…

  • 用eix搜索软件

eix工具(默认情况下不可用,您需要安装它:emerge –ask eix)索引可搜索的应用程序信息,以允许您快速搜索portage树。

一旦安装,你将需要运行update-eix(将索引所有的信息)之后每个emerge –sync(因为这拉入你想要索引的新包)。 您还可以使用eix-sync,它将首先同步portage,然后立即更新其索引表。

生成索引后,您可以使用eix快速搜索Portage树。我经常使用-HAS(–homepage –category-name –description),因为这也与应用程序名称和说明旁边的首页URI相匹配:

1
$ eix -HAS acrobat
  • 基于文件搜索已安装软件

qfile工具(app-portage/portage-utils的一部分)允许您找出特定文件是哪个包产生的。如果有人问了你哪个包提供了哪些特定的文件在您的系统,这很有趣。

1
$ qfile /usr/bin/qfile
  • 基于文件搜索软件(已安装或未安装)

Gentoo社区项目,PortageFileList,正在尝试存储有关所有包提供的文件的信息。 这不像听起来那么简单,因为包中的文件很大程度上取决于用户他的系统:USE标志,其他已安装的包等。项目要求用户运行其中一个工具来上传本地文件信息(文件 + package + USE flags)。其他用户可以使用e-file(app-portage/pfl的一部分)来查询包。

该命令支持类似SQL的通配符。例如,%bin/xdm匹配/usr/sbin/xdm和/bin/xdm

1
$ e-file '%bin/xdm'
  • 列出已经安装的文件

要列出包所提供的文件,您可以使用qlist(也是app-portage/portage-utils的一部分):

1
$ qlist portage-utils

启用安装日志

当Gentoo开发者想要通知包用户某些改变或需要注意的事情时,他经常在包装本身中写一些消息,这些消息在您完成包装安装后显示。 但是,在冗长的更新或安装过程中,您经常会忽略这些消息。为此,Gentoo Portage允许您将这些消息存储在单独的日志文件中。 默认情况下,Portage仅设置安装的摘要日志。您可以坚持使用这些默认值,或设置更详细的日志记录:

1
2
3
4
5
# nano /etc/portage/make.conf

PORT_LOGDIR="/var/log/portage"
PORTAGE_ELOG_SYSTEM="save"
PORTAGE_ELOG_CLASSES="info warn error log"

通过这个定义,你可以在/var/log/portage/elog中找到per-package日志。 然后,您可以使用您喜欢的文本阅读器(如less或view)或使用elog专用工具(如elogv(控制台)或elogviewer(图形))阅读这些日志文件。

安装新软件

你已经看到,emerge是Gentoo的主要与Portage一起工作的工具,它可以用于搜索软件。同样也可以安装或删除软件。 为了帮助用户安装软件,它有几个选项,使您能够对哪些软件安装做出更明智的决定(以及影响将是什么)。 例如,–pretend选项让emerge在不实际修改任何内容的情况下显示它会做什么。 你甚至可以添加–verbose标志,以便emerge告诉你包支持什么附加设置。它还支持–ask选项
,首先像–pretend一样,然后由用户确认继续。

例如,要在系统上安装Adobe Acrobat Reader:

1
2
3
4
5
6
7
8
9
10
11
12
# emerge --ask --verbose acroread
These are the packages that would be merged, in order:

Calculating dependencies ... done!
[ebuild N ] app-text/acroread-8.1.2 USE="cups ldap nsplugin"
LINGUAS="de en fr nl -da -es -fi -it -ja -ko -nb -pt -sv -zh_CN -zh_TW"
Would you like to merge these packages? [Yes/No]

Note
Sometimes it might be necessary to use the category/package-name syntax (in this case,
emerge --ask --verbose app-text/acroread). This could happen when two packages share
the same name but are part of different categories.

在这个例子中,emerge告诉你它将安装Adobe Acrobat Reader版本8.1.2,并且它不需要任何其他依赖(否则你会看到更多的行)。 Emerge还告诉你,acroread包支持三个USE标志:

  • cups (support for the Common Unix Printing System)

  • ldap (support for the Lightweight Directory Access Protocol)

  • nsplugin (creating Acrobat Reader plugins for the Mozilla-based browsers)

在这种情况下,在此系统上启用所有三个标志。

此外,acroread包支持各种语言。在所有这些语言中,Portage只支持德语,英语,法语和荷兰语(我想在我的系统上支持的语言)。

要安装软件请接受合并。对于每个包这会:

  1. 从互联网上下载源代码,
  2. 验证源代码与存储在Portage树中的校验和(确保下载的
    文件没有损坏),
  3. 将源代码提取到系统上的临时位置(/var/tmp/portage),
  4. 用Gentoo特定的补丁修补源代码,
  5. 根据您使用的USE标志配置源代码,
  6. 在临时位置生成软件,
  7. 注册它在此位置创建的文件,
  8. 将文件移动到系统(使应用程序可供最终用户使用)

主要是因为生成步骤繁琐,此安装过程将需要一些时间(与使用预生成包的发行版相比)。 有一些工具显示用户平均出现一个包的阶段花费了多长时间,但这些仅仅是为了信息目的,并且不能保证未来emerge的运行时间(因为这取决于USE标志,源代码大小,CPU速度 ,系统资源可用性…)

qlop(portage-utils包的一部分)是这样一个工具。

1
2
$ qlop --time --human mozilla-firefox
mozilla-firefox: 1 hour, 15 minutes, 22 seconds for 27 merges

更新系统

当您启动Gentoo Linux,许多软件包已经安装。定期更新系统是明智的,可以拉入最新更新、bug修复和安全修复。

  • 更新全部的包

如果要将所有已安装的软件包更新为最新的稳定版本,请先按照上述方法更新Portage树。 然后,运行以下命令查看将要更新,安装或删除的软件包:

1
# emerge --update --deep --newuse @world --pretend

传入emerge的参数有:
• –update (or -u), asking emerge to update software,
• –deep (or -D), asking emerge to select not only the software selected, but also all of its
dependencies,
• –newuse (or -N), asking emerge to update software when new dynamic switches are used (USE
flags),
• @world, asking emerge to select all software that the user has installed, and
• –pretend (or -p), asking emerge to display what it would install, update or remove
To really perform the update, use the same command without –pretend. The next example does this
using the single letter arguments:

要真正执行更新,请使用不带–pretend的相同命令。

1
# emerge -uDN @world

您可能已经注意到,world参数以at符号(@)作为前缀。 这不是强制性的(过去它是没有的)但前一段时间,Portage开始支持我们称为sets of package。world是这样的集合之一,集合前面带有一个at符号,以区别于常规包。

  • 更新全部用户安装的包

如果您不想升级系统上的每个软件包,而只想升级您之前选择安装的软件包,请不要使用–deep参数。 用户安装的包是您要求安装的包,但不包括用于满足应用程序需求的依赖关系。 最终结果是只安装了少量更新。 然而,这并不意味着你依赖会很快地过时。每次更新被引入,这个更新可能指示Portage它只能使用一个更高版本的特定依赖关系,导致Portage更新该依赖关系 。

1
# emerge --update --newuse --ask @world
  • 生成错误时不要停止安装

默认情况下,当一个软件包无法正确生成时,Gentoo Portage会停止安装/升级。 这的确需要你注意,但是你也可以要求Gentoo Portage继续生成其他软件包。 在最终生成过程结束时,您将收到一个小报告,通知您哪些包已失败,以及为什么。

1
# emerge -uDN --keep-going @world
  • 拉取安全修复

Gentoo还支持仅生成受安全问题影响的软件。 在这种情况下,不会升级任何未受影响的软件(除非需要作为安全升级的依赖项)。 Gentoo提供GLSA文档(Gentoo Linux安全通报),以通知其用户可能的安全问题(内核问题除外)。 这些GLSA文档由glsa-check命令解析,可以应用必要的修复。

要验证您的系统是否受到一个或多个安全公告的影响,请首先更新Portage树,然后运行:

1
2
3
# glsa-check --test all
This system is affected by the following GLSAs:
200711-10

在示例中,一个安全通报与我的系统匹配。 使用glsa-check –dump 200711-10我可以获得更多的相关信息。要修复系统,可以运行glsa-check的–fix:

1
2
# glsa-check --fix all
(This will iterate over all GLSAs, including the matching one(s))
  • 切换软件版本

Gentoo支持在系统上具有相同软件的多个版本。 值得注意的例子是gcc,python和java。管理员可以使用eselect在这些已安装的版本之间切换。 以前我们已经看到,这个工具用于在配置文件之间切换。

例如,显示已安装的Python版本:

1
2
3
4
# eselect python list
Available Python interpreters:
[1] python2.7
[2] python3.1 *

在上面的例子中,Python 3.1是系统默认的。你可以使用eselect python set 1将系统切换到2.7。

要获取eselect支持的模块,请运行eselect help。

卸载软件

现在假设您发现您要删除的系统上一些已安装的软件。 使用emerge –unmerge(或-C)可以从系统中删除已安装的软件。

1
# emerge --unmerge acroread --ask

但是,如果此软件是已安装软件标题的依赖项,则下一次系统更新将拉回软件。更糟糕的是,依赖于它的仍在使用/运行的软件甚至可能停止正常运行或崩溃。 卸载软件包的更安全的方法是要求Portage删除软件包,但没有其他依赖关系指向它。 要这样做,使用emerge –depclean(或简而言之,emerge -c):

1
# emerge --depclean acroread --ask 

使用此命令,Portage将删除包。如果没有其他包依赖acroread,它会删除acroread。 但是,如果一些包仍然依赖于acroread,Portage会让acroread保留在您的系统上,并通知您。

高级软件管理

当然,Gentoo允许更高级的软件管理。如果您搜索文档,您会很快注意到Gentoo Portage支持稳定和“unstable”包的概念(所谓的〜arch状态),支持第三方repo等。

包状态

Gentoo包(即ebuild)总是处于某种状态。虽然这个状态从未在包中明确定义,但是它是开发者提出的一组规则的结果,用来跟踪包的稳定性,安全性和许可证规则等。

在安装软件包时,将检查这些规则,以确保您不安装不应在系统上安装的软件包。 这些各种规则可以触发安装错误,大多数时候被描述为package mask。

每当安装被触发时,Gentoo Portage尝试安装与所有可能规则匹配的最高版本的软件包。只有当没有这样的版本存在,或者当你明确要求安装特定版本,Gentoo中止安装,产生失败消息。

以下各节介绍在安装被触发时检查的各种状态/规则。要解决此类规则,请参阅Unmasking Packages。

架构可用性

Gentoo是一个多体系结构的操作系统。 Gentoo中可用的软件包可以安装在几个架构上,从流行的x86/amd64到sparc,mips,powerpc,…但是当然,大多数软件包不能安装在任意平台上。某些工具仅支持Intel-like平台(x86,amd64)或特定平台(如silo引导加载程序,专属sparc平台)。

使用其KEYWORDS变量将软件包标记为可用于特定平台。一个例子,取自sys-apps/iproute2版本2.6.29-r1:

1
KEYWORDS="alpha amd64 arm hppa ia64 m68k ~mips ppc ppc64 s390 sh sparc x86"

当您安装软件包时,系统会根据系统接受的关键字检查其平台关键字。 这些关键字在ACCEPT_KEYWORDS变量中定义,您可以使用emerge -info查询这些变量:

1
2
$ emerge --info | grep ACCEPT_KEYWORDS
ACCEPT_KEYWORDS="amd64"

每当发生不匹配(程序包没有您在ACCEPT_KEYWORDS中定义的关键字),您会收到一条错误消息:

1
2
3
!!! All ebuilds that could satisfy "sys-boot/silo" have been masked.
!!! One of the following masked packages is required to complete your request:
- sys-boot/silo-1.4.14 (masked by: missing keyword)

由于不支持的体系结构而出现错误,建议不要尝试解决此问题(强制程序包可安装)。 它很可能不工作。

您可能会收到的其他相关错误消息是:

1
2
- lm-sensors/lm-sensors-2.8.7 (masked by: -sparc keyword)
- sys-libs/glibc-2.3.4.20040808 (masked by: -* keyword)

这些错误消息类似于上面(missing keyword)。 差异是:

• “missing keyword” means that the architecture isn’t set in the KEYWORDS variable.
该架构可能由软件包支持,但没有开发人员尝试在此平台上安装它。

• “-sparc keyword” (or other architecture) means that that particular architecture is explicitly denied in the KEYWORDS variable.
在这种情况下,开发人员试图安装它但它破坏了其系统,或是包本身已知不在上述平台上工作。

• “-* keyword” means that all architectures are explicitly denied in the KEYWORDS variable except
a few.
这种情况主要用于仅在单个平台上可用的包。开发人员将程序包标记为不可用于任何其他体系结构,因此出现“-*”。

Gentoo Package 稳定化

当开发人员创建或编辑Gentoo软件包时,该软件不能立即供公众使用。首先,它是通过staging period。在这段时间内,测试人员尝试这个软件包,发现可能的软件包定义错误(例如错误的依赖),并帮助进一步的开发直到包装被认为稳定。

有一个不成文的规则表明,在发布给公众之前,程序包应该在staging period内“停留”30天(架构测试人员没有发现其他错误)。

在Gentoo中,staging period通过在KEYWORDS变量前面的结构前面添加波浪号(~)来标识。在上面的关键字示例(iproute2包)中,注意mips架构。这个包很可能是在MIPS架构上支持的,但目前正在审查(staging period)。很有可能在一个月内,该包可由MIPS用户获取。

每当您尝试安装处于staging period的软件包时,您会收到以下错误消息:

1
2
3
!!! All ebuilds that could satisfy ">=sys-apps/portage-2.1.8" have been masked.
!!! One of the following masked packages is required to complete your request:
- sys-apps/portage-2.2_rc62 (masked by: ~amd64 keyword)

如果你得到这样的错误消息,我建议等两天再安装(让架构测试为你找出大部分的bug)。

(注:equery meta xxx 查看包的keywords)

严重的bug或者安全问题

每当一个包有一个关键的bug(严重损坏系统),一个安全问题(如一个可利用的漏洞,可能授予恶意用户访问您的系统)或只是不再维护,Gentoo开发者可能mask包。

显式mask不仅禁止安装软件,通常它们还包含有关为什么禁止安装的注释。这些显式mask(及其注释)存储在名为package.mask的文件中。默认情况下,此文件在/usr/portage/profiles中。

1
2
3
4
5
6
!!! All ebuilds that could satisfy "games-roguelike/slashem" have been masked.
!!! One of the following masked packages is required to complete your request:
- games-roguelike/slashem-0.0.772 (masked by: package.mask)
/usr/portage/profiles/package.mask:
# Tavis Ormandy <taviso@gentoo.org> (21 Mar 2006)
# masked pending unresolved security issues #127167

在这个例子中,你会发现谁mask了包,mask的时间以及为什么(包括可以在https://bugs.gentoo.org找到bug号)。

许可证

Gentoo软件包总是跟踪软件被分发/允许使用的许可证。像架构可用情况一样,这是通过一个名为LICENSE的变量完成的。例如,对于net-im/skype包:

1
LICENSE="skype-eula"

而且,就像KEYWORDS一样,您的系统有一个名为ACCEPT_LICENSE的变量,您可以在系统上设置需要的软件许可证。 Gentoo系统的默认设置是相当宽松的,你可以根据自己的喜好设置。 例如,您只能接受FSF许可证:

1
2
$ emerge --info | grep ACCEPT_LICENSE
ACCEPT_LICENSE="-* @FSF-APPROVED"

profile支持的软件

Gentoo支持多个profile文件。profile应被视为Gentoo Linux环境的预定义设置的集合。 这些设置包括默认USE标志,默认接受的许可证,默认选择的包等。这样的profile文件也可以具有针对某些包的mask。

一个例子是selinux/v2refpolicy/x86/hardened profile,它mask了glibc-2.4,因为它与配置文件要强制执行的安全措施不匹配。

每当您尝试安装profile不允许的包时,您会收到如下所示的消息:

1
2
3
!!! All ebuilds that could satisfy "=sys-libs/glibc-2.4*" have been masked.
!!! One of the following masked packages is required to complete your request:
- sys-libs/glibc-2.4-r2 (masked by: profile)

Unmasking Packages

当您由于要安装的软件包被mask安装失败,您可以选择无论如何一定安装它。我建议你仔细考虑这一步,mask是有原因的。

•如果是因为一个关键的错误或安全问题,我严肃建议您不要安装它(显而易见的原因)。

•如果包装由于稳定性追踪而被mask,我建议您再等两天,直到它可用。

•如果由于架构不可用而导致包被掩码,我建议您调查该包是否支持您的架构。如果没有,尝试安装它没有任何意义。

•如果包由于profile不匹配而被屏蔽,则您要么使用错误的profile,要么在尝试安装该包时出错,继续保持原样。

•如果包由于许可证不匹配而被掩盖,则您的许可证设置不正确。

系统全局范围还是针对特定的包

每当您想要解决mask问题时,您需要思考是否要针对此特定软件包(或一组软件包),还是要更改整个系统的设置。 在大多数情况下(许可证除外),它是针对特定包(或一组包)的。

Portage有一个特定的配置目录(/etc/portage),其中可以存储一些定制设置。每种类型定制都有自己的文件或目录:

• /etc/portage/package.license allows you to set license-deviations (approve or deny a license on a per-package basis)
• /etc/portage/package.mask allows you to mask packages (deny packages on a perpackage basis)
• /etc/portage/package.unmask allows you to unmask packages (allow packages that are disapproved due to critical bugs, security issues or profile mismatches, on a per-package basis)
• /etc/portage/package.accept_keywords allows you to set keyword deviations (inform Portage that for this package, other keywords are accepted as well)

注意

先前版本的Portage使用package.keywords而不是package.accept_keywords。 最近的Portage版本仍然支持这个旧位置,但建议将它们重命名为package.accept_keywords。

如果要创建系统全局范围的定制,则需要编辑/etc/portage/make.conf文件。

自动 unmasking packages

更普遍的是,被mask的包依赖于其他被mask的包。要在 /etc/portage/package.accept_keywords 中手动输入这些依赖项,您需要一遍又一遍重复安装,直到您遇到并解决所有错误。

一种更自动化的处理方式是使用autounmask。 autounmask允许你选择你想要的主包,它会在/etc/portage/package.accept_keywords自动创建一个文件,以取消mask依赖包。

切换系统profiles

Gentoo Linux使用profile来定义系统环境的默认值。你应该在安装Gentoo时了解过profile(如果你没有,没关系)。快速回顾:profiles是一组由Gentoo项目制定的预定义默认值,用于区分特定用途。而其他发行版要求您在初始安装的开始或初始安装期间选择特定类型的部署(桌面或服务器版本),Gentoo允许您随时切换配置文件。

系统使用的配置文件由/etc/make.profile符号链接定义:

1
2
3
ls -l /etc/make.profile
lrwxrwxrwx 1 root root 57 Dec 2007 make.profile - >
 /usr/portage/profiles/default-linux/x86/20O7.0/desktop、

Gentoo配置文件定义了以下内容:

  • 默认情况下激活什么USE标志
  • 当您选择virtual1时,默认情况下安装哪些应用程序(一个virtual就是一个占位符,举例来说,Gentoo提供了好几个Java runtime。它们由virtual/jre实施,Gentoo profile指定具体的包作为默认选择)
  • 配置文件不可用的软件包(例如,uclibc配置文件不支持glibc)或应该有一个特定的版本(例如,glibc高于或等于2.4)。

用户可以在配置文件之间轻松切换。 一个有用的工具是eselect。

1
2
# eselect profile list
# eselect profile set 10

使用第三方软件库

除了主要的Portage树,您还可以选择第三方软件存储库。 这些是由开发者,用户和组织提供的ebuilds,但在Gentoo的Portage树中尚不可用。

laymam管理第三方软件存储库的一个很好的工具。 安装layman,然后查看layman支持的存储库:

1
# layman -L

layman命令的输出显示了哪些第三方存储库被配置为被layman使用。 如果您想选择一个,请将其添加到您的系统:

1
# layman -a xen

同样,要停止使用存储库,请使用layman -d删除它。 如果您想查看您当前使用的存储库,请使用layman -l。

出错了怎么办

当然,不管是Gentoo还是Gentoo的上游项目都是由人类运营和维护的,而人类总是会偶然的犯错误。如果你已经遭遇过安装或者生成错误,下面几节可以帮助你排查故障。

Portage拒绝安装软件

在软件安装分析阶段,我们需要介入一些问题。这些问题是:

  • Blocked packages (a package that needs to be installed is blocked by an already installed package
    or another package on the installation list)
  • Masked packages (a package is not available for your profile or environment)
  • Download failures (one or more files needed to install the software aren’t available or might be
    corrupt)
  • Kernel configuration mismatch (the package requires particular kernel configuration directives to
    be set)
  • Other issues (catch-all)

Blocked Packages

有时,一个包提供了另一个包也提供的功能,当这两个包不能共存在一个系统,你会得到错误:

1
[blocks B ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.2-r1)

在这个例子中,postfix在安装列表里,但是它不能和已安装的ssmtp共存。所以,安装失败了。

解决这个问题,最简单的办法就是从系统unmerge(删除)ssmtp,然后重试安装。

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章