- Как мне запустить 32-битные программы на 64-битном Debian / Ubuntu?
- Родная поддержка
- Schroot
- Введение
- Настроить schroot
- Установите новый дистрибутив
- Службы в chroot
- Заполните новую систему
- Идти дальше
- Виртуальная машина
- Блог начинающего сисадмина
- понедельник, 16 апреля 2018 г.
- Как запускать 32-битные программы на 64-битном дистрибутиве Linux
- Используем 32битные библиотеки в 64битных программах
Как мне запустить 32-битные программы на 64-битном Debian / Ubuntu?
У меня установлена 64-битная (amd64 или x86_64) Debian или Ubuntu. Мне нужно время от времени запускать 32-битные (i386 / i686) программы или компилировать программы для 32-битной системы. Как я могу сделать это с минимумом суеты?
Бонус: что делать, если я хочу запустить или протестировать более старый или более новый выпуск дистрибутива?
Родная поддержка
Начиная с Ubuntu 11.04 и Debian wheezy (7.0), Debian и Ubuntu имеют поддержку multiarch: вы можете напрямую смешивать пакеты x86_32 (i386) и x86_64 (amd64) в одной системе. Это называется поддержкой multiarch. См. Подробности в ответе warl0ck .
В более старых выпусках Debian и Ubuntu поставляются с рядом 32-битных библиотек на amd64. Установите пакет, чтобы иметь базовый набор 32-разрядных библиотек и, возможно, другие пакеты, которые зависят от этого. Ваши 32-битные исполняемые файлы должны просто запускаться, если у вас есть все необходимые библиотеки. Для разработки установите и снова, возможно, другие пакеты, которые зависят от него, такие как . Вы также можете найти полезные и на Debian. Передайте опцию gcc для компиляции для ix86. ia32-libs gcc-multilib
g++-multilib binutils-multiarch
ia32-libs-dev -m32
Обратите внимание, что uname -m все равно будет отображаться, x64_64 если вы используете 64-битное ядро, независимо от того, какие 32-битные компоненты пользовательского режима вы установили. Schroot, описанный ниже, заботится об этом.
Schroot
Этот раздел является руководством по установке Debian-подобного дистрибутива «внутри» другого дистрибутива Linux. Он сформулирован с точки зрения установки 32-битной Ubuntu внутри 64-битной Ubuntu, но его следует применять с небольшими изменениями в других ситуациях, таких как установка нестабильной версии Debian внутри стабильной версии Debian или наоборот.
Введение
Идея состоит в том, чтобы установить альтернативный дистрибутив в поддереве и запустить из него. Таким образом, вы можете установить 32-битную систему в 64-битную систему, или другой выпуск вашего дистрибутива, или среду тестирования с различными наборами пакетов.
chroot Вызов команды и система начинает процесс с точки зрения файловой системы , которая ограничивается поддерева дерева каталогов. Debian и Ubuntu поставляют schroot , утилиту, которая использует эту функцию для создания более удобной суб-среды.
Установите schroot пакет ( Debian ) и debootstrap пакет
( Debian ). Debootstrap необходим только для установки альтернативного дистрибутива и может быть удален впоследствии.
Настроить schroot
В этом примере описывается, как настроить 32-разрядную альтернативную среду Ubuntu 10.04LTS (lucid lynx). Подобная установка должна работать с другими выпусками Debian и Ubuntu. Создайте файл /etc/schroot/chroot.d/lucid32 со следующим содержимым:
Строка directory=/32 сообщает schroot, куда мы поместим файлы 32-битной установки. Строка username=yourusername говорит, что пользователю yourusername будет разрешено использовать schroot. В строке groups=users,admin говорится, что пользователям в любой группе будет разрешено использовать schroot; Вы также можете поставить users=… директиву.
Установите новый дистрибутив
Создайте каталог и начните заполнять его debootstrap. Debootstrap загружает и устанавливает базовый набор пакетов для указанного дистрибутива и архитектуры.
У вас уже есть работающая система; то, что следует, является незначительными улучшениями. При запуске Schroot автоматически перезаписывает несколько файлов /32/etc , в частности конфигурацию DNS /etc/resolv.conf и базу данных пользователей /etc/passwd и другие файлы (это можно переопределить, см. Документацию). Есть еще несколько файлов, которые вы можете скопировать вручную раз и навсегда:
Там не будет файла /etc/mtab или /etc/fstab в chroot. Я не рекомендую использовать mount команду вручную в chroot, делайте это снаружи. Но создайте достаточно хорошо, /etc/mtab чтобы заставить команды, такие как df работать разумно.
С directory типом, schroot будет выполнять привязку монтирование ряда каталогов, то есть эти каталоги будут совместно с родительской установкой: /proc , /dev , /home , /tmp .
Службы в chroot
Как описано здесь, schroot не подходит для запуска демонов. Программы в Schroot будут убиты, когда вы выйдете из Schroot. Используйте «простой» schroot вместо «directory», если вы хотите, чтобы он был более постоянным, и настройте постоянное монтирование в /etc/fstab родительской установке.
В Debian и Ubuntu сервисы запускаются автоматически при установке. Чтобы этого избежать (что может нарушить работу служб вне chroot, в частности из-за того, что сетевые порты являются общими), установите политику неиспользуемых служб в chroot. Поместите следующий скрипт как /32/usr/sbin/policy-rc.d и сделайте его исполняемым ( chmod a+rx /32/usr/sbin/policy-rc.d ).
Заполните новую систему
Теперь мы можем начать использовать chroot. Вы хотите установить еще несколько пакетов на этом этапе.
Вам может потребоваться создать несколько локалей, например
Если schroot предназначен для более ранней версии Ubuntu, такой как 8.04 (hardy), обратите внимание, что пакет ubuntu-standard включает MTA. Выберите nullmailer вместо значения по умолчанию postfix (вы можете захотеть, чтобы ваш chroot отправлял почту, но вы определенно не хотите, чтобы она получала).
Идти дальше
Для получения дополнительной информации см. schroot Руководство , часто задаваемые вопросы по schroot и schroot.conf руководство . Schroot является частью проекта Debian autobuilder (buildd) . На странице сообщества Ubuntu могут быть дополнительные полезные советы о debootstrap .
Виртуальная машина
Если вам нужна полная изоляция альтернативной среды, используйте виртуальную машину, такую как KVM ( qemu-kvm ) или VirtualBox .
Источник
Блог начинающего сисадмина
Здесь уже не будет ничего интересного, лучше загляните сюда: 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 имя виртуальной машины
После установки операционной системы, можно отключить виртуальную машину и запустить ее с виртуального жесткого диска.
$ kvm -hda /vdisk_qemu -m 1024
Источник
Используем 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бит и дальше список параметров, не забываем про длину буфера, а последний аргумент это указатель на переменную, в которой будет записано возвращаемое значение.
Источник