Intereting Posts
урожай и конвертирование в pdf добавляет нежелательную маржу sed регулярное выражение ведет себя иначе, чем в vim и perl? В чем проблема, из-за которой debian зависает в fsck / dev / sda? Каково решение? Как определить, имеет ли процессор 64 или 32 бит? Почему восклицательный знак `!` Иногда расстраивает bash? Отключить автозаполнение Bash только для определенной команды Невозможно выполнить загрузку с помощью встроенного ядра Понимание sshfs и umask Связь между системными вызовами и командами оболочки / утилитами Как разрешить ошибку «mount.nfs: доступ запрещен сервером» Причина, по которой изменился бы ключ RS RS-ов? как устранить неполадки в том, действительно ли файловая система была размонтирована или нет.? Почему Linux использует интерфейс символьного устройства для / dev / mem? Включить ssh root login Использование sed для удаления строки из списка файлов не выполняется

Как chroot предоставить новую версию glibc для приложения?

Я пытаюсь запустить программу, но когда я ее выполню, появляется следующая ошибка:

./app: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./app) 

Сначала я читал, чтобы вручную обновлять glibc но это кажется слишком рискованным для такого продвинутого пользователя, как я. Один мой друг рассказал мне о chroot но я не уверен в шагах, за которыми я должен следовать. Может кто-нибудь мне помочь ?

Информация о моей системе:

 uname -a:Linux hostName 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux Distro: Crunchbang 11 (Waldorf) ldd --version: ldd (Debian EGLIBC 2.13-38+deb7u8) 2.13 ldd ./app: linux-vdso.so.1 => (0x00007ffdd593d000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007febe6450000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007febe623a000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007febe5eae000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007febe5c2c000) /lib64/ld-linux-x86-64.so.2 (0x00007febe677a000) 

Сначала вам нужно понять, что если вы получите такое сообщение, приложение, которое вы пытаетесь запустить, не предназначено для этой платформы / распространения. Таким образом, очень вероятно, что он потерпит крах самым болезненным способом, взяв все ваши файлы, деньги и дом 🙂

В частности, это связано с (g) libc, поскольку оно тесно затягивается с ядром ABI, а работа с glibc, скомпилированным для другой версии ABI, является рискованной. Именно по этой причине в библиотечном управлении версиями.

Если после всех этих предупреждений вы по-прежнему хотите попробовать, вы можете использовать в порядке сложности следующее:

  1. Распакуйте соответствующую библиотеку в тот же каталог, где ваше приложение (или любой другой выдающийся каталог) и запустите app например:

     LD_LIBRARY_PATH=. ./app 

Вы можете проверить правильную библиотеку, забрав ее с помощью LD_LIBRARY_PATH=. ldd ./app LD_LIBRARY_PATH=. ldd ./app . Помните, что это не будет работать для приложений root и suid.

  1. На самом деле вы можете попробовать создать chrooted среду для приложения. Имейте в виду, что chroot вызов сбрасывает местоположение корневого каталога (/) для приложения, которое работает под ним. На практике это означает, что вам необходимо предоставить не только заменяющую библиотеку glibc , но и ВСЕ библиотеки, которые используются вашим приложением и библиотеками, которые используются этими библиотеками и т. Д., Пока у вас не будет всего, что создало бы самодостаточную среду. Это также подразумевает наличие, по крайней мере, /dev/null , /dev/stdin , /dev/stdout и /dev/log устройств, а также /etc/passwd и /etc/group . Хорошим примером такой среды на Debian является postfix установка (check /var/spool/postfix/ ). Сама команда запуска была бы простой:

     chroot /home/of/chrooted/app ./app 
  2. Лучшим и простым способом было бы использование docker и соответствующего изображения, подходящего для вашего приложения. Установка docker – целая огромная тема сама по себе, вы можете начать с руководства по установке Docker . Одно предварительное требование для него, хотя ядро ​​Linux больше 3,8+. Помимо этого ограничения, это лучший способ запустить приложение, требующее установки разных дистрибутивов / библиотек.

Также проверьте, как запускать новое программное обеспечение без обновления GLIBC?

Облегченная среда, в которой вы устанавливаете дистрибутив с целевым урожаем, – это решение с наименьшими затратами. Это обойдется вам в пару ГБ дискового пространства, но это довольно безболезненно, особенно в Debian и деривативах, где schroot выполняет работу по созданию полезной среды chroot, а Debootstrap может установить более старую или более новую версию Debian или Ubuntu в это chroot окружающая среда. См. Как запустить 32-разрядные программы на 64-разрядном Debian / Ubuntu? для учебника для шротов + debootstrap. Для GLIBC 2.14 вы можете выбрать jessie (Debian) или precise или trusty (Ubuntu) в качестве выпуска для установки с помощью debootstrap.

Если вы используете стандартную настройку schroot, вы запускаете что-то вроде

 schroot -c jessie ./app 

Ваш домашний каталог автоматически доступен по тому же пути в chroot. Пока приложение устанавливается под вашим домашним каталогом и вам нужно только получить доступ к другим файлам в вашем домашнем каталоге или программном обеспечении, которые существуют внутри chroot, вы все настроены.