在 Oracle® Solaris 11.2 中添加和更新软件

退出打印视图

更新时间: 2014 年 7 月
 
 

软件包安装和更新故障排除

本附录说明了如何处理在安装或更新软件包时可能会遇到的一些错误。本附录还提供了有关提升性能和最大程度地减少所存储的元数据的提示。

初始故障排除步骤

检查要安装的软件包是否可从所配置的发布者获得并安装在此映像中。已安装的 pkg:/entire 版本和在该映像中配置的发布者源是必需的信息。您可能需要更新 pkg:/entire 软件包。您可能需要修改发布者的源。

对于几乎所有的软件包安装问题,都应该首先执行以下两项检查:

  • 检查已安装的 pkg:/entire incorporation 软件包的版本。

  • 检查软件包发布者的源。

当已确定能从所配置的发布者获得所需的软件包时,使用下列步骤继续安装:

  • 在安装或更新时,可以使用 -nv 选项来查看将进行的更改,例如将安装或更新哪些软件包的哪些版本以及是否将创建新的 BE。-v 选项还显示适用于此特定安装或更新操作的任何发行说明。

  • 要获得更详细的错误消息,请指定要安装的软件包的更多 FMRI(包括版本和发布者)。

检查已安装的 pkg:/entire 版本。

可使用 pkg list 命令检查当前安装的 pkg:/entire incorporation 软件包的版本。

$ pkg list entire
NAME (PUBLISHER)                                  VERSION                    IFO
entire                                            0.5.11-0.175.2.0.0.34.0    i--
$ pkg list -Hv entire
pkg://solaris/entire@0.5.11,5.11-0.175.2.0.0.34.0:20140303T182643Z           i--

pkg:/entire incorporation 软件包对许多其他软件包的版本进行约束,以帮助维持一个正常工作且可支持的映像。有关受 incorporation 软件包约束的软件包的更多信息,请参见incorporation 软件包

您无法直接安装或更新受 pkg:/entire incorporation 软件包约束的软件包。要安装或更新受 pkg:/entire 约束的软件包,您必须更新 pkg:/entire 软件包。有关更多信息,请参见无法满足约束。在某些情况下,您可以删除约束,如更新 Incorporation 约束的软件包中所示。

检查所配置的发布者源的内容

可使用 pkg publisher 命令检查软件包发布者的源。

$ pkg publisher
PUBLISHER  TYPE    STATUS P LOCATION
solaris    origin  online F http://pkg.oracle.com/solaris/release/

对于安全 URI,请确保您具有必需的已正确安装的密钥和证书,并且在配置发布者时使用 -k-c 选项。

如果站点需要代理来访问外部位置,请使用 pkg set-publisher 命令的 --proxy 选项设置该代理。有关说明,请参见指定代理

使用 pkg publisher publisher 命令可查看有关发布者的更多信息,如密钥、证书和代理。

如果任何已启用的发布者中的任意源 URI 不可访问,则即使所需的位置可以访问,安装或更新操作也会失败。如果无法修复导致位置无法访问的问题,可使用 pkg set-publisher -G 删除无法访问的源或使用 pkg set-publisher --disable 禁用该发布者。如果不再需要该发布者,可使用 pkg unset-publisher 删除发布者。

检查软件包发布者源是否包含您需要的软件包。例如,如果将 solaris 发布者源设置为公共发行版系统信息库,则无法将软件包更新为只能从支持系统信息库获得的版本。

检查必需的已安装软件包是否可用

要更新已安装的软件包,请安装依赖于已安装软件包的软件包,或者安装非全局区域,您设置为发布者源的系统信息库必须至少包含当前已在该映像中安装的相同软件。系统信息库还可以包含较旧或较新的软件,但必须包含映像中安装的相同软件。

在检查已安装的软件包时,应使用 pkgrepo list 命令,而不是使用 pkg list 命令。pkg list 命令总是显示已安装的软件包,甚至包含无法从任何已配置的发布者源获取的软件包。

下列命令显示指定的系统信息库不适合用作此映像的发布者源,因为无法从该源获得 pkg:/entire 的已安装的版本。

$ pkg list entire
NAME (PUBLISHER)                                  VERSION                    IFO
entire                                            0.5.11-0.175.2.0.0.34.0    i--
$ pkg publisher
PUBLISHER  TYPE    STATUS P LOCATION
solaris    origin  online F http://pkg.oracle.com/solaris/release/
$ pkgrepo list -Hs http://pkg.oracle.com/solaris/release entire@0.5.11-0.175.2.0.0.34.0
pkgrepo list: The following pattern(s) did not match any packages:
        entire@0.5.11-0.175.2.0.0.34.0

如果未列出您需要的软件包,可尝试运行 pkgrepo refresh 命令,然后再次尝试 pkgrepo list 命令。

下列命令显示了可从指定的系统信息库获得已安装的 pkg:/entire 版本:

$ pkgrepo list -Hs /export/IPSpkgrepos/Solaris entire@0.5.11-0.175.2.0.0.34.0
solaris   entire                   0.5.11,5.11-0.175.2.0.0.34.0:20140303T182643Z

如果无法从所配置的发布者获得某个需要的软件包,但可从其他系统信息库源获得该软件包,请执行下列操作之一:

  • 使用 pkg set-publisher 命令的 -g 选项来为 solaris 发布者添加该源。

  • 使用 pkg set-publisher 命令的 -g-G 选项更改 solaris 发布者的源。

  • 如果其他发布者提供了您所需的软件包,请使用 pkg set-publisher 命令添加该发布者。

  • 使用安装命令(installuninstallupdatechange-variantchange-facet)的 -g 选项将系统信息库临时添加到要搜索的系统信息库列表的末尾。

检查要安装的软件包是否可用

可使用下列命令检查是否能从所配置的发布者获取要安装的软件包。如果要更新软件包,该软件包当前安装的版本和要更新的版本都应该可用。

$ pkg list -af package

如果未列出您需要的软件包,可尝试运行 pkg refresh 命令,然后再次尝试 pkg list 命令。

如果仍未列出您需要的软件包,请添加新的发布者或新的发布者源。

检查要安装的软件包是否可安装在该映像中

如果使用 -af 选项时列出了您需要的软件包版本,请在不指定 -f 选项的情况下再次使用同一命令:

$ pkg list -a package

如果仍列出了您需要的版本,则该软件包是不受约束的,而且您应该能在不安装或更新任何其他软件包的情况下安装该软件包。

如果未列出您需要的版本,则可从所配置的发布者获取该版本,但无法在此映像中安装该版本。无法安装软件包的原因包括:

  • 软件包受变量或侧面设置约束。

  • 软件包的版本受 incorporation 软件包约束。您可以更新施加约束的软件包,或者可在某些情况下放宽约束。有关更多信息,请参见无法满足约束

  • 软件包的版本受冻结操作约束。运行 pkg freeze 命令。这能冻结某个对要安装的软件包的另一个版本具有 require 依赖关系的软件包,并且不能同时安装这两个版本。

重试安装

如果指定了要安装或更新的软件包却未指定发布者,则会使用发布者搜索顺序中第一个提供与该软件包 FMRI 或模式匹配的软件包的发布者作为安装源。如果该发布者未提供可在该映像中安装的软件包版本,即使另一个已启用的发布者提供了可在该映像中安装的软件包版本,安装操作也会失败。可执行下列操作之一来解决此问题:

  • 在软件包 FMRI 中指定发布者。例如,在完整的软件包名称前指定 pkg://solaris/

  • 使用 pkg set-publisher 命令的 -P 选项将提供您需要的软件包版本的发布者设置为搜索顺序中的第一个发布者。

在安装或更新时,可以使用 -nv 选项来查看将进行的更改,例如将安装或更新哪些软件包的哪些版本以及是否将创建新的 BE。-v 选项还显示适用于此特定安装或更新操作的任何发行说明。

  • 如果使用 -nv 选项时没有显示任何错误消息,则在无 -n 选项的情况下再次运行该命令来实际执行安装或更新。如果缺省情况下不创建新的 BE 或备份 BE,请考虑您应当指定选项来在新的 BE 中进行安装,还是要创建备份 BE。

  • 如果收到错误消息,请执行下列操作:

    • 在软件包 FMRI 中指定更多所需的版本,以此获取更多有助于诊断和修复问题的信息。

    • 指定更多 -v 选项(如 -nvv)。

    • 使用 pkg history 命令。-l 选项提供已更改的软件包的完整 FMRI。请参见查看操作历史记录

如果指定了多个要安装或更新的软件包,或者没有为更新操作指定软件包,当无法在该映像中安装这些软件包中的任意一个时,安装或更新操作将失败。如果某个软件包无法安装,则不会安装任何软件包。要了解更多信息,请只在该命令中指定无法安装的软件包及其完整 FMRI,并提供一个或多个 -v 选项,再次调用该命令。

无法访问发布者或系统信息库

本节讨论了有关无法访问发布者 URI 的错误。

无法访问软件包系统信息库

错误消息:

  • Couldn't resolve host

  • Unable to contact any configured publishers

  • Unable to contact valid package repository

  • Origin URIs do not appear to point to a valid pkg repository

可使用 pkg publisher 命令显示发布者的 URI。请参见以下示例中的 LOCATION 列或 URI 行:

$ pkg publisher
PUBLISHER                   TYPE     STATUS P LOCATION
solaris                     origin   online F http://pkg.oracle.com/solaris/release/
$ pkg publisher solaris
            Publisher: solaris
                Alias:
           Origin URI: http://pkg.oracle.com/solaris/release/

如果列出了您不再使用的发布者,请禁用或删除这些发布者:

$ pkg set-publisher --disable publisher
$ pkg unset-publisher publisher

对于正在使用的发布者,请确保 URI 是正确的。

  • 尝试在浏览器中查看每个发布者源位置,或者对该位置执行 ping 命令。

  • 尝试使用 pkgrepo list 命令列出位于该源的软件包。

如果源位置不正确,请同时使用 pkg set-publisher 命令的 -G-g 选项来更改该 URI。

如果发布者有多个源,则所有的源位置都必须是可访问的。如果任一源位置不可访问,请使用 pkg set-publisher 命令的 -G 选项删除该源。

如果某个发布者是在非全局区域中配置的,则必须能从全局区域访问该发布者的所有位置,即使未在全局区域中配置该发布者也是如此。

SSL 证书问题

错误消息:SSL certificate problem, verify that the CA cert is OK

如果 pkg 命令显示了有关 SSL 证书问题的消息,请执行以下一项或多项操作:

  • 确保已安装必需的密钥和证书。有关如何获取密钥和证书的信息应该与有关安全系统信息库的其他信息存储在一起。

  • 使用 -k-c 选项执行 pkg set-publisher 命令,以指定密钥和证书的安装位置。针对发布者的 pkg publisher 命令会显示发布者期望于何处查找密钥和证书。如果密钥和证书安装在别处,请通过指定正确的 -k-c 选项值重新配置发布者。

    在以下示例中,输出显示了密钥和证书的文件路径,并且显示为 abc 发布者配置的源的证书已过期:

    $ pkg publisher abc
     Publisher: abc
    Origin URI: https://pkg.oracle.com/abc/release/
       SSL Key: /var/pkg/ssl/keyfile
      SSL Cert: /var/pkg/ssl/certfile
    Certificate '/var/pkg/ssl/certfile' has expired.
      Please install a valid certificate.
  • 确保系统上的时间和日期正确。

  • 刷新 ca-certificates SMF 服务:

    $ svcadm refresh svc:/system/ca-certificates:default
  • 如果源 URI 包含 oc-mgmt,请联系 Ops Center 支持代表。


注 -  无法使用 -g 选项和 pkg 安装命令指定需要客户端 SSL 证书的系统信息库。

无法找到位置

错误消息:http protocol error: code: 404 reason: Not Found

无法访问软件包系统信息库所述检查发布者的 URI。如果能够查看该位置或可成功地对该位置执行 ping 命令,请尝试使用 pkgrepo list 命令显示系统信息库中的软件包之一。

如果 URI 是基于文件的系统信息库,请确保 pkg5srv 用户可读取这些文件和目录。可使用 pkgrepo verify 命令检查 pkg5srv 用户能否读取该系统信息库。

检查 Web 服务器配置。有关更多信息,请参见在 Oracle Solaris 11.2 中复制和创建软件包系统信息库 中的第 5  章 在 Web 服务器后运行 Depot 服务器

  • 如果在 Apache Web 服务器实例后运行软件包库 (depot) 服务器,请在 httpd.conf 文件中包括以下设置以防止对已编码的正斜杠解码:

    AllowEncodedSlashes NoDecode
  • 将 depot 服务器 pkg/proxy_base 设置为 Apache 服务器上的系统信息库的 URL:

    $ svccfg -s pkg/server:repo setprop pkg/proxy_base = astring: http://pkg.example.com/myrepo
    $ svcadm refresh pkg/server:repo

如果该问题出现在非全局区域中,请执行以下故障排除步骤。请记住,非全局区域使用称为系统信息库的特殊软件包系统信息库。有关系统信息库的更多信息,请参见 pkg.sysrepo(1M) 手册页。

  • 您不能在具有非全局区域的映像中使用 -g 选项,不过,可使用 pkg set-publisher 命令显式添加发布者和源。

  • 确保 pkg5srv 用户可读取基于文件的系统信息库中的文件和目录。pkg5srv 用户运行 system-repository Apache 实例。有关如何查找系统信息库位置的示例,请参见全局和非全局区域的关系

  • 如果站点需要代理来访问外部位置,请确保已在全局区域中为发布者正确地指定了代理。可使用 pkg set-publisher 命令的 --proxy 选项指定代理。有关说明,请参见指定代理。用于检查代理的一种方法是,确保您不会从 pkg refresh --full 命令获得访问错误消息。

  • 确保服务 svc:/application/pkg/system-repository:default 在全局区域中处于联机状态。

  • 确保服务 svc:/application/pkg/zones-proxyd:default 在全局区域中处于联机状态,并且服务 svc:/application/pkg/zones-proxy-client:default 在非全局区域中处于联机状态。

  • 在全局区域中,检查 /var/log/pkg/sysrepo/* 中的日志文件,查看在尝试读取文件时是否报告了任何权限错误。查看 /var/log/pkg/sysrepo/access_log 中是否报告了 404 或 503 错误。查看 /var/log/pkg/sysrepo/error_log 中是否报告了错误。

  • 在全局区域中,确认 /etc/hosts 文件中的 localhost 设置为 127.0.0.1。确认 /system/volatile/pkg/sysrepo/sysrepo_httpd.conf 文件中的 Listen 设置为 127.0.0.1:1008ServerName 设置为 127.0.0.1

  • 在全局区域中,检查文件 /system/volatile/pkg/sysrepo/sysrepo_httpd.conf 是否包含下列格式的别名行:

    $ grep Alias /system/volatile/pkg/sysrepo/sysrepo_httpd.conf
    WSGIScriptAlias /wsgi_p5p /etc/pkg/sysrepo/sysrepo_p5p.py

    如果 sysrepo_httpd.conf 文件不包含别名行,请重新启动 sysrepo 服务:

    $ svcadm restart svc:/application/pkg/system-repository:default

服务不可用

错误消息:http protocol error: code: 503 reason: Service Unavailable

可使用 pkg publisher 命令查找您尝试使用的软件包系统信息库的位置,并检查该系统上的 SMF 服务。可使用下列命令识别任何已启用但未运行的软件包系统信息库 SMF 服务实例,以及任何阻止其他已启用的实例运行的实例:

$ svcs -xv pkg/server
svc:/application/pkg/server: default (image packaging repository)
 State: online since July 25, 2013 07:53:50 AM PDT
   See: /var/svc/log/application-pkg-server:default.log
Impact: None.

如果有任何服务报告了问题,请检查 svcs 输出中列出的日志文件以确定具体的问题。

确保正确设置 inst_root 属性、port 属性和其他属性。

$ svcprop -p pkg pkg/server:default
$ svcprop -p pkg/inst_root -p pkg/port pkg/server:default
/export/IPSpkgrepos/Solaris
80

必要时,请使用 svccfg 命令重置属性值,如以下示例所示:

$ svccfg -s pkg/server:default setprop pkg/port=1008

可根据需要使用 svcadm 命令清除、刷新、重新启动和启用服务实例。

无更新可用

错误消息:No updates available for this image

如果要更新特定软件包,可使用以下命令显示当前安装在该映像中的此软件包的版本。如果要更新所有已安装的软件包(在不指定软件包或通过 '*' 指定软件包名称的情况下执行 pkg update),请在这些命令中对 package 使用 pkg:/entire

$ pkg list -v package

如果当前未安装任何版本,请使用 pkg install 命令,而不是 pkg update 命令。

如果当前已安装 package 的某个版本,请使用下列命令显示可从所配置的发布者获取的 package 版本:

$ pkg list -afv package

如果已安装具有最高版本号的软件包,则可能不存在新版本。

如果不存在新版本,请确定提供新版本的软件包系统信息库位置,并使用 pkg set-publisher 命令来重置源 URI 或添加恰当的发布者的源 URI。必要时,安装所需的任何密钥和证书,并使用 -k-c 选项指定它们。使用 pkgrepo list 命令验证也可从所配置的发布者获取的软件包当前安装的版本。

通过指定 -nv 选项并在要安装的软件包的 FMRI 中包含版本(或关键字 latest),再次执行 pkg update 命令,如以下示例所示。如果在软件包名称中提供更多信息,则通常可以在所有错误输出中获取更多信息。

$ pkg update -nv package@latest

无法安装软件包

错误消息:No matching version of package can be installed

可使用下列命令显示配置的软件包发布者提供的是 package 的哪个版本。

$ pkg list -afv package

指定要安装的软件包的更详细 FMRI。找到的第一个匹配项可能无法在该映像中安装,但您要安装的特定版本有可能是可安装的。如果指定更具体的 FMRI 仍未能找到可安装的版本,这一操作会显示有关为何无法安装软件包的更多信息。

确认未冻结您希望安装或更新的软件包的版本。使用 pkg freeze 命令而不指定参数,可显示其版本已被冻结的所有软件包列表。

可使用以下命令显示 pkg:/entire 软件包的已安装版本:

$ pkg list -v entire

无法安装或更新受 pkg:/entire incorporation 软件包或其他某些 incorporation 软件包约束的软件包。必须更新 incorporation 软件包。有关更多信息,请参见无法满足约束

无法满足约束

错误消息:No solution was found to satisfy constraints

该消息表示您已尝试安装与受 incorporation 软件包约束的软件包版本不匹配的软件包版本。有关 incorporation 软件包和约束的信息,请参见incorporation 软件包

Incorporation 将一组软件包限制为可共同工作以帮助维护映像可支持性的版本。基于此原因,您不应该更新受 incorporation 约束的软件包。相反,您应该更新 incorporation 软件包,从而将所有受约束软件包更新为一个新的经过共同测试的版本集合。

在修改软件包(如更新软件包)时,pkg 客户端会检查相关的软件包及其依赖项。如果无法安装或更新任何相关软件包,则会针对每个对无法安装或更新的软件包具有依赖性的软件包单独生成错误消息。处理大量错误消息的最有效方法是,首先检查最深层缩进的错误消息。

更新 Incorporation 约束的软件包

错误消息:

  • No suitable version of installed package package found

  • All versions matching 'incorporate' dependency package are rejected

  • This version excluded by specified installation version

  • This version is excluded by installed incorporation

对于 incorporation 约束的软件包,最佳作法是更新 incorporation 软件包,以此将所有受约束的软件包保持为一个经过共同测试的集合。

如果您仍然希望只更新 incorporation 中的某个软件包,请检查该软件包是否具有设置为 trueversion-lock 侧面。如果某个软件包具有关联的 version-lock 侧面,则可以从其 incorporation 解除对该软件包的锁定。将 version-lock 侧面设置为 false 以删除约束,然后再次尝试安装或更新该软件包。在软件包名称的 FMRI 中指定 -nv 选项和所需软件包的版本。另请参见放宽由 Incorporation 指定的版本约束

示例 A-1  解锁和更新 Java 运行时环境

以下示例显示了如何更新 runtime/java/jre-7 软件包。jre-7 软件包受 consolidation/java/java-incorporation 软件包约束,而 java-incorporation 软件包又受 pkg:/entire incorporation 软件包约束。

以下命令显示当前安装了 jre-70.175.2.0.0.9.0 版本,还显示配置的软件包系统信息库提供了新版本。

$ pkg list -af runtime/java/jre-7
NAME (PUBLISHER)                                  VERSION                    IFO
runtime/java/jre-7                                1.7.0.21-0.175.2.0.0.13.0  ---
runtime/java/jre-7                                1.7.0.17-0.175.2.0.0.9.0   i--

删除 -f 选项后,将显示可升级到哪个版本。以下 pkg list 输出显示没有可在该映像中安装的新版本,而 pkg update 命令的输出确认了此状态。-n 选项可显示将要作出的更改,但不会作任何更改。

$ pkg list -a runtime/java/jre-7
NAME (PUBLISHER)                                  VERSION                    IFO
runtime/java/jre-7                                1.7.0.17-0.175.2.0.0.9.0   i--
$ pkg update -nv runtime/java/jre-7
No updates available for this image.

要显示有关为何无法更新该软件包的详细信息,请指定要更新到哪个版本。在以下示例中显示的输出表明已安装的 java-incorporation@0.5.11,5.11-0.175.2.0.0.9.0 软件包不允许对 jre-7@1.7.0.21-0.175.2.0.0.13.0 软件包进行安装操作。java-incorporation@0.5.11,5.11-0.175.2.0.0.13.0 软件包允许安装 jre-7@1.7.0.21-0.175.2.0.0.13.0 软件包,但已安装的 entire@0.5.11,5.11-0.175.2.0.0.12.0 incorporation 软件包不允许安装 jre-7@1.7.0.21-0.175.2.0.0.13.0 软件包。

$ pkg update -nv runtime/java/jre-7@1.7.0.21-0.175.2.0.0.13.0
pkg update: No solution was found to satisfy constraints

maintained incorporations:
  [output omitted]
  pkg://solaris/entire@0.5.11,5.11-0.175.2.0.0.12.0:20130415T172730Z

Plan Creation: dependency error(s) in proposed packages:
  [output omitted]
  No suitable version of required package pkg://solaris/consolidation/java/java-
incorporation@0.5.11,5.11-0.175.2.0.0.9.0:20130304T213946Z found:
    Reject:  pkg://solaris/consolidation/java/java-incorporation@0.5.11,5.11-0.1
75.2.0.0.9.0:20130304T213946Z
    Reason:  All versions matching 'incorporate' dependency pkg:/runtime/java/jr
e-7@1.7.0.17,5.11-0.175.2.0.0.9.0 are rejected
      Reject:  pkg://solaris/runtime/java/jre-7@1.7.0.17,5.11-0.175.2.0.0.9.0:20
130304T214022Z
      Reason:  This version excluded by specified installation version
        Reject:  pkg://solaris/runtime/java/jre-7@1.7.0.17,5.11-0.175.2.0.0.9.0:
20130304T214022Z
        Reason:  This version excluded by specified installation version
      Reject:  pkg://solaris/consolidation/java/java-incorporation@0.5.11,5.11-0
.175.2.0.0.13.0:20130429T145534Z
      Reason:  This version is excluded by installed incorporation pkg://solaris
/entire@0.5.11,5.11-0.175.2.0.0.12.0:20130415T172730Z

Plan Creation: Errors in installed packages due to proposed changes:
  [output omitted]
  No suitable version of installed package pkg://solaris/consolidation/java/java
-incorporation@0.5.11,5.11-0.175.2.0.0.9.0:20130304T213946Z found
    Reject:  pkg://solaris/consolidation/java/java-incorporation@0.5.11,5.11-0.1
75.2.0.0.9.0:20130304T213946Z
    Reason:  All versions matching 'incorporate' dependency pkg:/runtime/java/jr
e-7@1.7.0.17,5.11-0.175.2.0.0.9.0 are rejected
      Reject:  pkg://solaris/runtime/java/jre-7@1.7.0.17,5.11-0.175.2.0.0.9.0:20
130304T214022Z
      Reason:  This version excluded by specified installation version
    Reject:  pkg://solaris/consolidation/java/java-incorporation@0.5.11,5.11-0.1
75.2.0.0.13.0:20130429T145534Z
    Reason:  This version is excluded by installed incorporation pkg://solaris/e
ntire@0.5.11,5.11-0.175.2.0.0.12.0:20130415T172730Z

最佳做法是更新 entire 软件包。更新 entire 软件包时会更新 java-incorporation 软件包(该软件包也会更新 jre-7 软件包)。在该示例中,您必须更新 Java 软件包,并且不能将映像更新为已更新的 entire 版本。

可通过设置 Java incorporation 软件包的 version-lock 侧面来约束可安装的 Java 软件版本。要在不更新其他软件的情况下更新 Java 软件,请解锁 Java incorporation 软件包的 version-lock 侧面,然后更新 Java incorporation 软件包。有关 version-lock 侧面的更多信息,请参见放宽由 Incorporation 指定的版本约束

以下命令将已安装的 java-incorporation 软件包的 version-lock 侧面值更改为 false。要更新的软件包数量等于已在该映像中安装的软件包数量,因为会针对此侧面检查映像中的每个软件包。

$ pkg change-facet \
facet.version-lock.consolidation/java/java-incorporation=false
            Packages to update: 856
     Variants/Facets to change:   1
       Create boot environment:  No
Create backup boot environment: Yes

Planning linked: 1/1 done
PHASE                                          ITEMS
Removing old actions                             1/1
Updating image state                            Done
Creating fast lookup database                   Done
Reading search index                            Done
Building new search index                    856/856

以下命令显示了已更改的侧面值:

$ pkg facet
FACETS                                                   VALUE
facet.version-lock.consolidation/java/java-incorporation False

由于以下命令指定了 -n 选项,该命令仅显示将要更改的内容,而不会对映像进行任何实际更改。

$ pkg update -nv java-incorporation
            Packages to update:         2
     Estimated space available:  80.91 GB
Estimated space to be consumed: 687.28 MB
       Create boot environment:        No
Create backup boot environment:       Yes
          Rebuild boot archive:        No

Changed packages:
solaris
  consolidation/java/java-incorporation
    0.5.11,5.11-0.175.2.0.0.9.0:20130304T213946Z -> 0.5.11,5.11-0.175.2.0.0.13.0
:20130429T145534Z
  runtime/java/jre-7
    1.7.0.17,5.11-0.175.2.0.0.9.0:20130304T214022Z -> 1.7.0.21,5.11-0.175.2.0.0.
13.0:20130429T145626Z

以下命令将执行实际的更新。该命令在当前映像中执行更新。您可以使用 --be-name 选项来在新的引导环境中执行更新。

$ pkg update -v java-incorporation
            Packages to update:         2
     Estimated space available:  80.91 GB
Estimated space to be consumed: 687.28 MB
       Create boot environment:        No
Create backup boot environment:       Yes
          Rebuild boot archive:        No

Changed packages:
solaris
  consolidation/java/java-incorporation
    0.5.11,5.11-0.175.2.0.0.9.0:20130304T213946Z -> 0.5.11,5.11-0.175.2.0.0.13.0
:20130429T145534Z
  runtime/java/jre-7
    1.7.0.17,5.11-0.175.2.0.0.9.0:20130304T214022Z -> 1.7.0.21,5.11-0.175.2.0.0.
13.0:20130429T145626Z
DOWNLOAD                                PKGS         FILES    XFER (MB)   SPEED
Completed                                2/2       171/171    61.9/61.9    0B/s

PHASE                                          ITEMS
Removing old actions                             7/7
Installing new actions                           6/6
Updating modified actions                    170/170
Updating package state database                 Done
Updating package cache                           2/2
Updating image state                            Done
Creating fast lookup database                   Done
Reading search index                            Done
Updating search index                            2/2

以下命令确认已在该映像中更新了 jre-7 软件包。如果要在新的引导环境中执行更新,请使用 beadm mountpkg -R 在这一新的引导环境中执行以下检查。

$ pkg list jre-7
NAME (PUBLISHER)                                  VERSION                    IFO
runtime/java/jre-7                                1.7.0.21-0.175.2.0.0.13.0  i--

无法找到合适的依赖项时更新 incorporation

错误消息:A version for 'incorporate' dependency cannot be found

有关 incorporation 软件包及其 incorporate 依赖项的信息,请参见incorporation 软件包

Incorporation 软件包的 incorporate 依赖项的下列安装状态可能是 incorporation 软件包更新会失败的其中几个原因:

  • 已在其他版本级别冻结了相关软件包。

  • 已安装了相关软件包的更高版本。

  • 已安装了其他发布者提供的相关软件包且该发布者具有粘滞性。

示例 A-2  在未锁定依赖项且单独更新该依赖项的情况下更新 pkg:/entire

由于未指定软件包名称,以下示例将尝试更新所有已安装的软件包。该操作尝试更新的已安装软件包之一是 pkg:/entire incorporation 软件包。该示例显示了已安装更高版本的 pkg:/entire 的一个 incorporate 依赖项。

$ pkg update --be-name s11.2
Creating Plan (Solver setup): /
pkg update: No solution was found to satisfy constraints
Plan Creation: Package solver has not found a solution to update to latest available versions.
This may indicate an overly constrained set of packages are installed.

latest incorporations:
[output omitted]
pkg://solaris/entire@0.5.11,5.11-0.175.2.0.0.10.0:20130318T181506Z

The following indicates why the system cannot update to the latest version:

No suitable version of required package pkg://solaris/entire@0.5.11,5.11-0.175.2
.0.0.10.0:20130318T181506Z found:
 Reject:  pkg://solaris/entire@0.5.11,5.11-0.175.2.0.0.10.0:20130318T181506Z
 Reason:  A version for 'incorporate' dependency on pkg:/consolidation/ub_javavm
/ub_javavm-incorporation@0.5.11,5.11-0.175.2.0.0.9.0 cannot be found

此消息表明 pkg:/entire incorporation 软件包版本(系统尝试更新到此版本)指定了一个无法安装的 ub_javavm-incorporation 软件包版本。由于无法安装某个软件包,因此不安装任何软件包且更新失败。

下列方法可提供有关为何无法安装 ub_javavm-incorporation 软件包的更多信息。

  • 使用 -v 选项。例如,使用 -v-vv 可显示更详细的输出。

  • 指定要更新的软件包。提供更详细的输入通常能生成更详细的消息。例如,除软件包的名称外,在软件包 FMRI 中加入版本。

以下命令包括了 -v 选项并指定要更新到 entire@0.5.11,5.11-0.175.2.0.0.10.0 软件包(复制于前面的消息)。该命令还指定了 -n 选项而非指定 --be-name 选项。-n 选项显示将要进行的更改,但不会对该映像进行任何实际的更改。

$ pkg update -nv entire@0.5.11,5.11-0.175.2.0.0.10.0
Creating Plan (Solver setup): /
pkg update: No matching version of entire can be installed:
 Reject:  pkg://solaris/entire@0.5.11,5.11-0.175.2.0.0.10.0:20130318T181506Z
 Reason:  All versions matching 'require' dependency pkg:/consolidation/ub_javav
m/ub_javavm-incorporation are rejected
  Reject:  pkg://solaris/consolidation/ub_javavm/ub_javavm-incorporation@0.5.11,
5.11-0.151.0.1:20101105T053418Z
  pkg://solaris/consolidation/ub_javavm/ub_javavm-incorporation@0.5.11,5.11-0.17
5.0.0.0.2.0:20111019T144756Z
  pkg://solaris/consolidation/ub_javavm/ub_javavm-incorporation@0.5.11,5.11-0.17
5.0.10.1.0.0:20120920T143020Z
  Reason:  Excluded by proposed incorporation 'entire'
  Newer version pkg://solaris/consolidation/ub_javavm/ub_javavm-incorporation@0.
5.11,5.11-0.175.2.0.0.13.0:20130429T145201Z is already installed
  Reject:  pkg://solaris/consolidation/ub_javavm/ub_javavm-incorporation@0.5.11,
5.11-0.175.2.0.0.9.0:20130304T213739Z
  Reason:  Newer version pkg://solaris/consolidation/ub_javavm/ub_javavm-incorpo
ration@0.5.11,5.11-0.175.2.0.0.13.0:20130429T145201Z is already installed
 Reject:  pkg://solaris/consolidation/ub_javavm/ub_javavm-incorporation@0.5.11,5
.11-0.175.2.0.0.13.0:20130429T145201Z
 Reason:  Excluded by proposed incorporation 'entire'

这些消息指出当前在该映像中安装的 ub_javavm-incorporation 软件包的版本比更新操作将安装的 pkg:/entire incorporation 软件包指定的版本更新。

以下命令显示了当前安装的 ub_javavm-incorporation 软件包的版本。

$ pkg list ub_javavm-incorporation
NAME (PUBLISHER)                                  VERSION                    IFO
consolidation/ub_javavm/ub_javavm-incorporation   0.5.11-0.175.2.0.0.13.0    i--

以下命令显示了由系统尝试更新到的 pkg:/entire incorporation 软件包指定的 ub_javavm-incorporation 软件包的版本。系统尝试升级到的 pkg:/entire incorporation 软件包的版本复制于前面输出的第一条 "Reject" 消息。-r 选项在所配置的软件包系统信息库中查找该软件包,而不是在已安装的映像中查找。

$ pkg contents -Hrt depend \
-a facet.version-lock.consolidation/ub_javavm/ub_javavm-incorporation=true \
-o fmri entire@0.5.11,5.11-0.175.2.0.0.10.0
consolidation/ub_javavm/ub_javavm-incorporation@0.5.11-0.175.2.0.0.9.0

要修复该问题,您可以指示更新操作更新除指定的特定软件包外的所有已安装软件包。在 pkg update 命令中使用一个或多个 --reject 选项来执行更新,而不尝试更新在 --reject 选项中指定的软件包。可在 --reject 参数中使用通配符。在以下命令中,要拒绝的软件包复制于上文中位于 "Reason: Newer version is already installed" 消息之前的 "Reject" 消息。

$ pkg update -v --be-name s11.2 \
--reject 'consolidation/ub_javavm/ub_javavm-incorporation@0.5.11,5.11-0.151*' \
--reject 'consolidation/ub_javavm/ub_javavm-incorporation@0.5.11,5.11-0.175.0*' \
--reject 'consolidation/ub_javavm/ub_javavm-incorporation@0.5.11,5.11-0.175.2.0.0.9.0*'

提示  - 指定 --reject 参数时请注意:与 --reject 参数匹配的任何已安装的软件包都将被卸载。

在已安装的依赖项不获允许的情况下更新 Incorporation

错误消息:

  • The installed package package is not permissible

  • Excluded by proposed incorporation

如果您收到这些错误消息,则 package 可能是必须与其他核心操作系统软件包保持同步的核心操作系统软件包。请使用 pkg facet 命令检查 facet.version-lock.package 侧面的值。如果该 version-lock 侧面的值为 false,使用 pkg change-facet 将该侧面的值更改为 true,然后再次尝试更新操作。

无法找到所需的软件包

错误消息:A version for 'require' dependency cannot be found

如果收到类似下列表示无法找到所需软件包的消息,请检查是否能从所配置的发布者处获得该软件包。

pkg update: No solution was found to satisfy constraints
Plan Creation: Package solver has not found a solution to update to
latest available versions.
This may indicate an overly constrained set of packages are installed.
[output omitted]
No suitable version of required package package1 found:
Reject: package1
Reason: A version for 'require' dependency package2 cannot be found

使用下列命令显示是否能从所配置的软件包发布者处获取 package2

$ pkg list -afv package2

使用 pkg publisher 命令检查发布者源位置。在完整 FMRI 的 pkg:// 之后指定该软件包的发布者。您可能需要更改发布者源位置。如果该位置是本地软件包系统信息库,您可能需要更新该系统信息库。

所需软件包被拒绝

错误消息:

  • No solution was found to satisfy constraints

  • All versions matching 'require' dependency package are rejected

在以下的 pkg update 命令输出中,初始错误信息指明无法找到所需的 desktop-incorporation 软件包的适用版本。desktop-incorporation 软件包不适用的原因是无法找到该软件包的其中一个依赖项。由于未能找到适用的版本,所以将拒绝 desktop-incorporation 软件包。pkg update 失败的原因在于 pkg:/entire incorporation 需要 desktop-incorporation 软件包。以下命令显示 pkg:/entire incorporation 需要 desktop-incorporation 软件包:

$ pkg search -Hlo pkg.name require:consolidation/desktop/desktop-incorporation

下一个错误消息指出无法找到所需软件包 python-extra-26 的适用版本。python-extra-26 软件包之所以不适用,是因为 python-extra-26 软件包需要 desktop-incorporation 软件包,而又未能找到适用的 desktop-incorporation 版本。

该信息显示,要解决这一更新失败的问题,就需要找到某种可安装 desktop-incorporation 软件包所需版本的方法。

pkg update: No solution was found to satisfy constraints

maintained incorporations:
  [output omitted]

Plan Creation: dependency error(s) in proposed packages:
  [output omitted]
  No suitable version of required package pkg://solaris/consolidation/desktop
/desktop-incorporation@0.5.11,5.11-0.175.2.0.0.26.0:20131028T145233Z found:
    Reject: pkg://solaris/consolidation/desktop/desktop-incorporation
@0.5.11,5.11-0.175.2.0.0.26.0:20131028T145233Z
    Reason: A version for 'incorporate' dependency on pkg:/library/python-2
/python-sexy-26@0.1.9-0.175.0.0.0.1.0 cannot be found
  No suitable version of required package pkg://solaris/library/python-2
/python-extra-26@2.6.4-0.175.1.0.0.15.0:201205014T200156Z found:
    Reject:  pkg://solaris/library/python-2/python-extra-26@
2.6.4-0.175.1.0.0.15.0:201205014T200156Z
    Reason: All versions matching 'require' dependency pkg:/consolidation
/desktop/desktop-incorporation are rejected
      Reject: pkg://solaris/consolidation/desktop/desktop-incorporation
@0.5.11,5.11-0.175.0.0.0.2.0:20111019T132128Z
  [output omitted]
pkg://solaris/consolidation/desktop/desktop-incorporation
@0.5.11,5.11-0.175.2.0.0.26.0:20131028T145233Z

以下命令显示,对于所需 desktop-incorporation 软件包,未能找到的软件包并非必需。python-sexy-26 软件包包含在 desktop-incorporation 软件包中,但它并非必需。

$ pkg search -Hlo pkg.name require:library/python-2/python-sexy-26
$ pkg search -Hlo pkg.name incorporate:library/python-2/python-sexy-26
consolidation/desktop/desktop-incorporation

incorporate 依赖关系指出了在安装 python-sexy-26 软件包时必须安装指定的版本。但是,由于没有任何软件包需要 python-sexy-26 软件包,安装 python-sexy-26 软件包并非必需。因此,解决该更新失败的其中一个方法是卸载 python-sexy-26 软件包。当前安装了该软件包的其他版本,并且更新操作无法找到 desktop-incorporation incorporation 指定的版本。如果卸载该软件包,更新过程将不需要查找该更新的软件包。

如果您需要 python-sexy-26 软件包,不希望将其卸载,请找到提供 pkg:/library/python-2 /python-sexy-26@0.1.9-0.175.0.0.0.1.0 的软件包系统信息库。既可使用 pkg set-publisher 命令将该系统信息库添加到发布者源位置,也可使用 pkgrecv 命令将该软件包添加到当前设置的发布者源。

未能按预期更新软件包

错误消息:pkg update: The installed package package is not permissible.

如果在更新操作中使用通配符,即使在未能更新某些应更新软件包时,您也可能无法看到任何错误消息。如果不使用通配符指定软件包名称,则可能会看到错误信息。

例如,完成以下操作时,可能不产生任何错误但也未更新任何软件包(即便您已确认配置的发布者提供了新的软件包)。

$ pkg update '*'

要获取更多信息,请不要使用通配符,而是指定要更新到哪个 pkg:/entire 版本。

$ pkg list -Hafv entire
pkg://solaris/entire@0.5.11,5.11-0.175.2.0.0.9.0:20130304T214506Z  ---
$ pkg update -nv pkg://solaris/entire@0.5.11,5.11-0.175.2.0.0.9.0:20130304T214506Z
Creating Plan (Solver setup): -
pkg update: The installed package compress/zip is not permissible.
  Reject:  pkg://solaris/compress/zip@3.0,5.11-0.175.2.0.0.7.0:20121119T070339Z
  Reason:  Excluded by proposed incorporation 'consolidation/userland/userland-incorporation'

在该示例中,软件包 compress/zip 阻止更新 userland-incorporation incorporation 软件包(该 incorporation 软件包也阻止更新 pkg:/entire incorporation)。以下命令显示了有关 compress/zip 软件包的更多信息:

$ pkg list compress/zip
NAME (PUBLISHER)  VERSION                   IFO
compress/zip      3.0-5.11-0.175.2.0.0.7.0  if-

该输出显示 compress/zip 软件包处于冻结状态。由于该软件包已被冻结,因此无法将其更新。

$ pkg unfreeze compress/zip
compress/zip was unfrozen.

compress/zip 软件包处于非冻结状态时,原先的 pkg update '*' 操作将更新映像中具有可用更新的所有软件包。有关 pkg freezepkg unfreeze 命令的更多信息,请参见将软件包锁定为指定版本

无法安装 Sync Linked 软件包中显示类似的 pkg sync-linked 错误,但它指明非全局区域中的某个软件包在阻止更新。

无法安装 Sync Linked 软件包

错误消息:pkg sync-linked: The installed package package is not permissible.

sync-linked 软件包是非全局区域中的一个软件包。您可能会看到某个软件包因版本与父映像不匹配而被拒绝。

Linked progress: -pkg: update failed (linked image exception(s)):

A 'sync-linked' operation failed for child 'zone:z1' with an unexpected
return value of 1 and generated the following output:

pkg sync-linked: The installed package package is not permissible.
  Reject:  package
  Reason:  Parent image has a incompatible newer version: package

可能会由于下列原因而接收到指明不兼容的这一消息:

  • 非全局区域和全局区域中的核心操作系统软件包必须是相同的版本。您不能在非全局区域中单独更新这些软件包。同样地,在非全局区域中冻结这些软件包中的任意一个时,便会导致针对全局区域和所有非全局区域的更新失败。

    以下命令可显示必须在全局区域和非全局区域间保持同步的软件包列表:

    $ pkg search -o pkg.name :depend:parent:
  • 在更新配置了区域的 BE 时,如果备用 BE (ABE) 中的发布者配置和当前引导 BE 中的发布者配置不同,则无法挂载该 BE 以使用 pkg -R 命令更新 ABE。ABE 中的非全局区域使用来自当前活动的 BE 的发布者配置。

无法安装非全局区域

错误消息:The following pattern(s) did not match any allowable packages. Try using a different matching pattern, or refreshing publisher information

非全局区域和全局区域中的核心操作系统软件包必须是相同的版本。如果将该映像中的 solaris 发布者源设置为某个软件包系统信息库,而且该软件包系统信息库包含的系统软件包版本不同于全局区域中所安装的版本,当尝试安装非全局区域时,会导致以下错误:

$ zoneadm -z myzone install
The following ZFS file system(s) have been created:
    rpool/export/zones/myzone
Progress being logged to /var/log/zones/zoneadm.20131104T181301Z.myzone.install
       Image: Preparing at /export/zones/myzone/root.

AI Manifest: /tmp/manifest.xml.9daq.i
SC Profile: /usr/share/auto_install/sc_profiles/enable_sci.xml
  Zonename: myzone
Installation: Starting ...

            Creating IPS image
Startup linked: 1/1 done
            Installing packages from:
                solaris
                    origin:  http://pkg.oracle.com/solaris/release/
            Error occurred during execution of 'generated-transfer-4606-1' checkpoint.
            Failed Checkpoints:

            Checkpoint execution error:

                The following pattern(s) did not match any allowable packages. Try
                using a different matching pattern, or refreshing publisher information:

Installation: Failed.  See install log at /system/volatile/install.4606/install_log
ERROR: auto-install failed.

要安装非全局区域,设置为 solaris 发布者源的系统信息库必须至少包含全局区域(您在该区域上安装非全局区域)中所安装的同一系统软件。系统信息库也可以包含更旧或更新的软件,但它必须包含全局区域中所安装的同一软件。以下命令显示 /export/IPSpkgrepos/Solaris 系统信息库是适用于该全局区域的发布者源,因为该系统信息库包含的 pkg:/entire 软件包版本与在全局区域中安装的相同:

$ pkg list entire
NAME (PUBLISHER)      VERSION                   IFO
entire                0.5.11-0.175.2.0.0.26.0   i--
$ pkgrepo list -H -s /export/IPSpkgrepos/Solaris \
entire@0.5.11-0.175.2.0.0.26.0
solaris       entire       0.5.11-0.175.2.0.0.26.0:20131028T190148Z
$ pkg set-publisher -G '*' -M '*' -g /export/IPSpkgrepos/Solaris/ solaris

无法修改映像

错误消息:pkg: The image cannot be modified as it is currently in use by another package client

错误消息应包含已锁定该映像的客户端的名称和 pid,如以下示例所示:

pkg: The image cannot be modified as it is currently in use by another package
client: pkg on cbusl0406l, pid 26604.

在当前软件包进程(该实例中为进程 26604)退出之后,请再次尝试执行 pkg 命令。如果该进程未能迅速退出,请使用 ptree -a 等开始检查该进程。

当前在该映像中运行的软件包进程可能是检查是否有可用更新的更新管理器。有关更新管理器 cron 作业和 pkg/update 服务的更多信息,请参见使用更新管理器

文件已被挽救

以下信息性消息之后是被挽救的文件的路径和将这些文件移到的临时位置。

The following unexpected or editable files and directories were
salvaged while executing the requested package operation; they
have been moved to the displayed location in the image:

这是一条信息性消息,可忽略或根据需要进行相应的操作。

在 IPS 中对目录进行引用计数。当显式或隐式引用某目录的已安装在映像中的最新软件包不再引用该目录时,将删除该目录。如果该目录包含未打包的文件系统对象,则将这些项移动到 $IMAGE_META/lost+found 中。未打包的文件系统对象是 IPS 软件包不提供的文件和目录。IMAGE_META 的值通常是 /var/pkg。有关 IMAGE_META 目录的信息,请参见 pkg(5) 手册页中的“文件”部分。

最大程度地减少存储的映像元数据

/var/pkg 目录存储映像的元数据。该目录可能会占用很大的空间。请勿手动删除 /var/pkg 目录中的任何内容。

确保将 flush-content-cache-on-success 映像属性值设置为 trueflush-content-cache-on-success 属性的缺省值为 true。当 flush-content-cache-on-success 的值为 true 时,成功完成 pkg installpkg update 操作后将删除缓存的文件。如果已将 flush-content-cache-on-success 属性设为 false,您可以使用以下示例中显示的命令来将该值重置为 true

$ pkg property flush-content-cache-on-success
PROPERTY                       VALUE
flush-content-cache-on-success False
$ pkg set-property flush-content-cache-on-success true
$ pkg property -H flush-content-cache-on-success
flush-content-cache-on-success True

清除内容缓存(将 flush-content-cache-on-success 设置为 true)后,某些 pkg 操作可能需要花费更长的时间才能完成。

非全局区域具有不同的缓存,可使用 /usr/lib/pkg.sysrepo-c 选项来设置该缓存。您可以使用 -s 选项设置该缓存的最大大小。请参见 pkg.sysrepo(1M) 手册页。

提升软件包安装操作的性能

以下步骤有助于提升软件包安装和更新操作的性能: