Как мне запустить 32-битные программы на 64-битном Debian / Ubuntu?

74

У меня установлена ​​64-битная (amd64 или x86_64) Debian или Ubuntu. Мне нужно время от времени запускать 32-битные (i386 / i686) программы или компилировать программы для 32-битной системы. Как я могу сделать это с минимумом суеты?

Бонус: что делать, если я хочу запустить или протестировать более старый или более новый выпуск дистрибутива?

Жиль "ТАК - перестань быть злым"
источник
То
Ciro Santilli ti 改造 中心 法轮功 六四 事件

Ответы:

52

Родная поддержка

Начиная с 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 Установите ia32-libsgcc-multilib Установите gcc-multilibg++-multilibbinutils-multiarch Установите binutils-multiarchia32-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пакет Установить schroot ( Debian ) и debootstrapпакет Установить debootstrap ( Debian ). Debootstrap необходим только для установки альтернативного дистрибутива и может быть удален впоследствии.

Настроить schroot

В этом примере описывается, как настроить 32-разрядную альтернативную среду Ubuntu 10.04LTS (lucid lynx). Подобная установка должна работать с другими выпусками Debian и Ubuntu. Создайте файл /etc/schroot/chroot.d/lucid32со следующим содержимым:

[lucid32]
description=Ubuntu 10.04LTS 32-bit
directory=/32
type=directory
personality=linux32
users=yourusername
groups=users,admin

Строка directory=/32сообщает schroot, куда мы поместим файлы 32-битной установки. Строка username=yourusernameговорит, что пользователю yourusernameбудет разрешено использовать schroot. В строке groups=users,adminговорится, что пользователям в любой группе будет разрешено использовать schroot; Вы также можете поставить users=…директиву.

Установите новый дистрибутив

Создайте каталог и начните заполнять его debootstrap. Debootstrap загружает и устанавливает базовый набор пакетов для указанного дистрибутива и архитектуры.

mkdir /32
debootstrap --arch i386 lucid /32 http://archive.ubuntu.com/ubuntu

У вас уже есть работающая система; то, что следует, является незначительными улучшениями. При запуске Schroot автоматически перезаписывает несколько файлов /32/etc, в частности конфигурацию DNS /etc/resolv.confи базу данных пользователей /etc/passwdи другие файлы (это можно переопределить, см. Документацию). Есть еще несколько файлов, которые вы можете скопировать вручную раз и навсегда:

cp -p /etc/apt/apt.conf /32/etc/apt/      # for proxy settings
cp -p /etc/apt/sources.list /32/etc/apt/  # for universe, security, etc
cp -p /etc/environment /32/etc/           # for proxy and locale settings
cp -p /etc/sudoers /32/etc/               # for custom sudo settings

Там не будет файла /etc/mtabили /etc/fstabв chroot. Я не рекомендую использовать mountкоманду вручную в chroot, делайте это снаружи. Но создайте достаточно хорошо, /etc/mtabчтобы заставить команды, такие как dfработать разумно.

ln -s /proc/mounts /32/etc/mtab

С 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).

#!/bin/sh
## Don't start any service if running in a chroot.
## See /usr/share/doc/sysv-rc/README.policy-rc.d.gz
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  exit 101
fi

Заполните новую систему

Теперь мы можем начать использовать chroot. Вы хотите установить еще несколько пакетов на этом этапе.

schroot -c lucid32
sudo apt-get update
apt-get install lsb-core nano
...

Вам может потребоваться создать несколько локалей, например

locale-gen en_US en_US.utf8

Если schroot предназначен для более ранней версии Ubuntu, такой как 8.04 (hardy), обратите внимание, что пакет ubuntu-standard включает MTA. Выберите nullmailerвместо значения по умолчанию postfix(вы можете захотеть, чтобы ваш chroot отправлял почту, но вы определенно не хотите, чтобы она получала).

Идти дальше

Для получения дополнительной информации см. schrootРуководство , часто задаваемые вопросы по schroot и schroot.confруководство . Schroot является частью проекта Debian autobuilder (buildd) . На странице сообщества Ubuntu могут быть дополнительные полезные советы о debootstrap .

Виртуальная машина

Если вам нужна полная изоляция альтернативной среды, используйте виртуальную машину, такую ​​как KVM ( qemu-kvm Установите qemu-kvm ) или VirtualBox .

Жиль "ТАК - перестань быть злым"
источник
@ Жиль Вы можете добавить объяснение того, что [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]делает условие?
Фахим Митха
1
@FaheemMitha Проверяет, выполняется ли скрипт в chroot . Он поддерживает загрузку установки chroot как автономной системы.
Жиль "ТАК - перестань быть злым"
Я предлагаю добавить строку, как users=faheemв вашем примере. По умолчанию, по крайней мере для меня, я не являюсь членом группы пользователей. Я бы ожидал, однако.
Фахим Митха
25

Поскольку в Ubuntu 11.04 (natty) и Debian 7.0 (wheezy) появилась поддержка многоархитектуры , 32-битные и 64-битные библиотеки могут сосуществовать в одной системе. Чтобы установить 32-битную библиотеку libXX, сначала добавьте в вашу систему необходимую 32-битную архитектуру:

Для Ubuntu:

sudo dpkg --foreign-architecture i386

И для Debian:

sudo dpkg --add-architecture i386

Затем установите 32-битную библиотеку:

sudo apt-get install libXX:i386

Пакет ia32-libs. Начиная с Ubuntu 12.04, он больше не содержит библиотек, он только загружает libXX:i386пакеты как зависимости.

Компиляция довольно проста для программ на C и C ++, добавьте -m32в CFLAGили CXXFLAG, что сделает сгенерированную программу 32-битной, например

export CFLAGS="-m32"
gcc main.c -o main

Это работает и для проектов на основе makefile.

маргаритка
источник
2
apt-get install ia32-libsработал для меня (13.04)!
Этьен
1
для Ubuntu 14.04 это "sudo dpkg --add-архитектура i386"
diyism
Например, в Debian Jessie: dpkg --add-архитектура i386; apt-get update; apt-get install libstdc ++ 5: i386 libpam0g: i386
Джонатан Бен-Авраам
0

Если у вас просто 32-битный бинарный файл, который вы хотите запустить в современной 64-битной системе Debian / Ubuntu, сделайте следующее:

dpkg --add-architecture i386
apt update
apt install libc6-i386

Это было протестировано на Debian 9.

Курт Дж. Сэмпсон
источник
1
Мне также нужно sudo apt-get install lib32z1для моего конкретного 32-разрядного исполняемого файла, если это поможет. Ошибка: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Да, сейчас 2019 год, и я не могу найти предварительно скомпилированный 64-разрядный клиент sqlite3, поддерживаемый проектом sqlite :( Я довольно ограничен в том, что мне разрешено устанавливать на этом общем ресурсе, поэтому мне приходится снимать скомпилированные пакеты sqlite. К счастью, я могу установить lib32z1.
Harperville