Wie führe ich 32-Bit-Programme auf einem 64-Bit-Debian / Ubuntu aus?

74

Ich habe eine 64-Bit (amd64 aka x86_64) Debian- oder Ubuntu-Installation. Ich muss gelegentlich 32-Bit-Programme (i386 / i686) ausführen oder Programme für ein 32-Bit-System kompilieren. Wie kann ich das mit einem Minimum an Aufwand machen?

Bonus: Was ist, wenn ich eine ältere oder neuere Version der Distribution ausführen oder testen möchte?

Gilles
quelle
Mögliches selbes
Ciro Santilli 事件 改造 法轮功 六四 事件 六四

Antworten:

52

Native Unterstützung

Seit Ubuntu 11.04 und Debian Wheezy (7.0) unterstützen Debian und Ubuntu Multiarch: Sie können x86_32 (i386) - und x86_64 (amd64) -Pakete auf einfache Weise auf demselben System mischen. Dies wird als Multiarch-Unterstützung bezeichnet. Weitere Informationen finden Sie in der Antwort von warl0ck .

In älteren Versionen werden Debian und Ubuntu mit einer Reihe von 32-Bit-Bibliotheken auf amd64 ausgeliefert. Installieren Sie das Paket, um einen Basissatz von 32-Bit-Bibliotheken und möglicherweise andere Pakete zu erhalten, die von diesem abhängen. Ihre ausführbaren 32-Bit-Dateien sollten einfach ausgeführt werden, wenn Sie über alle erforderlichen Bibliotheken verfügen. Für die Entwicklung installieren Sie möglicherweise auch andere Pakete, die davon abhängen, wie z . Sie finden es vielleicht auch nützlich und auf Debian. Übergeben Sie die Option an gcc, um für ix86 zu kompilieren.ia32-libs Installieren Sie ia32-libsgcc-multilib Installieren Sie gcc-multilibg++-multilibbinutils-multiarch Installieren Sie binutils-multiarchia32-libs-dev-m32

Beachten Sie, dass uname -mweiterhin angezeigt wird, x64_64wenn Sie einen 64-Bit-Kernel ausführen, unabhängig davon, welche 32-Bit-Benutzermoduskomponenten Sie installiert haben. Dafür sorgt die weiter unten beschriebene Firma Schroot.

Schroot

Dieser Abschnitt ist eine Anleitung zum Installieren einer Debian-ähnlichen Distribution "in" einer anderen Linux-Distribution. Es bezieht sich auf die Installation eines 32-Bit-Ubuntu in einem 64-Bit-Ubuntu, sollte jedoch mit geringfügigen Änderungen auf andere Situationen zutreffen, wie z. B. die Installation von Debian unstable in Debian stable oder umgekehrt.

Einführung

Die Idee ist, eine alternative Distribution in einem Teilbaum zu installieren und von dort aus zu starten. Auf diese Weise können Sie ein 32-Bit-System auf einem 64-Bit-System oder eine andere Version Ihrer Distribution oder eine Testumgebung mit verschiedenen Paketsätzen installieren.

Der chrootBefehls- und Systemaufruf startet einen Prozess mit einer Ansicht des Dateisystems, die auf einen Teilbaum der Verzeichnisstruktur beschränkt ist. Debian und Ubuntu liefern schroot , ein Dienstprogramm, das diese Funktion umgibt , um eine benutzerfreundlichere Unterumgebung zu erstellen.

Installieren Sie das schrootPaket Installieren Sie schroot ( Debian ) und das debootstrapPaket Installieren Sie Debootstrap ( Debian ). Debootstrap wird nur für die Installation der alternativen Distribution benötigt und kann anschließend entfernt werden.

Richten Sie schroot ein

In diesem Beispiel wird beschrieben, wie Sie eine alternative 32-Bit-Ubuntu 10.04LTS-Umgebung (lucid lynx) einrichten. Ein ähnliches Setup sollte mit anderen Releases von Debian und Ubuntu funktionieren. Erstellen Sie eine Datei /etc/schroot/chroot.d/lucid32mit folgendem Inhalt:

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

Die Zeile directory=/32teilt schroot mit, wo die Dateien der 32-Bit-Installation abgelegt werden. Die Zeile username=yourusernamebesagt, dass der Benutzer yourusernamedie Wurzel benutzen darf. Die Zeile groups=users,adminbesagt, dass Benutzer in jeder Gruppe die Berechtigung haben, die Wurzel zu verwenden. Sie können auch eine users=…Direktive setzen.

Installieren Sie die neue Distribution

Erstellen Sie das Verzeichnis und füllen Sie es mit debootstrap. Debootstrap lädt einen Kernsatz von Paketen für die angegebene Distribution und Architektur herunter und installiert sie.

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

Sie haben fast schon ein funktionierendes System; Was folgt, sind kleinere Verbesserungen. Schroot überschreibt automatisch mehrere Dateien, /32/etcwenn Sie es ausführen, insbesondere die DNS-Konfiguration in /etc/resolv.confund die Benutzerdatenbank in /etc/passwdund andere Dateien (dies kann überschrieben werden, siehe Dokumentation). Es gibt einige weitere Dateien, die Sie möglicherweise ein für alle Mal manuell kopieren möchten:

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

Es gibt keine Datei /etc/mtaboder /etc/fstabin der Chroot. Ich empfehle nicht, den mountBefehl manuell in der Chroot zu verwenden, sondern von außen. Aber erstellen Sie eine gute genug /etc/mtab, um Befehle wie dfvernünftig funktionieren zu lassen.

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

Mit der directoryArt, wird schroot ausführen Bind Mounts einer Anzahl von Verzeichnissen, dh solche Verzeichnisse werden mit der Mutter Installation geteilt werden: /proc, /dev, /home, /tmp.

Dienstleistungen in der Chroot

Wie hier beschrieben, ist ein Schroot nicht zum Ausführen von Daemons geeignet. Programme in der Wurzel werden beendet, wenn Sie die Wurzel verlassen. Verwenden Sie eine "normale" Stammumgebung anstelle einer "Verzeichnis" -Stammumgebung, wenn diese dauerhafter sein soll, und richten Sie permanente Bindungsbereitstellungen in /etc/fstabder übergeordneten Installation ein.

Unter Debian und Ubuntu werden die Dienste bei der Installation automatisch gestartet. Um dies zu vermeiden (was die Dienste stören könnte, die außerhalb der Chroot ausgeführt werden, insbesondere weil Netzwerkports gemeinsam genutzt werden), richten Sie eine Richtlinie ein , nach der Dienste in der Chroot nicht ausgeführt werden. Setzen Sie das folgende Skript als /32/usr/sbin/policy-rc.dund machen Sie es ausführbar ( 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

Füllen Sie das neue System

Jetzt können wir die Chroot benutzen. Sie möchten an dieser Stelle noch ein paar Pakete installieren.

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

Möglicherweise müssen Sie einige Gebietsschemas generieren, z

locale-gen en_US en_US.utf8

Wenn die Wurzel für eine ältere Ubuntu-Version wie 8.04 (hardy) ist, beachten Sie, dass das Paket ubuntu-standard einen MTA einliest. Wählen Sie nullmaileranstelle der Standardeinstellung postfix(Sie möchten möglicherweise, dass Ihre Chroot E-Mails sendet, aber auf keinen Fall, dass sie E-Mails empfängt).

Weitergehen

Weitere Informationen finden Sie im schrootHandbuch , in den häufig gestellten Fragen (FAQ) und im schroot.confHandbuch . Schroot ist Teil des Debian-Autobuilder-Projekts (buildd) . Auf der Ubuntu-Community-Seite gibt es möglicherweise weitere nützliche Tipps zu Debootstrap .

Virtuelle Maschine

Wenn Sie eine vollständige Isolierung der alternativen Umgebung benötigen, verwenden Sie eine virtuelle Maschine wie KVM ( qemu-kvm Installieren Sie qemu-kvm ) oder VirtualBox .

Gilles
quelle
@ Gilles Kannst du eine Erklärung hinzufügen, was die [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]Bedingung bewirkt?
Faheem Mitha
1
@FaheemMitha Testet , ob das Skript in einer Chroot ausgeführt wird . Es ist dazu da, das Booten der Chroot-Installation als eigenständiges System zu unterstützen.
Gilles
Ich schlage vor, eine Zeile wie users=faheemin Ihrem Beispiel hinzuzufügen . Zumindest für mich bin ich standardmäßig kein Mitglied der Benutzergruppe. Ich hätte es jedoch erwartet.
Faheem Mitha
25

Seit Ubuntu 11.04 (natty) und Debian 7.0 (wheezy) die Multiarch- Unterstützung eingeführt haben , können 32-Bit- und 64-Bit-Bibliotheken auf einem System koexistieren. Um eine 32-Bit-Bibliothek libXX zu installieren, fügen Sie Ihrem System zunächst die erforderliche 32-Bit-Architektur hinzu:

Für Ubuntu:

sudo dpkg --foreign-architecture i386

Und für Debian:

sudo dpkg --add-architecture i386

Dann installiere die 32bit Bibliothek:

sudo apt-get install libXX:i386

Das Paket ia32-libs. Ab Ubuntu 12.04 enthält es keine Bibliotheken mehr, sondern zieht nur noch libXX:i386Pakete als Abhängigkeiten ein.

Der Kompilierungsteil ist ziemlich einfach für C- und C ++ - Programme, die -m32zu CFLAGoder hinzufügen CXXFLAG, wodurch das generierte Programm 32-Bit wird, z

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

Dies funktioniert auch für makefile-basierte Projekte.

Gänseblümchen
quelle
2
apt-get install ia32-libsarbeitete für mich (13.04)!
Étienne
1
für ubuntu 14.04 ist es "sudo dpkg --add-architecture i386"
diyism
Zum Beispiel unter Debian Jessie: dpkg --add-architecture i386; apt-get update; Apt-Get installieren libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham
0

Wenn Sie nur eine 32-Bit-Binärdatei haben, die Sie auf einem modernen 64-Bit-Debian / Ubuntu-System ausführen möchten, gehen Sie wie folgt vor:

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

Dies wurde unter Debian 9 getestet.

Curt J. Sampson
quelle
1
Ich brauchte auch sudo apt-get install lib32z1für meine spezielle 32-Bit-ausführbare Datei, wenn das hilft. Der Fehler war: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Ja, es ist 2019 und ich kann keinen vorkompilierten 64-Bit-sqlite3-Client finden, der vom sqlite-Projekt unterstützt wird. Zum Glück kann ich installieren lib32z1.
Harperville