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

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

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

Проблема возникает из-за того, что пакеты FC перезаписывают существующие библиотеки в том же каталоге. Я придумал запустить bash, нужно только установить bash, glibc, glibc-common, ncurses-base, ncurses-libs, libgcc. Bash будет запускаться после установки этих пакетов. Поскольку это небольшое количество библиотек, их установка с версиями FC должна привести к незначительным различиям, которые не влияют на 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

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

Какие другие более чистые решения существуют?


person minghua    schedule 27.01.2020    source источник
comment
Просто используйте docker. Или другая контейнерная техника. Они существуют только для того, чтобы решить эту проблему.   -  person KamilCuk    schedule 27.01.2020
comment
Как установить пакет хоста докеров в системе busybox? Или вы можете указать на любую другую контейнерную технологию, с которой легко начать работу в системе busybox?   -  person minghua    schedule 28.01.2020
comment
Извините, сэр, я действительно не понимаю, что такое система busybox? Вы сами компилировали все свои программы? Есть ли у вас стартап-менеджер? Pivot_root изменяет текущий корневой каталог процесса. До docker дней люди использовали chroot - весь дистрибутив был установлен/скопирован в каталог. Затем вы for i in sys proc dev; do mount -o bind /$i /dir_with_fedora/$i; done монтируете необходимые файловые системы и просто chroot /dir_with_fedora запускаете оболочку. Docker просто автоматизирует это (и многое другое). Я думаю, вы можете просто прочитать о chroot тогда.   -  person KamilCuk    schedule 28.01.2020
comment
Ты на правильном пути. Я думаю о том же, но я хотел бы сначала выяснить, как загрузить базовую фетровую шляпу в систему. Чтобы загрузить базовую Fedora, мне нужно запустить программы для другой glibc и другой версии lib. busybox — это очень простой sh/coreutils/etc для встраиваемых систем, обычно использующий sysv init для запуска системы. на очень ограниченном аппаратном ресурсе.   -  person minghua    schedule 28.01.2020
comment
Вы просто ищете fedora chroot download и находите; ) Или ищите что-то вроде fedora chroot installation. Похоже вы можете загружать и распаковывать образы докеров даже   -  person KamilCuk    schedule 28.01.2020
comment
Спасибо, что посмотрели и поделились ссылкой. Я видел это еще несколько дней назад. Изображение такое же, как я позже нашел на официальной ссылке Fedora на Docker Hub. Но я не понимал, что это может быть использовано. Да, это будет одно из решений, которое я собираюсь попробовать. Не могли бы вы поместить свои комментарии в ответ?   -  person minghua    schedule 28.01.2020


Ответы (1)


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


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

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

Измените приведенную выше команду копирования 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

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

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

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

person minghua    schedule 30.01.2020
comment
Chroot немного проще с командой, которая должна быть chroot /opt /lib/ld-2.24.so /bin/sh. - person minghua; 01.03.2020