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?
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.
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, install
gcc-multilib , and again possibly other packages that depend on it such as
g++-multilib. You may find
binutils-multiarch useful as well, and
ia32-libs-dev on Debian. Pass the
-m32 option to gcc to compile for ix86.
uname -m will still show
x64_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.
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.
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.
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.
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:
[lucid32] description=Ubuntu 10.04LTS 32-bit directory=/32 type=directory personality=linux32 users=yourusername groups=users,admin
directory=/32 tells schroot where we'll put the files of the 32-bit installation. The line
username=yourusername says the user
yourusername will be allowed to use the schroot. The line
groups=users,admin says that users in either group will be allowed to use the schroot; you can also put a
Create the directory and start populating it with debootstrap. Debootstrap downloads and installs a core set of packages for the specified distribution and architecture.
mkdir /32 debootstrap --arch i386 lucid /32 http://archive.ubuntu.com/ubuntu
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:
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
There won't be a file
/etc/fstab in the chroot. I don't recommend using the
mount command manually in the chroot, do it from outside. But do create a good-enough
/etc/mtab to make commands such as
df work reasonably.
ln -s /proc/mounts /32/etc/mtab
directory type, schroot will perform bind mounts of a number of directories, i.e. those directories will be shared with the parent installation:
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).
#!/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
Now we can start using the chroot. You'll want to install a few more packages at this point.
schroot -c lucid32 sudo apt-get update apt-get install lsb-core nano ...
You may need to generate a few locales, e.g.
locale-gen en_US en_US.utf8
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 default
postfix (you may want your chroot to send mail but you definitely don't want it to receive any).
For more information, see the
schroot manual, the schroot FAQ and the
schroot.conf manual. Schroot is part of the Debian autobuilder (buildd) project. There may be additional useful tips on the Ubuntu community page about debootstrap.
Correct answer by Gilles 'SO- stop being evil' on January 3, 2021
If you just have a 32-bit binary you'd like to run on a modern 64-bit Debian/Ubuntu system, do the following:
dpkg --add-architecture i386 apt update apt install libc6-i386
This has been tested on Debian 9.
Answered by cjs on January 3, 2021
Since Ubuntu 11.04 (natty) and Debian 7.0 (wheezy) introduced multiarch support, 32-bit and 64-bit libraries can coexist on one system. To install a 32-bit library libXX, first add the necessary 32bit architecture to your system:
sudo dpkg --add-architecture i386
Then install the 32bit library:
sudo apt-get install libXX:i386
The ia32-libs package. As of Ubuntu 12.04 precise, it no longer contains any libraries, it only pulls in
libXX:i386 packages as dependencies.
The compile part is rather easy for C and C++ programs, add
CXXFLAG, which will make generated program 32bit, e.g
export CFLAGS="-m32" gcc main.c -o main
This works for makefile-based projects as well.
Answered by daisy on January 3, 2021
1 Asked on December 23, 2020 by user3450148
0 Asked on December 23, 2020 by dan-schneider
0 Asked on December 22, 2020 by alpav99
1 Asked on December 21, 2020 by sunwave121
1 Asked on December 20, 2020 by vladius
1 Asked on December 20, 2020 by cdxun
3 Asked on December 19, 2020 by sss
1 Asked on December 19, 2020 by user2358844
1 Asked on December 19, 2020 by kryptic-coconut
1 Asked on December 19, 2020 by jademalo
3 Asked on December 18, 2020 by eduardo-lucio
3 Asked on December 18, 2020 by peter-l
0 Asked on December 18, 2020 by timyorgut
6 Asked on December 17, 2020 by mirage
Get help from others!