在没有互联网的系统上安装RPM导致依赖冲突:libstdc ++。so.6,libm等

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

我们有一个独特情况的客户项目。 我们有一个相对现代的软件栈(Keras DNN的东西),需要在客户端的系统上运行。 该系统是一个Cloudera CentOS 6集群,用于安全生产。 我们无法保证这件事曾经见过networking。

我们开发了一个bash脚本,它使用RPM从磁盘安装必要的软件包,并在我们的本地模拟(容器化)集群上进行testing(因为repo数据库不是最新的,所以YUM失败)。 经过一番捣鼓之后,我们能够让Keras运行起来,而不需要像从互联网上的数据包那样运行。

客户端有自己的虚拟化系统,它应该和实际的集群非常接近(就configuration而言)。 但是,当他运行它时,总是发生巨大的灾难。 很多错误,如:

(用于通过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安装glibc-common-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

 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

 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所需要的最常见的错误,但我们也看到类似的

 openssl < 1:1.0.1-0.3.beta3 is obsoleted by (installed) openssl-libs-1:1.0.1e-42.el4.9x86_64 

 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

这些都是超级关键的库,我不能假设任何特定的版本将在群集上,并且2)不能在附近徘徊,以免其中一个破坏。

我更像是一个机器学习CS,我的linux技能足以为CUDA设置和服务,但这对我来说是深层次的,所以任何input,甚至简单的东西,都是值得赞赏的。 有什么办法可以创build一个独立的图书馆环境,我们可以在不影响已经存在的环境的情况下安装必要的环境? 我知道chroot是一件事情,但我不知道如何正确地使用它。

tl; dr – 依赖地狱,在没有远程pipe理能力的空调系统和一个老旧,维护不佳的构build中。

非常感谢!

我必须经常在气密的环境中工作。

到目前为止,我发现的最好的方法是拥有一个完全相同环境的虚拟机(即所有软件包的版本完全相同,如果可能的话,在生产环境使用相同的过程之后安装) – 给这个VM互联网访问,并使用适当的软件包pipe理器来只下载所有必需的软件包。

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

 yum install --downloadonly <requiredpackage> 

这至less可以在CentOS 6中使用 – 在其他基于RPM的发行版中,您可能需要安装yum-downloadonly软件包,因为此function是由yum插件提供的。

然后,将所有下载的软件包归档到.tar.gz文件中,将该归档文件传输到生产系统,在临时目录中解压并使用以下命令安装软件包:

 rpm -i <directory>/*.rpm 

从你所做的描述看来,你提到的虚拟机似乎已经从CentOS仓库更新了一些,所以你有一些版本依赖冲突。

希望这可以帮助。