Comment exécuter des programmes 32 bits sur une Debian / Ubuntu 64 bits?

74

J'ai une installation Debian ou Ubuntu 64 bits (amd64, x86_64). Je dois exécuter des programmes 32 bits (i386 / i686) à l'occasion ou compiler des programmes pour un système 32 bits. Comment puis-je faire cela avec un minimum de tracas?

Bonus: que faire si je veux exécuter ou tester avec une version plus ancienne ou plus récente de la distribution?

Gilles, arrête de faire le mal
la source
Même chose possible sur ask ubuntu: askubuntu.com/questions/359156/…
Ciro Santilli a écrit:

Réponses:

52

Support natif

Depuis Ubuntu 11.04 et Debian Wheezy (7.0), Debian et Ubuntu ont un support multiarch: vous pouvez mélanger des paquets x86_32 (i386) et x86_64 (amd64) sur le même système de manière simple. Ceci est connu sous le nom de support multiarch Voir la réponse de warl0ck pour plus de détails.

Dans les versions antérieures, Debian et Ubuntu étaient livrées avec un certain nombre de bibliothèques 32 bits sur amd64. Installez le paquet pour avoir un ensemble de base de bibliothèques 32 bits et éventuellement d’autres paquets qui dépendent de celui-ci. Vos exécutables 32 bits doivent simplement être exécutés si vous avez toutes les bibliothèques requises. Pour le développement, installez , et éventuellement d’autres paquets qui en dépendent, tels que . Vous pouvez également trouver utile, et sur Debian. Passez l’ option gcc à compiler pour ix86.ia32-libs Installez ia32-libsgcc-multilib Installez gcc-multilibg++-multilibbinutils-multiarch Installer binutils-multiarchia32-libs-dev-m32

Notez que cela uname -mindique toujours x64_64si vous exécutez un noyau 64 bits, quels que soient les composants en mode utilisateur 32 bits que vous avez installés. Schroot décrit ci-dessous s’occupe de cela.

Schroot

Cette section est un guide pour installer une distribution du type Debian «à l’intérieur» d’une autre distribution Linux. Il est libellé en termes d'installation d'un Ubuntu 32 bits à l'intérieur d'un Ubuntu 64 bits, mais devrait s'appliquer avec des modifications mineures à d'autres situations, telles que l'installation de Debian unstable dans Debian stable ou vice versa.

introduction

L'idée est d'installer une autre distribution dans un sous-arbre et de l'exécuter à partir de celui-ci. Vous pouvez installer un système 32 bits sur un système 64 bits de cette manière, ou une version différente de votre distribution, ou un environnement de test avec différents ensembles de packages installés.

L' chrootappel de commande et système lance un processus avec une vue du système de fichiers limitée à une sous-arborescence de l'arborescence. Debian et Ubuntu sont livrés avec schroot , un utilitaire qui entoure cette fonctionnalité pour créer un sous-environnement plus utilisable.

Installez le schrootpaquet Installer schroot ( Debian ) et le debootstrappaquet Installer debootstrap ( Debian ). Debootstrap n'est nécessaire que pour l'installation de la distribution alternative et peut être supprimé par la suite.

Mettre en place schroot

Cet exemple explique comment configurer un autre environnement Ubuntu 10.04LTS (lucid lynx) 32 bits. Une configuration similaire devrait fonctionner avec d'autres versions de Debian et Ubuntu. Créez un fichier /etc/schroot/chroot.d/lucid32avec le contenu suivant:

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

La ligne directory=/32indique à schroot où nous allons placer les fichiers de l'installation 32 bits. La ligne username=yourusernameindique que l'utilisateur yourusernamesera autorisé à utiliser la racine. La ligne groups=users,adminindique que les utilisateurs de l'un ou l'autre groupe seront autorisés à utiliser le schéma; vous pouvez aussi mettre une users=…directive.

Installer la nouvelle distribution

Créez le répertoire et commencez à le remplir avec debootstrap. Debootstrap télécharge et installe un ensemble de paquets de base pour la distribution et l'architecture spécifiées.

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

Vous avez déjà presque un système de travail; Ce qui suit est des améliorations mineures. Schroot écrase automatiquement plusieurs fichiers /32/etclorsque vous l'exécutez, en particulier la configuration DNS dans /etc/resolv.confet la base de données des utilisateurs dans /etc/passwdet d'autres fichiers (ceci peut être remplacé, voir la documentation). Il y a encore quelques fichiers que vous voudrez peut-être copier manuellement une fois pour toutes:

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

Il n'y aura pas de fichier /etc/mtabou /etc/fstabdans le chroot. Je ne recommande pas d'utiliser la mountcommande manuellement dans le chroot, faites-le de l'extérieur. Mais créez assez de bien /etc/mtabpour exécuter des commandes telles que dftravailler raisonnablement.

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

Avec le directorytype schroot effectuera bind supports d'un certain nombre de répertoires, à savoir les répertoires seront partagés avec l'installation mère: /proc, /dev, /home, /tmp.

Services dans le chroot

Comme décrit ici, une racine ne convient pas pour exécuter des démons. Les programmes de la racine seront supprimés lorsque vous quitterez la racine. Utilisez une racine «ordinaire» au lieu d'une racine «annuaire» si vous voulez qu'elle soit plus permanente, et configurez des montages de liaison permanents /etc/fstabsur l'installation parent.

Sur Debian et Ubuntu, les services démarrent automatiquement à l’installation. Pour éviter cela (ce qui pourrait perturber les services exécutés en dehors du chroot, notamment parce que les ports réseau sont partagés), définissez une stratégie consistant à ne pas exécuter les services dans le chroot. Mettez le script suivant en tant que /32/usr/sbin/policy-rc.det rendez-le exécutable ( 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

Remplir le nouveau système

Nous pouvons maintenant commencer à utiliser le chroot. Vous voudrez installer quelques paquets supplémentaires à ce stade.

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

Vous devrez peut-être générer quelques paramètres régionaux, par exemple

locale-gen en_US en_US.utf8

Si le schéma concerne une version plus ancienne d'Ubuntu telle que 8.04 (hardy), notez que le paquet ubuntu-standard récupère un MTA. Sélectionnez nullmailerau lieu de la valeur par défaut postfix(vous voudrez peut-être que votre chroot envoie un courrier, mais vous ne voulez absolument pas qu'il en reçoive).

Aller plus loin

Pour plus d'informations, consultez le schrootmanuel , la FAQ schroot et le schroot.confmanuel . Schroot fait partie du projet Debian autobuilder (buildd) . Il peut y avoir d’autres conseils utiles sur la page de la communauté Ubuntu sur debootstrap .

Machine virtuelle

Si vous avez besoin d'une isolation complète de l'environnement de remplacement, utilisez une machine virtuelle telle que KVM ( qemu-kvm Installer qemu-kvm ) ou VirtualBox .

Gilles, arrête de faire le mal
la source
@ Gilles Pouvez-vous ajouter une explication de ce que fait la [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]maladie?
Faheem Mitha
1
@FaheemMitha Il teste si le script s'exécute dans un chroot . Il est là pour prendre en charge le démarrage de l’installation chroot en tant que système autonome.
Gilles 'SO- arrête d'être méchant'
Je suggère d'ajouter une ligne semblable users=faheemà votre exemple. Par défaut, du moins pour moi, je ne suis pas membre du groupe d'utilisateurs. Je me serais attendu à être, cependant.
Faheem Mitha
25

Depuis que Ubuntu 11.04 (natty) et Debian 7.0 (Wheezy) ont introduit le support multiarch , les bibliothèques 32 bits et 64 bits peuvent coexister sur un système. Pour installer une bibliothèque 32 bits libXX, ajoutez d’abord l’architecture 32 bits nécessaire à votre système:

Pour Ubuntu:

sudo dpkg --foreign-architecture i386

Et pour Debian:

sudo dpkg --add-architecture i386

Puis installez la bibliothèque 32 bits:

sudo apt-get install libXX:i386

Le paquet ia32-libs. À partir de Ubuntu 12.04 precise, il ne contient plus aucune bibliothèque, il extrait uniquement les libXX:i386paquets en tant que dépendances.

La partie compilation est plutôt facile pour les programmes C et C ++, ajouter -m32à CFLAGou CXXFLAG, ce qui rendra le programme généré 32 bits, par exemple

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

Cela fonctionne aussi pour les projets makefile.

Marguerite
la source
2
apt-get install ia32-libsa travaillé pour moi (13.04)!
Étienne
1
pour Ubuntu 14.04, il s'agit de "sudo dpkg --add-architecture i386"
diyisme
Par exemple, sur Debian Jessie: dpkg --add-architecture i386; apt-get update; apt-get install libstdc ++ 5: i386 libpam0g: i386
Jonathan Ben-Avraham
0

Si vous souhaitez simplement exécuter un binaire 32 bits sur un système Debian / Ubuntu 64 bits moderne, procédez comme suit:

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

Ceci a été testé sur Debian 9.

Curt J. Sampson
la source
1
J'avais aussi besoin sudo apt-get install lib32z1de mon exécutable 32 bits, si cela peut aider. L'erreur était: sqlite3: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory. Oui, nous sommes en 2019 et je ne trouve pas de client sqlite3 précompilé 64 bits pris en charge par le projet sqlite :( Je ne suis pas assez protégé par ce que je suis autorisé à installer sur cette ressource partagée. Je dois donc extraire les packages sqlite précompilés. Heureusement, je peux installer lib32z1.
harperville