首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在没有internet的系统上安装RPM会导致依赖冲突: libstdc++.so.6、libm等。

在没有internet的系统上安装RPM会导致依赖冲突: libstdc++.so.6、libm等。
EN

Server Fault用户
提问于 2017-04-24 14:02:01
回答 1查看 1.2K关注 0票数 0

为了避免XY问题,让我首先描述一下情况。

我们有一个特殊情况的客户项目。我们有一个相对现代化的软件栈(Keras ),需要在客户端的系统上运行。该系统是生产中的Cloudera CentOS 6集群,为了安全起见,将其空置。我们不能保证这东西曾经看过互联网,从来没有。

我们开发了一个bash脚本,它使用RPM从磁盘安装必需的包,并在本地模拟(容器化)集群上进行测试(YUM失败了,因为回购数据库不是最新的)。经过一些摆弄之后,我们能够让Keras在没有来自互联网的数据包的情况下运行。

客户端有自己的虚拟系统设置,应该与实际集群非常接近(就配置而言)。然而,当他运行它的时候,完全是一场灾难。许多错误,如:

(用于安装glibc-公共-2.12和朋友通过sudo rpm -Uvh glibc-common-2.12-1.209.el6_9.1.x86_64.rpm glibc-2.12-1.209.el6_9.1.x86_64.rpm glibc-headers-2.12-1.209.el6_9.1.x86_64.rpm glibc-devel-2.12-1.209.el6_9.1.x86_64.rpm )

代码语言:javascript
复制
warning: ./rpm/glibc-common-2.12-1.209.el6_9.1.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
error: Failed dependencies
    tzdata >= 2015g-4 is needed by glibc-common-2.12-1.209.el6_9.1.x86_64.rpm
    libc.so.6(GLIBC_2.13)(64bit) is needed by (installed) util-linux-2.23.2-26.el7.x86_64
    libc.so.6(GLIBC_2.13)(64bit) is needed by (installed) systemd-219-19.el7.x86_64
    ...(more of the same)...
    libc.so.6(GLIBC_2.13)(64bit) is needed by (installed) xz-libs-5.1.2-12alpha.el17.x86_64

(或运行命令:sudo rpm -Uvh gcc-c++-4.4.7-18.el6.x86_64.rpm gcc-4.4.7-18.el6.x86_64.rpm libstdc++-4.4.7-18.el6.x86_64.rpm libstdc++-devel-4.4.7-18.el6.x86_64.rpm )

代码语言:javascript
复制
libstdc++.so.6(GLIBCXX_3.4.15)(64bit) is needed by (installed) {name of a package}
libstdc++.so.6(GLIBCXX_3.4.15)(64bit) is needed by (installed) {name of another package}
...

X是Y需要的最常见的错误,但我们也看到了类似的错误

代码语言:javascript
复制
openssl < 1:1.0.1-0.3.beta3 is obsoleted by (installed) openssl-libs-1:1.0.1e-42.el4.9x86_64

代码语言:javascript
复制
file /etc/rpm/macros.ghc-srpm from install of epel-release-6-8.noarch conflicts with file from package redhad-rpm-config-9.1.0-68.el7.centos.noarch

特别是,很多冲突都源于

  • libc.so.6
  • libm.so.6
  • libgmp.so.3
  • libmpfr.so.4
  • libstdc++.so.6
  • libffi.so.6

它们都是超级关键的库,I( 1)不能假设集群上有任何特定的版本,而2)不能随意使用,以免其中一个中断。

我更像一个机器学习CS,我的linux技能足以建立和服务CUDA盒之类的,但是这对我来说已经是一个很深的过程了,所以任何的输入,甚至简单的东西,都是值得赞赏的。有没有办法创建一个单独的库环境,这样我们就可以安装必要的deps而不打扰已经存在的deps了?我知道chroot是一件事,但我不知道如何正确地运用它。

tl;dr依赖于一个空隙系统,没有远程管理能力,并且是一个陈旧的、维护不善的构建.

非常感谢!

EN

回答 1

Server Fault用户

发布于 2017-04-24 15:38:42

我经常在空隙环境中工作。

到目前为止,我发现的最佳方法是拥有一个具有完全相同环境的虚拟机(即所有包的版本完全相同,如果可能的话,按照生产环境使用的相同过程安装它)--允许VM internet访问,并使用适当的包管理器只下载所有必需的包。

要只下载软件包而不安装它们,我使用:

代码语言:javascript
复制
yum install --downloadonly <requiredpackage>

这是开箱即用的,至少与CentOS 6-在其他基于RPM的发行版中,您可能需要安装yum下载包,因为这个功能是由yum插件提供的。

然后,我将所有下载的包存档在一个.tar.gz文件中,将这些包传输到生产系统,在临时目录中解压缩,然后使用以下方法安装包:

代码语言:javascript
复制
rpm -i <directory>/*.rpm

在/etc/yum.d/*..repo配置文件中使用点版本而不是只使用主要的CentOS版本或"$releaseversion“变量也很重要,因为主版本的存储库会随着时间的推移得到更新。此版本应与用于下载的VM上的安装版本和空隙系统上的版本相匹配。

例如,使用:

代码语言:javascript
复制
http://mirror.centos.org/centos/7.7.1908/os/x86_64/

而不是

代码语言:javascript
复制
http://mirror.centos.org/centos/7/os/x86_64/

由于后者将进行包更新,直到CentOS 7达到其维护结束(据CentOS常见问题称,2020年11月30日)。

从您所做的描述来看,您提到的虚拟机似乎已经从CentOS存储库中得到了某种程度的更新,因此您有一些版本依赖冲突。

希望这能有所帮助。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/846238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档