Меню Рубрики

Установка 32 битных библиотек debian

Блог начинающего сисадмина

Здесь уже не будет ничего нового интересного, лучше загляните сюда: https://medium.com/@Amet13

понедельник, 16 апреля 2018 г.

Как запускать 32-битные программы на 64-битном дистрибутиве Linux

На сегодняшний день все выпускаемые процессоры так или иначе поддерживают 64-битную архитектуру. В связи с тем, что 32-битные процессоры могут адресовать 232 бита данных, они не могут работать с памятью более 4 Гб, однако процессоры на архитектуре x86-64, могут работать с гораздо более большим объемом памяти. Отличительными особенностями новых процессоров является поддержка 64-битных регистров общего назначения (РОН), арифметических и логических операций над целыми числами и поддержкой 64-битных виртуальных адресов.

В GNU Linux для того чтобы узнать разрядность процессора, существует команда lscpu :
$ lscpu | grep Architecture
Architecture: x86_64

Поле Architecture отображает разрядность процессора ( x86_64 ), в случае 32-битного процессора значение этого поля было бы i686 ( i386 ).
Для того, чтобы узнать разрядность операционной системы, существует команда arch :
$ arch
x86_64

В довольно редких случае необходимо запускать программы, написанные под 32х-битную ОС когда-то давно на новых операционных системах. Существует несколько способов запуска 32-битных программ на 64-битной системе:
— с использованием нативной поддержки (multiarch)
— с использованием технологий ядра Linux: chroot, Docker, OpenVZ
— с использованием виртуальных машин

Multiarch

В то время, как 64-битные программы не могут работать в 32-битных операционных системах, 32-битные программы могут работать в 64-битных операционных системах, однако они нуждаются в соответствующих 32-битных библиотеках. Со времен появления дистрибутивов Ubuntu 11.04 (Natty) и Debian 7.0 (Wheezy) было объявлено о поддержке multiarch, где 32-битные и 64-битные библиотеки могут сосуществовать вместе в одной системе. Пакет под названием ia32-libs включает в себя множество версий разделяемых библиотек.
Пример установки 32-битной программы в Debian/Ubuntu:
# dpkg —add-architecture i386
# apt update
# apt install -y ia32-libs
# apt install package-name:i386

chroot

С помощью технологии chroot, поддержку которой имеет ядро Linux, возможно организовать запуск 32-битных программ в изолированном окружении (песочнице) в уже имеющейся 64-битной операционной системе. Идея состоит в том, чтобы установить необходимое окружение в поддереве каталогов и запустить приложения из под него. В основном chroot используется для тестирования различных приложений, в том числе для 32- и 64-битных архитектур.
Команда chroot и одноименный системный вызов запускают процессы, с учетом того, что на самом деле запускаемое окружение является всего лишь системным подкаталогом.

Для организации удобного управления подобным окружением существует утилита schroot :
# apt update
# apt install -y schroot debootstrap dbus

Утилита debootstrap позволяет установить базовую систему Debian в необходимый подкаталог. Пакет dbus позволяет некоторым приложениям в операционной системе общаться друг с другом.

Пример установки 32-битного окружения в chroot:
# mkdir /chroot
# debootstrap —arch=i386 stable /chroot http://deb.debian.org/debian/

После создания окружения, создаем конфигурационный файл для его запуска:
# vim /etc/schroot/chroot.d/test
[test]
description=Installing 32-bit env
aliases=test
type=directory
directory=/chroot
users=root
root-groups=root
profile=desktop
personality=linux
preserve-environment=true

Заходим в окружение chroot:
# schroot -c test
(test)[email protected]:

После этого можно устанавливать необходимые программы в данное окружение chroot.

Технология chroot является полезной, однако распространение таких технологий как OpenVZ и Docker позволяют не только изолировать окружения в каталогах, но и изолировать ресурсы для каждого контейнера. В данный момент множество людей во всем мире использую Docker для запуска множества контейнеров, в основном для тестирования различных версий ПО.

К примеру команда:
# docker run -i -t ubuntu:12.04 /bin/bash
запускает контейнер с операционной системой Ubuntu 12.04.

Аналогично для OpenVZ 7:
# prlctl create ct1 —ostemplate debian-8.0-x86_64 —vmtype=ct

У Docker и OpenVZ есть один недостаток, так как это технология виртуализации уровня операционной системы, то он может запускать только приложения, поддерживающие ядро хост-системы. Например Вы не сможете запустить Windows или FreeBSD на ядре Linux.

KVM / VirtualBox / Hyper-V / ESXi

Для того, чтобы запустить любые операционные системы существуют технологии полной виртуализации, такие как KVM, VirtualBox и другие. С помощью KVM можно запускать любую x64-совместимую операционную систему поверх Linux, поэтому любую 32-битную систему можно установить в гостевую виртуальную машину без использования multiarch, chroot и Docker, достаточно лишь скачать необходимый образ операционной системы и установить ее на виртуальную машину.

Пример установки дистрибутива Linux Mint в виртуальную машину KVM.
Создадим виртуальный жесткий диск размером 10 Гб:
$ dd if=/dev/zero of=/vdisk_qemu bs=10000000 count=1000

Запуск виртуальной машины:
$ kvm -k ru -cdrom /linuxmint-32bit.iso -hda /vdisk_qemu -m 1024 -boot d -name TEST32
где:
-cdrom указывает путь к iso-образу операционной системы
-hda /vdisk_qemu путь к виртуальному жесткому диску
-m 1024 оперативная память указанная в мегабайтах
-boot d порядок загрузки оборудования (с cdrom)
-name TEST32 имя виртуальной машины

Читайте также:  Установка подогревателя на мазда 626

После установки операционной системы, можно отключить виртуальную машину и запустить ее с виртуального жесткого диска.
$ kvm -hda /vdisk_qemu -m 1024

источник

Библиотеки Ubuntu 16.04

Как вы знаете каждая программа, установленная на вашем компьютере, состоит из нескольких частей. Это непосредственно исполняемый файл, который вы запускаете через терминал, а также библиотеки с набором функций, которые может использовать программа.

Все, без исключения, программы используют библиотеки. Даже если это ваша программа и у нее нет своих библиотек, она использует стандартную библиотеку языка программирования С.

В этой статье мы подробно рассмотрим что такое библиотеки Ubuntu, как их устанавливать, где брать и что делать если библиотека установлена, а программа говорит что ее нет. Мы не будем трогать создание библиотек, это совсем не наша тема. Как обычно, начнем с теории.

Что такое библиотеки

Библиотеки в Linux содержат наборы функций или если сказать проще алгоритмов или действий для решения определенных задач. Например, если программе нужно вывести строку на экран она не начинает сама закрашивать нужные пиксели, а просто обращается к отвечающей за это функции из библиотеки, то же самое если программе нужно прочитать содержимое файла, она не работает с секторами жесткого диска, ей достаточно вызвать функцию из стандартной библиотеки с (libc.so) и передать ей в параметрах имя нужного файла, а библиотека уже вернет ей запрашиваемые данные.

На самом деле, такая структура реализации программного обеспечения очень выгодна, поскольку достаточно написать алгоритм лишь один раз и его смогут использовать все программы просто загружая библиотеку.

Не нужно думать что библиотеки есть только в Linux, в Windows они тоже есть, только имеют другой формат и расширение dll. В Linux же все библиотеки находятся в папах /lib/, /usr/lib, /usr/local/lib или для 64 битных систем также появляется папка lib64 во всех этих подкаталогах, для библиотек специфичных для этой архитектуры. Библиотека имеет расширение .so и ее название начинается со слова lib. Например, libfuse.so, libc.so.

Дальше, после расширения файла .so идет номер версии библиотеки. Номер версии меняется всякий раз, когда разработчики вносят в нее изменения ломающие совместимость со всеми рассчитанными на нее программами. В таком случае в системе будут уже две библиотеки и каждая программа будет использовать правильную версию. Например, glibc.so.6 и glibc.so.5.

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

linux-vdso.so.1 (0x00007ffd99167000)
libmount.so.1 => /usr/lib64/libmount.so.1 (0x00007f0f6beb0000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0f6bb08000)
libblkid.so.1 => /usr/lib64/libblkid.so.1 (0x00007f0f6b8c8000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f0f6b6a4000)
/lib64/ld-linux-x86-64.so.2 (0x000055aca8227000)
libuuid.so.1 => /usr/lib64/libuuid.so.1 (0x00007f0f6b49f000)
libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f0f6b238000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0f6b034000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0f6ae17000)

Также эта информация может быть полезна при создании портативных версий программ. А теперь давайте рассмотрим как устанавливаются библиотеки в Ubuntu 16.04.

Установка библиотек в Ubuntu

Обычно, если вы используете менеджер пакетов вашего дистрибутива для установки новых программ, то библиотеки устанавливаются автоматически. Но если вы хотите собрать программу из исходников или запустить 32 битную программу на 64 битной системе могут начаться проблемы. Например, при запуске или компиляции программы вы получаете ошибку:

error while loading shared libraries: xxxx.so.0
cannot open shared object file no such file or directory

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

Как видите, найдено два варианта библиотеки, libfuse2 и libfuse-dev.

Если библиотека нужна обычной программе и ее не нужно собирать из исходников, то будет достаточно установить библиотеку ubuntu без префикса dev. Например:

sudo apt install libfuse2

Если же вам нужно собрать приложение из исходников, то кроме обычной библиотеки понадобятся заголовочные файлы, в которых содержится описание реализованных в библиотеке функций. Такие пакеты имеют приставку dev, например, libfuse-dev, тогда нужно устанавливать этот пакет, а он уже в зависимостях потянет и обычную библиотеку, если она еще не установлена:

sudo apt install libfuse-dev

Много проблем может вызвать ситуация, когда вам нужно запустить 32 битную программу в 64 битной системе. Например, если вы установили 64 битную версию библиотеки, а программа все равно говорит о том, что не может ее найти, возможно это 32 битная программа и ей необходима именно 32 библиотека. Если программа не устанавливается с помощью пакетного менеджера, вам тоже придется устанавливать библиотеки вручную.

Посмотреть разрядность бинарника можно с помощью утилиты file:

На скриншоте показаны два варианта вывода программы, для 32 бит, в нашем случае Skype и для 64 — mount.

Читайте также:  Установка подлокотников на иномарки

Для того чтобы установить библиотеку Ubuntu с архитектурой i386 сначала необходимо добавить поддержку архитектуры i386 в dpkg:

sudo dpkg —add-architecture i386

Затем обновляем наши репозитории:

А во время установки нужной вам библиотеки теперь необходимо указать архитектуру через двоеточие после имени пакета:

sudo apt install libfuse-dev:i386

Если вы уверенны, что библиотека установлена, но программа все равно говорит, что такой библиотеки нет, то возможно, ей просто нужна другая версия библиотеки. Например, в системе есть libudev.so.0, а программе нужна libudev.so.0.1. Такое случается, если вы попытаетесь установить пакет для другого дистрибутива, особенно в Red Hat системах. Если в репозиториях нет нужной версии библиотеки, то скорее всего, они одинаковы, и можно просто создать символическую ссылку:

ln -s /lib/libudev.so.0 /lib/libudev.so.0.1

Затем программа найдет нужную библиотеку.

Управление библиотеками в Linux

Установка библиотек ubuntu уже рассмотрена, но хотелось бы упомянуть еще пару моментов. Как я сказал, библиотеки ubuntu размещаются в определенных каталогах, но расположение библиотек можно настроить.

Перед тем как библиотека будет подключена к программе, ее должна найти в системе специальная программа — менеджер библиотек. Он берет адреса библиотек из файла /etc/ld.cache, а этот файл формируется утилитой ldconfig, на основе файлов конфигурации /etc/ld.so.conf.

В этом файле перечислены все пути к библиотекам. Если вы хотите добавить свою папку для библиотек просто добавьте ее в этот файл:

Затем обновите кэш просто выполнив:

Теперь ваша библиотека может быть загружена программой, например, вы можете добавить путь /opt/lib или даже /home/user/lib. И система будет нормально грузить оттуда библиотеки.

Посмотреть какие библиотеки находятся в кеше ld.cache можно командой:

Также мы можем проверить находится ли там определенная библиотека:

Еще один способ указать программе где нужно искать библиотеки — это переменная LD_LIBRARY_PATH. Например:

Теперь программы, запускаемые в этом терминале, кроме стандартных путей поиска библиотек, будут использовать и указанную папку.

Выводы

Вот и все. Теперь вы знаете как работают библиотеки Ubuntu, как выполняется установка библиотек Ubuntu и делать так, чтобы программа видела нужную ей библиотеку. У новичков это может вызвать очень много головной боли, но теперь вы знаете что делать и избежите многих ошибок. Если у вас остались вопросы, пишите в комментариях!

источник

Используем 32битные библиотеки в 64битных программах

Можно ли использовать 32битные библиотеки в 64битных программах? Скорее нет. А если очень нужно? Тогда скорее да!

Для одного проекта мне нужно работать с 32битными проприетарными библиотеками. Под виндой нет проблем — компилируем все в 32 бита и вперед. Но под линуксом дела обстоят хуже. Собирать все в 32 бита и цеплять в RPM 32битные версии свободных библиотек некрасиво, более того у меня есть API для плагинов. Совсем не хочется заставлять юзеров ставить ради несчастного плагина 32битный компилятор. Поэтому я решил сделать переходник из кота в мышь, который будет вызывать функции из 32битных библиотеке в отдельном процессе. Сначала я хотел сделать его на питоне, но скомпилировать питон в бинарник у меня не получилось. Потом добрые люди на IRC канале PyPy подсказали мне, что можно использовать libffi прямо из C! Дальше дело за малым.

В итоге получилась программа runso32. Она работает в двух режимах. В первом режиме в аргументах командной строки задается библиотека, функция, строка описания параметров и собственно сами параметры. На данный момент поддерживаются параметры типа int, unsigned int, double, указатель и последовательность байтов (буфер). Программа вызывает функцию, печатает возвратное значение и завершается. Второй вариант — интерактивный. Программа читает команды из стандартного ввода или файла. Сначала регистрируются все интересные нам функции. Потом каждая запись, начинающаяся с «CALL», вызывает функцию с заданным номером. в интерактивном режиме перед тем как отправить буфер необходимо указать его длину. В интерактивном режиме все все величины отсылаются в бинарном формате Little Endian

После того как мы определились какие функции нам нужны, можно сделать 64бит библиотеку. Вызов каждой функции будет отсылать в runso32 идентификатор нужной функции и параметры и получать из runso32 результат. Таким образом, мы как бы вызываем функции из 32бит библиотеки в 64бит приложении. Это происходит хоть и с задержкой, но практически незаметно для остальной программы.

Вроде бы все готово, но программный интерфейс получился слишком громоздким. Тогда я написал 64битную библиотеку, которая регистрирует функции и позволяет их вызывать несколько проще. Теперь нам нужна только одна функция — versatile_call. Однако, прежде чем ее использовать, необходимо заполнить в глобальной структуре, имя библиотеки, имена функций и строки описания параметров. Эта структура должна быть заполнена при компиляции. Дальше необходимо всего лишь вызвать функцию versatile_call(n, . ), где n — номер нужной функции из 32бит и дальше список параметров, не забываем про длину буфера, а последний аргумент это указатель на переменную, в которой будет записано возвращаемое значение.

Читайте также:  Установка коробок под счетчики

источник

  • ru
  • Steam

Steam это проприетарное ПО цифрового распространения компьютерных игр и программ для PC с поддержкой Linux, принадлежащее компании Valve, известному разработчику компьютерных игр. Он упакован для Debian в non-free

Графика

Некоторые игры будут нормально работать с вашими текущими настройками, другие могут требовать обновления драйверов для получения максимальной производительности, а некоторые могут отказаться работать без обновленных драйверов. Определите, какое графическое оборудование вы используете и прочитайте соответствующий раздел для AMD/ATI graphics или Nv >

Подготовка

Полномочия пользователя

Самый первый пользователь системы созданный при установке Debian имеет по умолчанию доступ ко всем группам «v >

Установка

На данный момент пакеты доступны для Debian 8 «Jessie», Stretch и S >

Пакет не доступен для выпуска (Debian 7 «Wheezy»); если вы хотите запустить Steam на Debian 7 «Wheezy», вы должны либо использовать jessie chroot (посмотрите на schroot для этого), либо обновиться до Jessie.

64-битные системы (amd64)

Инструкции только для Jessie и S >

Добавьте «non-free» компонент в /etc/apt/sources.list, например:

Включите Multi-Arch и обновите список доступных пакетов:

Установите пакет steam:

  • Установите 32-библиотеки OpenGL:
  • Installing the 32-bit OpenGL libraries may uninstall the 64-bit drivers you may have previously installed. Installing the AMD graphics or NV >

    32-битные системы (i386)

    Инструкции только для Jessie и S >

    Добавьте «non-free» компонент в /etc/apt/sources.list, например:

    Обновите список доступных пакетов:

    Неполадки

    Проблемы с запуском Steam

    Steam устанавливается с некоторыми определенными версиями библиотек («Steam Runtime»), чтобы эмулировать среду Ubuntu 12.04 в более поздних версиях Ubuntu.

    Однако некоторые из этих библиотек могут конфликтовать с теми версиями, которые включены в Debian (например с библиотеками драйверов, в частности, с открытым исходным кодом драйвера ATI).

    Вариант: удалить файлы из Steam Runtime

    Вы можете удалить библиотеки, которые были установлены вместе с Steam. Тогда будут использоваться ваши системные библиотеки (которые были установлены с помощью apt-get).

    Примечание: Каждый раз после обновления Steam эти библиотеки будут опять устанавливаться и вам придется их каждый раз удалять пока не починят этот баг (https://github.com/ValveSoftware/steam-runtime/issues/13). Т.е. после обновления Steam, вы должны будете выйти из него, удалить библиотеки, и заново запустить Steam.

    Данные команды удалят библиотеки из-за которых возникает проблема запуска Steam на Debian:

    Примеры ошибок и неполадок которые возникают если эти библиотеки не удалены:

    • Failed to load libGL: undefined symbol: xcb_send_fd
    • ERROR: ld.so: object ‘

    /.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so’ from LD_PRELOAD cannot be preloaded (wrong ELF >

  • Проблемы с 64-битными играми как XCOM
  • «OpenGL GLX context is not using direct rendering, which may cause performance problems.» (see below)
  • «Could not find required OpenGL entry point ‘glGetError’! Either your v >
  • Сам Steam клиент ломается и закрывается
  • Если вы оказались на этой Steam странице, то скорее всего удаление выше предоставленных библиотек исправит вашу ошибку.

    Вариант: не использовать Steam Runtime

    Если вы запустите Steam с

    то он не будет использовать свою среду выполнения и будет использовать системные библиотеки. На Stretch, вам необходимо установить следующие пакеты, чтобы использовать этот метод:

    Также необходимо сделать ссылку:

    Потому что в настоящий момент файл libudev.so.0 недоступен в Debian. Если этого не достаточно, то в будущем можно будет использовать это

    чтобы найти недостающие зависимости для steamclient.so, или если есть другие библиотеки Steam *.so, который не удается загрузить (вместо steamclient.so нужно будет написать проблемную библиотеку). Чтобы найти пакеты, содержащие зависимости, используйте поиск пакетов Debian на http://packages.debian.org.

    Нет звука в игре

    Вам нужно удалить alsa-lib и libasound.so.* в

    Steam Store и Community Pages не отображается

    Запустите Steam из терминала

    При попытке открыть страницу магазина терминал должен вывести:

    Это означает, что у вас не установлен 32-битный пакета libgpg-error0.

    Устанавливаем нужный пакет:

    Game Fails to Launch: (Steam Works)

    Решение #1: Похоже, при использовании драйвера nv >

    Устанавливаем нужный пакет:

    Решение #2: The Steam Game Folder needs x+ (exec) (If you copied from a remote location it may of removed permissions)

    Убедитесь, что игры внутри /home/ /.steam/steam/steamapps/common/ имеют права на выполнение (+x), для стартовый скриптов. Некоторые работают самостоятельно, через сценарий оболочки, в то время как другие игры запускают ярлык. The launcher has to be +x for the game to work.

    источник

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *