English • 中文
This article shows you how to use debootstrap to build a chroot environment that you can use for various needs, from trying out the latest (or even oldest ;) Ubuntu releases, or even working with Debian releases, to utilizing the chroot as a package building environment.
You can work anywhere - this Howto will assume you're using
/var/chroot . It will also assume that you want to install a BreezyBadger chroot; if you are going to use other Ubuntu releases, replace breezy below with warty for WartyWarthog, hoary for HoaryHedgehog, dapper for DapperDrake, edgy for EdgyEft, or "feisty" for FeistyFawn.
Getting and installing debootstrap
For the least pain and gnashing of teeth, please get the Ubuntu binary packages manually:
- http://packages.ubuntu.com/hoary/admin/debootstrap - If you want a hoary chroot
- http://archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/debootstrap_0.3.1.4ubuntu4_all.deb - If you want a breezy chroot
- http://archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/debootstrap_0.3.3.0ubuntu5~dapper1_all.deb - If you want a dapper chroot
- http://archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/debootstrap_0.3.3.0ubuntu7_all.deb - If you want a edgy chroot
- http://archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/debootstrap_0.3.3.2ubuntu3_all.deb - If you want a feisty chroot (if that's not available go to http://archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/ and find the newest one)
Example: Terminal session
wget-ing and installing the latest Feisty debootstrap:
wget http://archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/debootstrap_0.3.3.2ubuntu3_all.deb sudo dpkg --install debootstrap_0.3.3.2ubuntu3_all.deb
Installing and configuring dchroot
dchroot is a convenient means of managing chroot environments; with this tool you can have both Breezy, Dapper, and even Debian Sid chroots in your Ubuntu install, and using a chroot environment is a simple as
dchroot -c dapper -d ;)
To get it
dchroot working in your system, just do the following in a Terminal:
sudo apt-get install dchroot sudo mkdir /var/chroot # Remember, we assume our chroot is here sudo editor /etc/dchroot.conf
Then append this line in
Setting up your chroot with debootstrap
If you want a 32-bit chroot on amd64 add
--arch i386 to this command line. If you use the chroot to build packages add
--variant=buildd . Change breezy to according to your needs to warty, hoary, or dapper, or leave as is for breezy chroot.
To actually install the base chroot, open a Terminal and do:
sudo debootstrap --variant=buildd --arch i386 breezy /var/chroot/ http://archive.ubuntu.com/ubuntu/
debootstrap will then build a BreezyBadger chroot in
/var/chroot/, getting the base packages in
http://archive.ubuntu.com/ubuntu/, and, depending on the given additional options (in square brackets,)
debootstrap will build a chroot for the given architecture and variant.
debootstrap finishes successfully, you'll be left with a base chroot in
/var/chroot, which is, well, hardly suitable for anything very interesting. To actually get our chroot to work and be able to, say, grab packages from the network, do the following right after
sudo cp /etc/resolv.conf /var/chroot/etc/resolv.conf sudo cp /etc/apt/sources.list /var/chroot/etc/apt/ sudo sed -i s/dapper/breezy/g /var/chroot/etc/apt/sources.list #point apt-get to the right release sudo chroot /var/chroot/ mount /proc apt-get update apt-get install wget debconf devscripts gnupg nano #For package-building apt-get update #clean the gpg error message apt-get install locales dialog #If you don't talk en_US locale-gen en_GB.UTF-8 # or your preferred locale tzselect; TZ='Continent/Country'; export TZ #Configure and use our local time instead of UTC; save in .profile exit
You can stop here if you want and have a simple chroot that you use as root (
sudo chroot /var/chroot). If you want to use your chroot as another user and have access to your normal /home etc inside the chroot, carry on ;)
If you want to build a Debian chroot on an Ubuntu system you need to point it at a Debian archive:
sudo debootstrap --arch i386 sid sid/ http://ftp.uk.debian.org/debian/
Setting up a dchroot (non-root) environment
dchroot makes it possible to use your newly-built chroot even as a non-root user. Hence, you can configure your chroot environment in such a way that you can even use your existing
/home as the chroot's
/home, thereby saving you some expensive moving in between homes, as well as making package building/testing a LOT more convenient.
To do this, first fix the user and root password:
sudo cp /etc/passwd /var/chroot/etc/ sudo sed 's/\([^:]*\):[^:]*:/\1:*:/' /etc/shadow | sudo tee /var/chroot/etc/shadow sudo cp /etc/group /var/chroot/etc/ sudo cp /etc/hosts /var/chroot/etc/ # avoid sudo warnings when it tries to resolve the chroot's hostname
Then enable sudo and setup your passwords for root and the first sudo user in the `admin` group:
sudo cp /etc/sudoers /var/chroot/etc/ sudo chroot /var/chroot/ dpkg-reconfigure passwd passwd <your first ubuntu user in the admin group>
Next, install the sudo package to be able to use it being in chroot:
apt-get install sudo exit
Finish things up:
sudo editor /etc/fstab
Add these lines: (/media/cdrom is optional, of course, and you might have to create the dir in the chroot)
/home /var/chroot/home none bind 0 0 /tmp /var/chroot/tmp none bind 0 0 /media/cdrom /var/chroot/media/cdrom none bind 0 0 /dev /var/chroot/dev none bind 0 0 proc-chroot /var/chroot/proc proc defaults 0 0 devpts-chroot /var/chroot/dev/pts devpts defaults 0 0
sudo mount -a
The default bash path includes chroot information. To make this visible:
sudo chroot /var/chroot/ echo mychroot > etc/debian_chroot exit
Now when you want to use your chroot (you may omit the
-c mychroot if there's only one, or you just want the first one in the file). The
-d parameter means that your environment will be preserved, this is generally useful if you want chrooted applications to seamlessly use your X server, your session manager, etc.
dchroot -c mychroot -d
Tada! Now you can switch to and from your main
/var/chroot/, without even becoming root!
Shortcuts / Usage
you can type dchroot -d "command" and it executes that command in the chroot. I have this script do_chroot in /usr/local/bin:
#!/bin/sh /usr/bin/dchroot -d "`echo $0 | sed 's|^.*/||'` $*"
I had trouble with quoting in the above script. This one works better for me. ~JPKotta
args="" for i in "[email protected]" ; do args="$args '$i'" done /usr/bin/dchroot -d -- "$0" "$args"
Then I create a symbolic link from that to the command I want to execute in the chroot, e.g.:
ln -s /usr/local/bin/do_chroot /usr/local/bin/firefox
which will execute firefox in the chroot environment when I launch it in my normal 64 bit environment. To launch my amd64 firefox I can type /usr/bin/firefox. Instead if you want you can just create a script for launching the 32bit firefox e.g.:
#!/bin/bash dchroot -d "firefox"
put it in /usr/local/bin and add it to the gnome menu. If you're going to start a program that only works in 32bit, first type dchroot -d and you'll be in the 32 bit environment.
Some missing points are covered on this external article: http://ornellas.apanela.com/dokuwiki/pub:multiarch. From unknown Sun Apr 17 05:43:14 +0100 2005 From: Date: Sun, 17 Apr 2005 05:43:14 +0100 Subject: Using symlinks for passwd, groups, shadow, etc..? Message-ID: <[email protected]https://www.ubuntulinux.org> Wouldn't it be possible to use symlinks for the files that get copied into the chroot? Like /etc/hosts? Would it work with /etc/passwd and the like? From MichaelShigorin Sun Apr 17 13:42:38 +0100 2005 From: Michael Shigorin Date: Sun, 17 Apr 2005 13:42:38 +0100 Subject: nope Message-ID: <[email protected]https://www.ubuntulinux.org> ...but you can mount --bind them one be one. :) From goofrider Thu May 12 19:26:45 +0100 2005 From: goofrider Date: Thu, 12 May 2005 19:26:45 +0100 Subject: chroot and symlinks Message-ID: <[email protected]https://www.ubuntulinux.org> You can't symlinks from inside the chroot to somewhere outside of it, because once you chroot into it, the new chroot will becomes `/`, and all symlinks will be resolved relative to this new `/`. Use `mount --bind` instead (though hard links should work too). --GoofRider 2005-05-12 From Sam Fri May 13 09:22:44 +0100 2005 From: Sam Date: Fri, 13 May 2005 09:22:44 +0100 Subject: mount -a Message-ID: <[email protected]> You can use $ sudo mount -a for mounting all the entries in fstab instead of mounting them one by one. From LukaszStelmach Sun May 15 00:06:59 +0100 2005 From: Lukasz Stelmach Date: Sun, 15 May 2005 00:06:59 +0100 Subject: Using symlinks Message-ID: <[email protected]> You can make hardlink to files (but only when your chroot dir is on te same partition): ln /etc/passwd /var/chroot/etc/ From: Elmo, 21.12.05 Does anyone know howto enable DRI from inside a 32bit chroot, 'cause if I mount --bind /dev/dri chroot/dev/dri I get the following error: "DDX driver parameter mismatch: got 848 bytes, but expected 840 bytes. libGL error: InitDriver failed" (glxinfo) I'd really like to get doom3 working on my amd64 install. 26.12.05, Elmo: I know, it should work natively, but I have problems with other games aswell, so getting dri working from a chroot would be great=) 26.12.05, Elmo: At debian-amd64 list(http://lists.debian.org/debian-amd64/2005/02/msg00807.html), around February 05, is said that it's not possible at the moment. Got to find another way around my problem, will propably post to ubuntu forums. 10.06.06 Just a note from a person who ruined his system: After all this is done do not go and delete things from /var/chroot willy-nilly as it will delete the files from the linked directory as well. I found this out only after my entire /home directory was wiped out when I tried to free up some disk space by deleting the files from the chroot directory. Thanks to my foolishness I emptied root's trash before I realized what I'd done. It's been a while since my last backup so I lost everything from Documents, etc for the last year or so. From: Murray Cumming 06.10.05: I had to do "apt-get install language-pack-en" to avoid the "Locale not supported by C library." warnings. Even "sudo dpkg-reconfigure locales" gave a "perl: warning: Setting locale failed." error until I did this. And that was even after I did a whole "sudo apt-get ubuntu-desktop" in the chroot.