我正在运行 Solaris 11.3(目前来自非合同版本存储库)。我拥有大量 Solaris 10 经验,但我对 11 还不熟悉,并且仍在努力熟悉 IPS。
我的问题是,我经常发现我在诊断软件包依赖性故障时遇到了严重的问题,因为 的输出pkg install
似乎与实际问题无关。事实上,我现在想知道这是否是由某些错误或存储库问题引起的,我将在最后解释。
下面是我最近遇到的两个问题的例子,其中失败命令的输出pkg
似乎与实际问题完全无关。在第一个例子中,这导致我花了好几天的时间寻找干扰因素,直到我最终偶然发现了所需的修复方法。
全球版本是 Oracle Solaris 11.3.1.5.1(pkg/entire
版本0.5.11-0.175.3.1.0.5.1
)。全球版本是从 USB 文本安装程序安装的,从那时起,我已经解锁了版本,并更新了全球版本中默认安装的所有 FOSS 软件包(根据Oracle 文档在这里),并另外安装了一些额外的支持包(vim
、、、等等) screen
tmux
在撰写本文时,我从新安装的区域的位置重新创建了这两个示例solaris-small-server
,没有其他更改;我上面描述的 FOSS 更新仅发生在全局,而不是在用于重新运行以下示例并捕获错误输出的区域中。下面列出的命令实际上是从默认区域 AI 清单创建测试区域后在测试区域中运行的第一个命令。
示例 1:我一直尝试在非全局区域中安装可运行的 Gnome 桌面,而不必在我的全局区域中安装软件包,因为我一直希望保持全局区域的精简和整洁。
zlogin zone pkg install --accept -v solaris-desktop
:失败,因为driver/audio/audio-usb
它还必须安装在全局区域中。- 我创建了一个自定义版本的
solaris-desktop
calledsolaris-desktop-zone
,它会删除所有driver/*
包,以及任何依赖于全局的包(我通过调用pkg contents -mr
每个包的脚本删除了它,并删除了任何引用的包feature/package/dependency/self
)。我将它安装到我的本地仓库,它是pkg/mirror
的克隆http://pkg.oracle.com/solaris/release/
。 - 安装我修改后的软件包会导致显示一长串依赖失败在这个 pastebin 中,它们似乎主要与 Python 包相关。
- 我花了整整一天时间来解决这些错误:手动递归分析各种 Python 包及其依赖项,并删除我在包中找到的所有提及它们的条目
solaris-desktop-zone
。最后,我只能批量删除包,直到找到一个可以通过 Solver 阶段的版本,然后从那里开始反向工作,以识别一个包并最终了解原因。
解决方案是什么? x11/server/xorg/driver/xorg-video
它依赖于 NVidia 驱动程序,而该驱动程序也具有feature/package/dependency/self
依赖关系。事后看来,我可以通过递归搜索该自依赖关系更快地找到它 - 即不仅检查我的solaris-desktop-zone
软件包所依赖的所有软件包,还检查所有他们的依赖关系。但我当然陷入了困境,从错误中我相信问题与 Python 包或依赖于它们的包有关。
示例 2:gcc-5
zlogin testdesktop pkg install --accept -nv gcc-5
生产此输出。
再次出现同样的奇怪的 Python 错误列表,并且解决方案再次完全不相关:我需要解锁一些与 GCC 相关的版本:
pkg change-facet version-lock.system/library/gcc/gcc-c-runtime=false \
version-lock.system/library/gcc/gcc-c++-runtime=false \
version-lock.system/library/gcc/gcc-gfortran-runtime=false \
version-lock.system/library/gcc/gcc-gobjc-runtime=false
幸亏我通过 Google 很快找到了这个(在 Unix StackExchange 上)。但我仍然感到困惑,因为回答者描述的诊断与我所见的不符 - 他的帖子中列出的 pkg 错误对问题进行了可理解的描述(Reason: This version is excluded by installed incorporation..
)。我的又出现了这些不相关的 Python 错误!
现在,当我写这篇文章时,我想知道 Solaris 11.3 发行版存储库中是否出现了一些奇怪的问题,也许是由 SRU 修复的,我只有在获得合同后才能访问。也许这就是为什么我收到这些奇怪的错误而不是可理解、可调试的错误?
在这方面,我确实注意到可能存在与 Dbus Python 相关的错误 - 我在两个示例中看到的错误之一与有关python-dbus-27
,我注意到它现在是一个过时的包,仅包含对的依赖项dbus-python-27
。但dbus-python-27
在存储库中不存在。所以这可能是存储库问题。
但即使如此,为什么我只有在遇到其他完全不相关的问题时才会看到这些错误?这是由 repo 问题导致的错误吗?
我将非常感激能够确认是否确实如此,并且希望了解更多有关调试和解决包依赖性问题的建议方法和工具。考虑到我遇到的错误,我是否可以更快地解决这个问题,而无需对每个依赖包进行强力检查?
提前致谢。
答案1
首先,如果软件包安装在非全局区域中,某些配置需要将其安装到全局区域中。这是通过使用“父”依赖项来实现的,正如我在另一条回复中提到的那样:Solaris 11.3 非全局区域不继承 IPS 方面更改(至版本锁定)
对于 solaris-desktop 包的依赖项来说,这通常是正确的,因为它依赖于只有全局区域才能运行的服务(因为只有全局区域才具有实际内核),例如驱动程序、NFS 或其他特定服务。
“找不到版本”错误是相当字面意思;它基本上意味着配置存储库中没有满足包依赖关系的版本。
不幸的是,您似乎发现部分评估包存在问题。您没有做错什么,只是现在无法使用。必须先在内部修复这个问题。
我认为没有人测试过基本 11.3 版本与评估包的组合,并尝试同时安装“solaris-desktop”。这将需要一些时间来解决,所以请耐心等待。
与此同时,如果你想要一个桌面配置的系统,你最好的选择是不是尝试使用评估包,首先在全局区域中安装 solaris-desktop,然后再在非全局区域中安装。这是迄今为止最简单的选择。
目前解决这个问题的唯一方法是修改并重新发布给您带来问题的软件包,但我目前无法指导您完成这个过程。简而言之,这需要对要修改的每个软件包使用 pkgrecv --raw,然后使用 pkgsend 将每个软件包重新发布到您自己的本地存储库。