Using xen-tools on Fedora blog already hosted a very nice post by Ian Jackson, greatly explaining how useful xen-tools is for automatically installing Debian (and Debian-derived) VMs. Now, if this all happens on a Debian host, it is nice and easy, as getting xen-tools is just a matter of apt-get install-ing it. But what if your host machine runs something else, for instance, a copy of Fedora? As a matter of fact, starting from Fedora 16, Xen is quite easy to install and use on Fedora, making it interesting to cover this case too.

There is no xen-tools RPM package, thus we need to go the good old way: download the sources, compile and  install them. Luckily enough, this is not difficult at all, and this blog post will explain in details how to achieve it.

Installing Fedora and Xen

So, let’s assume that you just finished installing the new and shiny Spherical Cow. Official instructions and advice on that are available here. The first thing to do now is to install Xen there. This has become very simple these days; all that’s needed is the following (where an # prompt means the command must be run as root):

# yum install xen

Followed by a reboot. Note that Xen will not be the default boot option, so you’ll need to make sure to select it from the GRUB2 menu. You can also make Xen the default by setting GRUB_DEFAULT=saved in your /etc/defaults/grub.conf and running the following:

# grub2-mkconfig -o /boot/grub2/grub.cfg
# XEN=$(grep ^menuentry /boot/grub2/grub.cfg | cut -f2 -d"'" | tail -n1)
# grub2-set-default $XEN

If the libvirt‘s services are needed too, some more packages must be installed, but this is out of the scope of this post. For more information on how to install Xen on Fedora, check the Fedora pages on’s Wiki, in particular, this one: Fedora Host Installation.

What is important is that, at the end of this step, querying for Xen related installed package looks at least as follows:

$ rpm -qa | grep xen

Installing Prerequisite Packages

As we are installing from sources, the distro’s package manager is not able to help with dependencies, and we need to sort them out manually. At the time of writing, on an updated Fedora 18, all the packages needed for having xen-tools working properly can be installed like this:

# yum install debootstrap perl-Text-Templateh \
              perl-Config-IniFiles perl-File-Slurp \
              perl-File-Which perl-Data-Dumper'

And yes, that’s it! We are ready to go fetch the sources on the project Web site. Just very quickly, notice the presence of debootstrap among the packages. Well, the fact that a Fedora debootstrap package exists is what makes things so easy… Thanks a lot to jvcelak for the good job maintaining it. :-)

Downloading and Installing xen-tools

The xen-tools sources are available here, if you are interested in a released version, and here, if you want to fetch the latest development branch. For convenience, here it is how to achieve both. Released version (4.3.1, at the time of this post):

$ wget
$ tar zxvf xen-tools-4.3.1.tar.gz

And development version (of course, for this, you need git to be installed):

$ git clone git:// xen-tools.git

After that, enter either xen-tools-4.3.1 or xen-tools.git and proceed with the installation, by running:

# make install

(Auto)Installing your first VM

Well, believe it or not, we’re done: all set for starting provisioning debian-alike VMs via the super-handy xen-create-image! For an example, try this:

# xen-create-image --genpass=0 --memory=1024M --noswap --dhcp \
                   --password="xenroot" --pygrub --size=8G \
                   --vcpus=2 --arch=amd64 --bridge=virbr0 \
                   --hostname=wheezy64 --lvm=vms \
                   --mirror= \
                   --install-method=debootstrap \

Most of the parameters have talking enough names, and don’t need much commenting. Just notice that --lvm takes the name of the volume group name where the logical volume for the disk of the new VM should be created (use vgscan to see the existing VGs). Also, --size is how big you want that disk to be, and --bridge must point to the configured bridge (as reported by ifconfig or brctl show). For more information on the other parameters, check out man xen-create-image and/or Ian’s post. Since we are not on a Debian host, it is important to specify a --mirror=URL option. For a list of valid URLs, this is the official list of Debian mirrors. The tool will complain a bit about not finding anything useful in /etc/apt/sources.list, but that is harmless (hey, you’re running on Fedora, dude!).

# xl create -c /etc/xen/wheezy64
Debian GNU/Linux 7.0 wheezy64 hvc0
wheezy64 login: root
Last login: Mon Jan 21 17:17:16 CET 2013 from on pts/0
Linux wheezy64 3.2.0-4-amd64 #1 SMP Debian 3.2.35-2 x86_64

The programs included with the Debian GNU/Linux system are free
software; the exact distribution terms for each program are described
in the individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@wheezy64:~# virt-what
root@wheezy64:~# free -m
             total      used      free    shared   buffers    cached
Mem:           998        37       960         0         1        16
-/+ buffers/cache:        19       979
Swap:            0         0         0

Non Debian-alike VMs

Last but not least, although Debian and Debian-alike distros are the preferred targets of xen-tools, it is possible to deal with RPM based distros, like CentOS, OpenSuSE and Fedora itself, via rinse. Again, it is something that needs to be fetched (e.g., with git) and installed manually:

$ git clone git:// rinse.git
$ cd rinse.git
# make install

After that, the following will become possible:

# xen-create-image --genpass=0 --memory=1024M --noswap --dhcp \
                   --password="xenroot" --pygrub --size=8G \
                   --vcpus=2 --arch=amd64 --bridge=virbr0 \
                   --install-method=rinse --hostname=f16-x64 \
                   --lvm=vms --dist="fedora-16" --cache=no

Where this is the full list of distributions currently supported by rinse:

$ rinse --list-distributions 
The following distributions are available: