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?
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-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-multilib
, et éventuellement d'autres packages qui en dépendent tels que g++-multilib
. Vous pouvez trouver 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.
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.
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
package ( Debian ) et le paquet debootstrap
( Debian ). Debootstrap n'est nécessaire que pour l'installation de la distribution alternative et peut être supprimé par la suite.
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.
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
.
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
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).
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 .
Si vous avez besoin d'une isolation complète de l'environnement alternatif, utilisez une machine virtuelle telle que KVM ( 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.
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.