Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: minghuaОтветов: 1

Система 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

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

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

  • Просто используйте docker. Или другая контейнерная техника. Они существуют только для того, чтобы решить эту проблему. KamilCuk 27.01.2020
  • Как установить пакет хоста докеров в системе busybox? Или вы можете указать на любую другую контейнерную технологию, с которой легко начать работу в системе busybox? minghua 28.01.2020
  • Извините, сэр, я действительно не понимаю, что такое система 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 тогда. KamilCuk 28.01.2020
  • Ты на правильном пути. Я думаю о том же, но я хотел бы сначала выяснить, как загрузить базовую фетровую шляпу в систему. Чтобы загрузить базовую Fedora, мне нужно запустить программы для другой glibc и другой версии lib. busybox - это очень простой sh/coreutils/etc для встраиваемых систем, обычно использующий sysv init для запуска системы. на очень ограниченном аппаратном ресурсе. minghua 28.01.2020
  • Вы просто ищете fedora chroot download и находите; ) Или ищите что-то вроде fedora chroot installation. Похоже вы можете загружать и распаковывать образы докеров даже KamilCuk 28.01.2020
  • Спасибо, что посмотрели и поделились ссылкой. Я видел это еще несколько дней назад. Изображение такое же, как я позже нашел на официальной ссылке Fedora на Docker Hub. Но я не понимал, что это может быть использовано. Да, это будет одно из решений, которое я собираюсь попробовать. Не могли бы вы поместить свои комментарии в ответ? minghua 28.01.2020

bashloaderrpmbusyboxlinux-namespaces

Ответы

Ответ 1 · рейтинг 1 · minghua

Более простой ответ - использовать соответствующий 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 в пространстве имен можно удалить.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы