it-swarm.com.de

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

Ich habe eine 64-Bit-Debian- oder Ubuntu-Installation (AMD64 a.k.a. x86_64). Ich muss gelegentlich 32-Bit-Programme (i386/i686) ausführen oder Programme für ein 32-Bit-System kompilieren. Wie kann ich das mit minimalem Aufwand tun?

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

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 ist bekannt als Multiarch-Unterstützung Siehe Antwort von warl0ck für weitere Details.

In älteren Versionen werden Debian und Ubuntu mit einer Reihe von 32-Bit-Bibliotheken auf AMD64 ausgeliefert. Installieren Sie das ia32-libsInstall ia32-libs Paket mit einem Grundsatz von 32-Bit-Bibliotheken und möglicherweise anderen Paketen, die von diesem abhängen. Ihre 32-Bit-ausführbaren Dateien sollten einfach ausgeführt werden, wenn Sie über alle erforderlichen Bibliotheken verfügen. Installieren Sie für die Entwicklung gcc-multilibInstall gcc-multilib und wieder möglicherweise andere davon abhängige Pakete wie g++-multilib. Möglicherweise finden Sie binutils-multiarchInstall binutils-multiarch auch nützlich und ia32-libs-dev auf Debian. Übergeben Sie die Option -m32 An gcc, um sie für ix86 zu kompilieren.

Beachten Sie, dass uname -m Immer noch x64_64 Zeigt, wenn Sie einen 64-Bit-Kernel ausführen, unabhängig davon, welche 32-Bit-Benutzermoduskomponenten Sie installiert haben. Dafür sorgt Schroot.

Schroot

Dieser Abschnitt ist eine Anleitung zum Installieren einer Debian-ähnlichen Distribution "in" einer anderen Linux-Distribution. Es wird in Bezug auf die Installation eines 32-Bit-Ubuntu in einem 64-Bit-Ubuntu formuliert, sollte jedoch mit geringfügigen Änderungen auf andere Situationen angewendet werden, z. B. die Installation von Debian instabil in Debian Stable oder umgekehrt.

Einführung

Die Idee ist, eine alternative Distribution in einem Teilbaum zu installieren und von dort aus auszuführen. 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 installierten Paketsätzen installieren.

Der Befehl chroot und der Systemaufruf starten einen Prozess mit einer Ansicht des Dateisystems, die auf einen Teilbaum des Verzeichnisbaums beschränkt ist. Debian und Ubuntu werden mit schroot ausgeliefert, einem Dienstprogramm, das diese Funktion umgibt, um eine benutzerfreundlichere Unterumgebung zu erstellen.

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

Schroot einrichten

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

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

Die Zeile directory=/32 Sagt schroot, wo wir die Dateien der 32-Bit-Installation ablegen werden. Die Zeile username=yourusername Sagt, dass der Benutzer yourusername den Schroot verwenden darf. Die Zeile groups=users,admin Gibt an, dass Benutzer in beiden Gruppen den Schroot verwenden dürfen. Sie können auch eine users=… - Direktive einfügen.

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 beim Ausführen automatisch mehrere Dateien in /32/etc, Insbesondere die DNS-Konfiguration in /etc/resolv.conf Und die Benutzerdatenbank in /etc/passwd Und andere Dateien (dies kann überschrieben werden, siehe die Dokumentation). Es gibt noch 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 wird keine Datei /etc/mtab Oder /etc/fstab In der Chroot geben. Ich empfehle nicht, den Befehl mount manuell in der Chroot zu verwenden, sondern von außen. Erstellen Sie jedoch ein ausreichend gutes /etc/mtab, Damit Befehle wie df vernünftig funktionieren.

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

Mit dem Typ directory führt schroot bind mounts einer Reihe von Verzeichnissen aus, dh diese Verzeichnisse werden für die übergeordnete Installation freigegeben: /proc, /dev, /home, /tmp.

Dienstleistungen in der Chroot

Wie hier beschrieben, ist ein Schroot nicht zum Ausführen von Dämonen geeignet. Programme im Schroot werden beendet, wenn Sie den Schroot verlassen. Verwenden Sie ein "einfaches" Schroot anstelle eines "Verzeichnis" -Schroots, wenn Sie möchten, dass es dauerhafter ist, und richten Sie permanente Bindungs-Mounts in /etc/fstab In der übergeordneten Installation ein.

Unter Debian und Ubuntu werden die Dienste bei der Installation automatisch gestartet. Um dies zu vermeiden (was die außerhalb der Chroot ausgeführten Dienste stören könnte, insbesondere weil Netzwerkports gemeinsam genutzt werden), legen Sie eine Richtlinie fest, nach der keine Dienste in der Chroot ausgeführt werden. Setzen Sie das folgende Skript als /32/usr/sbin/policy-rc.d und 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 mit der Verwendung der Chroot beginnen. Sie möchten an dieser Stelle einige weitere 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 der Schroot für eine ältere Version von Ubuntu wie 8.04 (hardy) vorgesehen ist, beachten Sie, dass das Paket Ubuntu-Standard einen MTA enthält. Wählen Sie nullmailer anstelle des Standardwerts postfix (Sie möchten möglicherweise, dass Ihre Chroot E-Mails sendet, aber Sie möchten definitiv nicht, dass sie E-Mails empfängt).

Weitergehen

Weitere Informationen finden Sie im schroot Handbuch , im schroot FAQ und im schroot.conf Handbuch . Schroot ist Teil des Debian Autobuilder (buildd) -Projekts . Auf der buntu-Community-Seite zu Debootstrap finden Sie möglicherweise weitere nützliche Tipps.

Virtuelle Maschine

Wenn Sie die alternative Umgebung vollständig isolieren müssen, verwenden Sie eine virtuelle Maschine wie KVM ( qemu-kvmInstall qemu-kvm ) oder VirtualBox .

Seit der Einführung von bunt 11.04 (natty) und Debian 7.0 (wheezy) multiarch Unterstützung 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

Installieren Sie dann die 32-Bit-Bibliothek:

Sudo apt-get install libXX:i386

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

Der Kompilierungsteil ist für C- und C++ - Programme ziemlich einfach. Fügen Sie -m32 bis CFLAG oder 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.

27
daisy

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 auf Debian 9 getestet.

2
cjs