Foreign Chroots
Let me tell you about the latest dubious idea I’ve carried through to completion. I promise that thare’s actual motivation for what I’m about to show, but that doesn’t make it substantially more aboveboard. If you really want to know them, they’re at the end. Anyway, let’s talk about
Making a Fedora chroot inside Debian
First, some precautions. Be careful about kernel versions: the kernel version provided by your Fedora release needs to be <= the one provided by your Debian release else badness may result. What I’m describing here is not an effective sandbox; it is instead useful for presenting an alternate interface to an existing system (i.e., the Fedora interface to an existing Debian). Do not rely on it for security properties because it doesn’t really have any.
Prep work
Let’s start off with some basics.
mkdir fedora
We need a place for the filesystem to live. All commands for the rest of the guide will be given relative to the parent of the fedora directory.
aptitude install yum
Here’s the first piece of magic: Yum is packaged for Debian. So are RPM and a couple other related tools, which will get pulled in here. There’s also a tool called Rinse that we could be using in theory, but its repositories are out of date and it doesn’t seem to work.
Download all the things
To use Yum, we need to give it repository links to pull from. This is a modified version of a repo from fc20 which notably removes all version substitution; you can also set the appropriate settings in /etc/yum/vars if you prefer. Here’s the contents of /etc/yum.repos.d/fedora.repo :
[fedora]
name=Fedora 20 - x86_64
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/20/Everything/x86_64/os/
metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-20&arch=x86_64
enabled=1
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-20-x86_64
skip_if_unavailable=False
[fedora-debuginfo]
name=Fedora 20 - x86_64 - Debug
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/20/Everything/x86_64/debug/
metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-20&arch=x86_64
enabled=0
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-20-x86_64
skip_if_unavailable=False
[fedora-source]
name=Fedora 20 - Source
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/20/Everything/source/SRPMS/
metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-source-20&arch=x86_64
enabled=0
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-20-x86_64
skip_if_unavailable=False
Okay, let’s deploy a system. Ready?
yum --nogpg --installroot=`pwd`/fedora install yum fedora-release rxvt-unicode-256color
Alright, in order then. We need –nogpg because we don’t have the Fedora keyring. –installroot specifies what directory Yum should use instead of / as a base. We need to install Yum because it will be in the chroot. fedora-release gets us necessary fedora components. Finally, rxvt-unicode-256color is my terminal emulator, and for unknown reasons Fedora doesn’t provide a package which contains all terminfos.
Tweaks
Most people like their chroots to be able to access the Internet:
$ cp /etc/resolv.conf fedora/etc/resolv.conf
$ cp /etc/hosts fedora/etc/hosts
Then we can actually resolve IPs.
echo 20 > fedora/etc/yum/vars/releasever
This sets up your Fedora to be fc20; substitute 20 as needed.
Let’s go!
Finally, let’s make a deployment script:
$ cat enter_fedora.sh
#!/bin/sh -xe
mount --bind /proc fedora/proc
mount --bind /sys fedora/sys
mount --bind /dev fedora/dev
mount --bind /dev/shm fedora/dev/shm
mount --bind /dev/pts fedora/dev/pts
chroot fedora/ || true
umount fedora/dev/pts
umount fedora/dev/shm
umount fedora/dev
umount fedora/sys
umount fedora/proc
And away we go:
./enter_fedora.sh
Enjoy your chroot!
Once you’re inside
You should probably update your Fedora installation now that you have it:
$ yum clean all
$ yum update
Why did you do this?
Disk access times. For large, complex buildjobs that run test suites, I see large speedups from this approach. Coupled with ccache, it reduces run times by about a third over running in a VM (libvirt/kvm + virtio).