it-swarm-ru.tech

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

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

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

75

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

Начиная с Ubuntu 11.04 и Debian wheezy (7.0), Debian и Ubuntu имеют поддержку multiarch: вы можете напрямую смешивать пакеты x86_32 (i386) и x86_64 (AMD64) в одной системе. Это известно как поддержка multiarch См. ответ warl0ck для более подробной информации.

В более старых выпусках Debian и Ubuntu поставляются с рядом 32-битных библиотек на AMD64. Установите ia32-libsInstall ia32-libs пакет, чтобы иметь базовый набор 32-битных библиотек и, возможно, другие пакеты, которые зависят от этого. Ваши 32-битные исполняемые файлы должны просто запускаться, если у вас есть все необходимые библиотеки. Для разработки установите gcc-multilibInstall gcc-multilib , и снова возможно другие пакеты, которые зависят от него, такие как g++-multilib. Вы можете найти binutils-multiarchInstall binutils-multiarch также полезно и ia32-libs-dev в Debian. Пройти -m32 опция для gcc для компиляции для ix86.

Обратите внимание, что uname -m все равно покажет x64_64 если вы используете 64-битное ядро, независимо от того, какие 32-битные компоненты пользовательского режима вы установили. Schroot, описанный ниже, заботится об этом.

Schroot

Этот раздел является руководством по установке Debian-подобного дистрибутива "внутри" другого дистрибутива Linux. Он сформулирован с точки зрения установки 32-битной Ubuntu внутри 64-битной Ubuntu, но его следует применять с небольшими изменениями в других ситуациях, таких как установка нестабильной версии Debian внутри стабильной версии Debian или наоборот.

Введение

Идея состоит в том, чтобы установить альтернативный дистрибутив в поддереве и запустить из него. Таким образом, вы можете установить 32-битную систему в 64-битную систему, или другой выпуск вашего дистрибутива, или среду тестирования с различными наборами пакетов.

Команда chroot и системный вызов запускают процесс с видом файловой системы, которая ограничена поддеревом дерева каталогов. Debian и Ubuntu поставляют schroot , утилиту, которая оборачивает эту функцию, чтобы создать более удобную суб-среду.

Установите пакет schrootInstall schroot ( Debian ) и пакет debootstrapInstall 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 будет выполнять bind mounts ряда каталогов, то есть эти каталоги будут совместно использоваться родительской установкой: /proc, /dev, /home, /tmp.

Службы в chroot

Как описано здесь, schroot не подходит для запуска демонов. Программы в Schroot будут убиты, когда вы выйдете из Schroot. Используйте "простой" schroot вместо "каталогного", если вы хотите, чтобы он был более постоянным, и настройте постоянное монтирование в /etc/fstab на родительской установке.

В Debian и Ubuntu сервисы запускаются автоматически при установке. Чтобы этого избежать (что может нарушить работу служб вне chroot, в частности из-за того, что сетевые порты являются общими), установите policy не работающих служб в 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 manual , FAQ по schroot и schroot.conf руководство . Schroot является частью проекта Debian autobuilder (buildd) . На могут быть дополнительные полезные советы на странице сообщества Ubuntu о debootstrap .

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

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

54

Поскольку bunt 11.04 (natty) и Debian 7.0 (wheezy) введены multiarch поддержка, 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.

27
daisy

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

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

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

2
cjs