Чтобы избежать проблемы XY, позвольте мне сначала описать ситуацию.
У нас есть клиентский проект с уникальными обстоятельствами. У нас есть относительно современный программный стек (материал Keras DNN), который необходимо запускать в системе клиента. Эта система, кластер Cloudera CentOS 6, находящаяся в производстве, закрыта для обеспечения безопасности. Мы не можем гарантировать, что эту вещь когда-либо видели в Интернете.
Мы разработали сценарий bash, который устанавливает необходимые пакеты с диска с помощью RPM, и протестировал его на нашем локальном смоделированном (контейнерном) кластере (YUM не работает, потому что база данных репо не обновлена). После некоторой игры мы смогли запустить Keras без каких-либо пакетов из Интернета.
У клиента настроена собственная виртуализированная система, которая должна быть довольно близка к реальному кластеру (с точки зрения конфигурации). Однако, когда он его запустил, полная катастрофа. Множество ошибок, например:
(для установки 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
В частности, много конфликтов проистекает из
которые все являются суперкритическими библиотеками, и я 1) не могу предположить, что какая-то конкретная версия будет в кластере, и 2) не могу возиться с ними, чтобы одна из них не сломалась.
Я больше занимаюсь машинным обучением, и моих навыков работы с Linux достаточно, чтобы настраивать и обслуживать блоки CUDA и тому подобное, но это становится для меня глубокой водой, поэтому любой ввод, даже простой, приветствуется. Есть ли способ создать отдельную библиотечную среду, в которой мы можем установить необходимые приложения, не нарушая уже существующие? Я знаю chroot
это вещь, но я понятия не имею, как правильно ею владеть.
tl; dr - ад зависимостей от системы с воздушной заслонкой, без возможности удаленного администрирования и корявой старой, плохо обслуживаемой сборки.
Большое спасибо!
Мне очень часто приходится работать в закрытых помещениях.
Лучший подход, который я нашел до сих пор, - это иметь виртуальную машину с ТОЧНО той же средой (т.е. точно такой же версией для всех пакетов, если возможно, с ее установкой в соответствии с тем же процессом, что и для производственной среды) - предоставьте этой виртуальной машине доступ в Интернет и используйте соответствующий менеджер пакетов, чтобы ЗАГРУЗИТЬ ТОЛЬКО все необходимые пакеты.
Чтобы загружать только пакеты, а не устанавливать их, я использую:
yum install --downloadonly <requiredpackage>
Это работает из коробки, по крайней мере, с CentOS 6 - в другом дистрибутиве на основе RPM вам может потребоваться установить yum-downloadonly пакет, так как эта функциональность предоставляется подключаемым модулем yum.
Затем я архивирую все загруженные пакеты в файл .tar.gz, передаю этот архив в производственную систему, распаковываю во временный каталог и устанавливаю пакеты, используя:
rpm -i <directory>/*.rpm
Также важно использовать точечные выпуски вместо только основной версии CentOS или переменной «$ releaseversion» в файлах конфигурации /etc/yum.repos.d/*.repo, поскольку репозитории с основной версией со временем обновляются. Этот точечный выпуск должен соответствовать установленной версии на виртуальной машине, используемой для загрузки, и в системе с удаленным доступом.
Например, используйте:
http://mirror.centos.org/centos/7.7.1908/os/x86_64/
вместо того
http://mirror.centos.org/centos/7/os/x86_64/
поскольку последний будет иметь обновления пакетов до тех пор, пока CentOS 7 не перестанет обслуживаться (30 ноября 2020 г. - согласно FAQ по CentOS).
Из приведенного вами описания кажется, что упомянутая вами виртуальная машина каким-то образом была обновлена из репозиториев CentOS, поэтому у вас возникли конфликты зависимостей версий.
Надеюсь это поможет.