I have a 64-bit (amd64 a.k.a. x86_64) Debian or Ubuntu installation. I need to run 32-bit (i386/i686) programs occasionally, or to compile programs for a 32-bit system. How can I do this with a minimum of fuss?
Bonus: what if I want to run or test with an older or newer release of the distribution?
Best Answer
For current releases
Current Debian and Ubuntu have multiarch support: You can mix x86_32 (i386) and x86_64 (amd64) packages on the same system in a straightforward way. This is known as multiarch support - see Ubuntu or Debian wiki more information.
See warl0ck's answer for a simple, up-to-date answer.
For old releases
In older releases, Debian and Ubuntu ship with a number of 32-bit libraries on amd64. Install the
ia32-libs
package to have a basic set of 32-bit libraries, and possibly other packages that depend on this one. Your 32-bit executables should simply run if you have all the required libraries. For development, installgcc-multilib
, and again possibly other packages that depend on it such asg++-multilib
. You may findbinutils-multiarch
useful as well, andia32-libs-dev
on Debian. Pass the-m32
option to gcc to compile for ix86.Note that
uname -m
will still showx64_64
if you're running a 64-bit kernel, regardless of what 32-bit user mode components you have installed. Schroot described below takes care of this.Schroot
This section is a guide to installing a Debian-like distribution “inside” another Linux distribution. It is worded in terms of installing a 32-bit Ubuntu inside a 64-bit Ubuntu, but should apply with minor modifications to other situations, such as installing Debian unstable inside Debian stable or vice versa.
Introduction
The idea is to install an alternate distribution in a subtree and run from that. You can install a 32-bit system on a 64-bit system that way, or a different release of your distribution, or a testing environment with different sets of packages installed.
The
chroot
command and system call starts a process with a view of the filesystem that's restricted to a subtree of the directory tree. Debian and Ubuntu ship schroot, a utility that wraps around this feature to create a more usable sub-environment.Install the
schroot
package (Debian) and thedebootstrap
package (Debian). Debootstrap is only needed for the installation of the alternate distribution and can be removed afterwards.Set up schroot
This example describes how to set up a 32-bit Ubuntu 10.04LTS (lucid lynx) alternate environment. A similar setup should work with other releases of Debian and Ubuntu. Create a file
/etc/schroot/chroot.d/lucid32
with the following contents:The line
directory=/32
tells schroot where we'll put the files of the 32-bit installation. The lineusername=yourusername
says the useryourusername
will be allowed to use the schroot. The linegroups=users,admin
says that users in either group will be allowed to use the schroot; you can also put ausers=…
directive.Install the new distribution
Create the directory and start populating it with debootstrap. Debootstrap downloads and installs a core set of packages for the specified distribution and architecture.
You almost have a working system already; what follows is minor enhancements. Schroot automatically overwrites several files in
/32/etc
when you run it, in particular the DNS configuration in/etc/resolv.conf
and the user database in/etc/passwd
and other files (this can be overridden, see the documentation). There are a few more files you may want to copy manually once and for all:There won't be a file
/etc/mtab
or/etc/fstab
in the chroot. I don't recommend using themount
command manually in the chroot, do it from outside. But do create a good-enough/etc/mtab
to make commands such asdf
work reasonably.With the
directory
type, schroot will perform bind mounts of a number of directories, i.e. those directories will be shared with the parent installation:/proc
,/dev
,/home
,/tmp
.Services in the chroot
As described here, a schroot is not suitable for running daemons. Programs in the schroot will be killed when you exit the schroot. Use a “plain” schroot instead of a “directory” schroot if you want it to be more permanent, and set up permanent bind mounts in
/etc/fstab
on the parent installation.On Debian and Ubuntu, services start automatically on installation. To avoid this (which could disrupt the services running outside the chroot, in particular because network ports are shared), establish a policy of not running services in the chroot. Put the following script as
/32/usr/sbin/policy-rc.d
and make it executable (chmod a+rx /32/usr/sbin/policy-rc.d
).Populate the new system
Now we can start using the chroot. You'll want to install a few more packages at this point.
You may need to generate a few locales, e.g.
If the schroot is for an older release of Ubuntu such as 8.04 (hardy), note that the package ubuntu-standard pulls in an MTA. Select
nullmailer
instead of the defaultpostfix
(you may want your chroot to send mail but you definitely don't want it to receive any).Going further
For more information, see the
schroot
manual, the schroot FAQ and theschroot.conf
manual. Schroot is part of the Debian autobuilder (buildd) project. There may be additional useful tips on the Ubuntu community page about debootstrap.Virtual machine
If you need complete isolation of the alternate environment, use a virtual machine such as KVM (qemu-kvm ) or VirtualBox.