Как запускать программы, созданные для другой версии базовой библиотеки? - PullRequest
0 голосов
/ 27 января 2020

Система busybox поставляется с командой rpm на glib c -2.24. Как программы из Fedora Core (F C) и / или более поздних версий могут быть запущены в этой системе?

Я понял, что FC25 поставляется с той же версией glib c. Если я загружаю пакеты FC25 rpm и устанавливаю их, иногда они просто запускаются. Некоторые другие потерпят неудачу. Я хотел бы запустить FC30 или другие версии тоже.

Проблема заключается в том, что пакеты F C перезаписывают существующие библиотеки в том же каталоге. Я решил запустить bash, вам нужно только установить bash, glibc, glibc-common, ncurses-base, ncurses-libs, libgcc. Bash запускается после установки этих пакетов. Поскольку это небольшое количество библиотек, установка их с версиями F C должна привести к незначительным различиям, которые не влияют на bash. Но незначительное различие может повлиять на другие программы, или установка большего количества пакетов может привести к большему количеству различий, что повлияет на большее количество программ.

Как это можно решить?

Я читал о linux пространствах имен. Таким образом, один из путей для начала - создать пространство имен, чтобы изолировать файловые системы хоста. Я попытался создать файловую систему пространства имен:

cd /root
mkdir root-fc30
cd root-fc30
mkdir dev proc tmp var
cp -a /bin /sbin /lib /usr ./
mount -o bind /proc proc
mount -o bind /dev dev
mkdir root-old

Затем попал в пространство имен:

unshare -m --propagation slave
pivot_root . root-old

После этого можно устанавливать новые пакеты. Но все равно он перезапишет существующие библиотеки. Как можно предпринять дальнейшие шаги для решения этой проблемы в изолированном пространстве имен?

Какие еще чистые решения существуют?

1 Ответ

0 голосов
/ 30 января 2020

Более простой ответ - использовать соответствующий ld-linux.so для запуска соответствующего приложения и указать PATH и LD_LIBRARY_PATH соответственно. ld-linux.so обычно указывает на файл .so загрузчика solid dynamici c.


В качестве примера, продолжайте использовать пространство имен в моем вопросе выше, чтобы проиллюстрировать, как это будет работать:

При просмотре в пространстве имен мы сохраним двоичные файлы для старых system в каталоге /opt и установите все новое для системы FC30 в обычный root.

Измените приведенную выше команду копирования cp -a /bin /sbin /lib /usr ./ на:

mkdir opt
cp -a /bin /sbin /lib /usr ./opt/

Внутри пространства имен все бинарные файлы старой версии по-прежнему доступны, добавив измененные PATH и LD_LIBRARY_PATH, и ld-*.so.

Первый шаг - запустить оболочку, используя старую версию в пространстве имен:

LD_LIBRARY_PATH=/opt/lib:/opt/usr/lib PATH=/opt/bin:/opt/sbin:/opt/usr/bin:/opt/usr/sbin \
/opt/lib/ld-2.24.so /opt/bin/sh

В этой используемой оболочке установите пакеты для bash для запуска для версии FC25:

/opt/lib/ld-2.24.so /opt/bin/rpm -i bash-4.3.43-4.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i file-5.28-4.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i file-libs-5.28-4.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i glibc-2.24-10.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i glibc-common-2.24-10.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i ncurses-base-6.0-6.20160709.fc25.noarch.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i ncurses-libs-6.0-6.20160709.fc25.armv7hl.rpm
/opt/lib/ld-2.24.so /opt/bin/rpm -i libgcc-6.4.1-1.fc25.armv7hl.rpm

После установки этих пакетов версию FC25 bash можно нормально использовать после следующей команды:

LD_LIBRARY_PATH=/lib:/usr/lib PATH=/bin:/sbin:/usr/bin:/usr/sbin /usr/bin/bash

Процедура установки двоичных файлов FC30 и других пакетов одинакова , После установки достаточного количества пакетов инструментов можно использовать инструменты версии F C для установки большего количества пакетов. Старая версия под /opt в пространстве имен может быть удалена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...