Як запустити 32-розрядні програми на 64-бітній Debian / Ubuntu?


74

У мене встановлення 64-бітної (amd64 aka x86_64) Debian або Ubuntu. Мені потрібно періодично запускати 32-розрядні (i386 / i686) програми або збирати програми для 32-бітної системи. Як я можу це зробити, як мінімум метушні?

Бонус: що робити, якщо я хочу запустити або протестувати старіший або новіший випуск дистрибутива?


Можливо те ж саме на запит ubuntu: askubuntu.com/questions/359156/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Відповіді:


52

Рідна підтримка

Оскільки Ubuntu 11.04 та Debian wheezy (7.0), Debian та Ubuntu мають підтримку мультиархів: ви можете змішувати пакети x86_32 (i386) та x86_64 (amd64) в одній системі прямо. Це відомо як мультіархітектурная підтримка Див відповіді 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-бітні компоненти режиму користувача встановлені. Описаний нижче Шрот переймається цим.

Шрот

Цей розділ є керівництвом щодо встановлення подібного до Debian дистрибутива «всередині» іншого дистрибутива Linux. Це сформульовано з точки зору встановлення 32-розрядного Ubuntu всередині 64-розрядного Ubuntu, але має застосовуватися з незначними модифікаціями в інших ситуаціях, наприклад, встановлення Debian нестабільно всередині Debian stabil або навпаки.

Вступ

Ідея полягає у встановленні альтернативного дистрибутива в піддереві і запуску з цього. Ви можете встановити 32-бітну систему в 64-бітну систему таким чином, або інший випуск вашого дистрибутива, або тестове середовище з встановленими різними наборами пакетів.

chrootВиклик команди і система починає процес з точки зору файлової системи , яка обмежується поддерева дерева каталогів. Debian та Ubuntu ship schroot , утиліта, яка обертається навколо цієї функції, щоб створити більш корисне підсередовище .

Встановіть schrootпакет Встановити schroot ( Debian ) та debootstrapпакет Встановити debootstrap ( Debian ). Debootstrap потрібен лише для встановлення альтернативного розподілу і після цього може бути видалений.

Налаштувати schroot

У цьому прикладі описано, як налаштувати альтернативне середовище 32-розрядного Ubuntu 10.04LTS (зрозумілий рись). Аналогічна установка повинна працювати з іншими випусками 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 замість schroot "каталогу", якщо ви хочете, щоб він був більш постійним, і встановіть постійні кріплення прив'язки у /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 (витривалий), зауважте, що пакет ubuntu-стандарт тягне в MTA. Виберіть nullmailerзамість за замовчуванням postfix(можливо, ви хочете, щоб ваш chroot надсилав пошту, але ви точно не хочете, щоб він отримував жодну).

Йдемо далі

Для отримання додаткової інформації див. schrootПосібник , поширені питання щодо schroot та schroot.confпосібник . Schroot є частиною проекту Debian autobuilder (buildd) . На сторінці спільноти Ubuntu можуть бути додаткові корисні поради щодо debootstrap .

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

Якщо вам потрібна повна ізоляція альтернативного середовища, використовуйте віртуальну машину, таку як KVM ( qemu-kvm Встановіть qemu-kvm ) або VirtualBox .


@Gilles Чи можете ви додати пояснення того, що [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]робить умова?
Faheem Mitha

1
@FaheemMitha Він перевіряє, чи працює сценарій chroot . Це там, щоб підтримати завантаження установки chroot як окрему систему.
Жиль

Я пропоную додати такий зразок users=faheemу свій приклад. За замовчуванням для мене, принаймні, я не є членом групи користувачів. Я б, однак, очікував.
Faheem Mitha

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-architecture i386"
diyism

Наприклад, на Debian Jessie: dpkg --add-architecture 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-розрядний 64-розрядний клієнт sqlite3, підтримуваний проектом sqlite :( Я досить обмежений тим, що мені дозволено встановлювати на цьому спільному ресурсі, тому мені доведеться знімати попередньо складені пакети sqlite. Вдячно можу встановити lib32z1.
harperville
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.