Setting Up a 32-bit chroot Environment in Ubuntu

May 30, 2007

A chroot environment is essentially a complete self-contained Linux installation that is nested within the main system. There are several reasons one might want to do this. It can be used to try out new (or old) Ubuntu or Debian releases, for development or packaging for other releases, or for running software that’s designed for another architecture. You can even have several chroot environments on the same system if you like. The chroot environment has it’s root somewhere in your filesystem, usually under /var/chroot, with its own libraries, system binaries, etc. The chroot command is used to change the root directory to that of the chroot environment so that the rest of the system is hidden.

I am mainly interested in the last of the three usages I mentioned above. Specifically, I need to run i386 programs on my AMD 64 system when there are no native 64-bit versions available. I will outline the steps I took to create a 32-bit chroot environment on Ubuntu Feisty Fawn (7.04). I will make the root directory /var/chroot/feisty_i386, but you can name it whatever you like. These steps should also translate to previous and future releases by simply changing feisty to breezy or warty or whatever comes next (see Releases on the Ubuntu Wiki).

The following instructions assume you are root, hence the # prompt. First, you need to install debootstrap which allows you to install a basic Ubuntu (which based on Debian) system from scratch, without the need for apt or dpkg. Installing from the repository should be fine as long as the chroot environment you wish to belongs to the same release that’s running on the main system. That is, if you want a Feisty i386 chroot environment on a Feisty amd64 system, go ahead and install from the repositories:

# apt-get install debootstrap

If you want a Breezy amd64 chroot on a Feisty amd64 system, you should download an older version of the debootstrap package. See DebootstrapChroot on the Ubuntu Wiki for more details.

You will also need the dchroot package which provides a convenient way to use the various chroot environments you set up. You will need to install the package, make sure that the chroot directory of your choice exists, and configure dchroot:

# apt-get install dchroot
# mkdir /var/chroot

To configure dchroot, edit the file /etc/dchroot.conf and add the line

feisty_i386 /var/chroot/feisty_i386

making sure to use the appropriate path and label for your system.

The next step is to install the new environment. I want an i386 Feisty environment so I use:

# debootstrap --variant=buildd --arch i386 feisty /var/chroot/feisty_i386 http://archive.ubuntu.com/ubuntu/

Your new system should now be installed. In order to configure it so that it’s usable, and to be able to install packages from the network, do the following:

# cp /etc/resolv.conf /var/chroot/feisty_i386/etc/resolv.conf
# cp /etc/apt/sources.list /var/chroot/feisty_i386/etc/apt/
# chroot /var/chroot/feisty_i386/
# apt-get update
# apt-get install gnupg locales dialog  # Some fundamental packages
# apt-get update
# locale-gen en_US.UTF-8  # Change this to your locale.
# tzconfig  # Configure your time zone.
# exit

Note that if you install a different release in the chroot, you should edit your sources.list to point to the correct repositories. You probably also want to install some basic packages like vim so that you can edit any config files you need to. Switching to your new chroot is as easy as running dchroot -d as root (or dchroot -d -c feisty_i386if you have more than one chroot).

The above only works if you are root. You may want to set things up so that you can chroot as a normal user and still have access to your home directory. This requires copying the user and group configuration files from the main system. You can hard link them if they are on the same partition. To copy them over:

# cp /etc/passwd /var/chroot/feisty_i386/etc/
# sed 's/\([^:]*\):[^:]*:/\1:*:/' /etc/shadow | tee /var/chroot/feisty_i386/etc/shadow
# cp /etc/group /var/chroot/feisty_i386/etc/
# cp /etc/hosts /var/chroot/feisty_i386/etc/

The sed line above removes the encrypted passwords from the shadow file. They aren’t needed since no one will be logging in to the chroot environment. This is for security reasons, to prevent the shadow file from being available in two places.

If you would rather hard link the files so they remain synchronized:

# cd /var/chroot/feisty_i386/etc
# rm passwd shadow group gshadow hosts
# ln /etc/passwd
# ln /etc/shadow
# ln /etc/group
# ln /etc/gshadow
# ln /etc/hosts

If you are paranoid about having your shadow file in two places, you can still use the sed line above instead of hard linking the shadow file. Just remember that if you add or remove users, you will need to update the file in the chroot environment as well if you want them to be able to access it.

If you want users to be able to use sudo in the chroot:

# cp /etc/sudoers /var/chroot/feisty_i386/etc/
# chroot /var/chroot/feisty_i386
# dpkg-reconfigure passwd
# passwd <username>
# apt-get install sudo

Add the following lines to /etc/sudoers (in the chroot):

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

Finally, if you want your home directory and other filesystems to be available in the chroot, edit /etc/fstab (the real one for the main system) and add the following:

/home         /var/chroot/feisty_i386/home        none    bind      0 0
/tmp          /var/chroot/feisty_i386/tmp         none    bind      0 0
/media/cdrom  /var/chroot/feisty_i386/media/cdrom none    bind      0 0
/dev          /var/chroot/feisty_i386/dev         none    bind      0 0 
proc-chroot   /var/chroot/feisty_i386/proc        proc    defaults  0 0
devpts-chroot /var/chroot/feisty_i386/dev/pts     devpts  defaults  0 0

Make sure the cdrom mount point exists:

# mkdir /var/chroot/feisty_i386/media/cdrom

then mount all the filesystems:

# mount -a

If you want the prompt to give the chroot name when you are using it, edit /var/chroot/feisty_i386/etc/debian_chroot and add the line

feisty_i386

making sure to change this to whatever you named your chroot.

Now you can use the chroot as a normal user by running dchroot -d, or dchroot -d -c feisty_i386 if you have more than one.

References