web-dev-qa-db-fra.com

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

J'ai une installation Debian ou Ubuntu 64 bits (AMD64 a.k.a. x86_64). J'ai besoin d'exécuter des programmes 32 bits (i386/i686) de temps en temps, ou de compiler des programmes pour un système 32 bits. Comment puis-je faire cela avec un minimum d'agitation?

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

Prise en charge native

Depuis Ubuntu 11.04 et Debian Wheezy (7.0), Debian et Ubuntu ont une prise en charge multiarchitecture: vous pouvez mélanger les packages 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 réponse de warl0ck pour plus de détails.

Dans les versions plus anciennes, Debian et Ubuntu sont livrées avec un certain nombre de bibliothèques 32 bits sur AMD64. Installez le ia32-libsInstall ia32-libs package pour avoir un ensemble de base de bibliothèques 32 bits, et éventuellement d'autres packages qui dépendent de celui-ci. Vos exécutables 32 bits devraient simplement s'exécuter si vous disposez de toutes les bibliothèques requises. Pour le développement, installez gcc-multilibInstall gcc-multilib , et éventuellement d'autres packages qui en dépendent tels que g++-multilib. Vous pouvez trouver binutils-multiarchInstall binutils-multiarch utile aussi, et ia32-libs-dev sur Debian. Passe le -m32 option à gcc pour compiler pour ix86.

Notez que uname -m affichera toujours x64_64 si 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'en charge.

Schroot

Cette section est un guide pour installer une distribution de type Debian "à l'intérieur" d'une autre distribution Linux. Il est formulé en termes d'installation d'un Ubuntu 32 bits dans 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 distribution alternative dans un sous-arbre et de l'exécuter. Vous pouvez installer un système 32 bits sur un système 64 bits de cette façon, ou une version différente de votre distribution, ou un environnement de test avec différents ensembles de packages installés.

La commande chroot et l'appel système démarrent un processus avec une vue du système de fichiers limité à une sous-arborescence de l'arborescence de répertoires. Debian et Ubuntu sont livrés schroot , un utilitaire qui contourne cette fonctionnalité pour créer un sous-environnement plus utilisable.

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

Configurer schroot

Cet exemple décrit comment configurer un environnement alternatif 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/lucid32 avec le contenu suivant:

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

La ligne directory=/32 indique à schroot où nous placerons les fichiers de l'installation 32 bits. La ligne username=yourusername indique que l'utilisateur yourusername sera autorisé à utiliser le schéma. La ligne groups=users,admin indique que les utilisateurs de l'un ou l'autre groupe seront autorisés à utiliser schroot; vous pouvez également mettre un 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 packages 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 qui fonctionne; ce qui suit est des améliorations mineures. Schroot écrase automatiquement plusieurs fichiers dans /32/etc lorsque vous l'exécutez, en particulier la configuration DNS dans /etc/resolv.conf et la base de données utilisateur dans /etc/passwd et d'autres fichiers (cela peut être remplacé, voir la documentation). Il y a quelques autres 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/mtab ou /etc/fstab dans le chroot. Je ne recommande pas d'utiliser la commande mount manuellement dans le chroot, faites-le de l'extérieur. Mais créez un assez bon /etc/mtab pour que les commandes telles que df fonctionnent raisonnablement.

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

Avec le type directory, schroot effectuera bind mounts d'un certain nombre de répertoires, c'est-à-dire que ces répertoires seront partagés avec l'installation parente: /proc, /dev, /home, /tmp.

Services au chroot

Comme décrit ici, un schroot ne convient pas pour exécuter des démons. Les programmes dans le schroot seront tués lorsque vous quitterez le schroot. Utilisez un schéma "simple" au lieu d'un schéma "répertoire" si vous voulez qu'il soit plus permanent et configurez des montages de liaison permanents dans /etc/fstab sur l'installation parent.

Sur Debian et Ubuntu, les services démarrent automatiquement lors de l'installation. Pour éviter cela (qui pourrait perturber les services s'exécutant en dehors du chroot, en particulier parce que les ports réseau sont partagés), établissez une stratégie de services non exécutés dans le chroot. Mettez le script suivant comme /32/usr/sbin/policy-rc.d et le rendre 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

Remplissez le nouveau système

Maintenant, nous pouvons commencer à utiliser le chroot. Vous voudrez installer quelques packages 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 est pour une ancienne version d'Ubuntu telle que 8.04 (hardy), notez que le paquet ubuntu-standard tire dans un MTA. Sélectionnez nullmailer au lieu de la valeur par défaut postfix (vous voudrez peut-être que votre chroot envoie du courrier mais vous ne voulez certainement pas qu'il en reçoive).

Aller plus loin

Pour plus d'informations, consultez le schroot manual , le schroot FAQ et le schroot.conf manuel . 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 alternatif, utilisez une machine virtuelle telle que KVM ( qemu-kvmInstall qemu-kvm ) ou VirtualBox .

Depuis bunt 11.04 (natty) et Debian 7.0 (wheezy) introduit multiarch support, les bibliothèques 32 bits et 64 bits peuvent coexister sur un seul système . Pour installer une bibliothèque libXX 32 bits, 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

Installez ensuite la bibliothèque 32 bits:

Sudo apt-get install libXX:i386

Le package ia32-libs. À partir d'Ubuntu 12.04 précis, il ne contient plus de bibliothèques, il ne fait que tirer libXX:i386 packages en tant que dépendances.

La partie compilation est assez simple pour les programmes C et C++, ajoutez -m32 à CFLAG ou CXXFLAG, ce qui rendra le programme généré 32 bits, par exemple

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

Cela fonctionne également pour les projets basés sur makefile.

27
daisy

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

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

Cela a été testé sur Debian 9.

2
cjs