Creating JeOS virtual machines in Ubuntu

The two tools I use for creating new vm’s with libvirt are virt-install and vmbuilder. I use virt-install when I will be installing an OS from installable media or using an existing disk image, and vmbuilder when I need to create JeOS based vm’s.

After following the guides at I ended up with two fairly long template commands:

sudo virt-install --hvm -n <hostname> -r <memory> -f <hdd_image> -s <image_size_in_gb> 
-c <iso> --accelerate --connect=qemu:///system --vnc --noautoconsole
sudo vmbuilder kvm ubuntu --suite intrepid --flavour virtual --arch amd64 -o --libvirt qemu:///system 
--part vmbuilder.partition --user myname --name 'My Name' --pass default --addpkg puppet 
--addpkg unattended-upgrades --addpkg acpid --mirror http://apt/ubuntu --tmpfs - 
--firstboot --hostname <hostname> --mem <memory> --dest <hdd_image_basedir>

The command for virt-install is pretty lean compared to the command for vmbuilder. But vmbuilder allows for most of the configuration to be stored in ~/.vmbuilder.cfg. It did take a bit of digging as not a lot about it was on the ubuntu wiki though.

If you are looking for extra help in vmbuilder have a look at:

vmbuilder kvm ubuntu --help

And after setting up the config files below, to create new machines I just use for example:

sudo vmbuilder kvm ubuntu --hostname cacti --mem 256 --dest /srv/libvirt/cacti/

So here is the config I use as an example for anybody who plans on using vmbuilder a lot.


arch = amd64
part = vmbuilder.partition
user = myname
name = My Name
pass = default
tmpfs = -
firstboot =
firstlogin =

mirror = http://apt/ubuntu
suite = intrepid
flavour = virtual
addpkg = puppet, unattended-upgrades, acpid
part = vmbuilder.partition
#ssh_user_key = .ssh/authorized_keys

libvirt = qemu:///system

http://apt/ubuntu is my local approx machine for caching packages. The ssh_user_key is commented out at the moment as it creates the file correctly in the user account, but sets the owner to root.


root 8000
swap 4000

# This script will run the first time the virtual machine boots
# It is ran as root.

locale-gen en_AU.UTF-8

apt-get update
apt-get install -qqy --force-yes openssh-server

The firstboot script just ensures that if I create an image and duplicate it a few times that each machine will have a unique ssh host key. But the image must be duplicated before the first boot.

# This script will run the first time the virtual machine boots
# It is ran as root.

# Prompt for a password change

Because I did not want to put my password in the configuration files as plain text, I only put default as the password and when I login for the first time I am prompted to change it. This will hopefully be fixed when I get the ssh_user_key working though.


<domain type='kvm'>
  <memory>#echo $mem * 1024 #</memory>
    <boot dev='hd'/>
  <clock offset='utc'/>
    <interface type='bridge'>
      <source bridge='br0'/>
      <model type='virtio'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' listen=''/>
#for $disk in $disks
    <disk type='file' device='disk'>
      <source file='$disk.filename' />
      <target dev='hd$disk.devletters()' />
#end for

And the only difference with this template and the default one is this template file sets up bridge networking with virtio by default.

This entry was posted in KVM, libvirt, vmbuilder and tagged , , , , , , . Bookmark the permalink. Both comments and trackbacks are currently closed.

One Comment

  1. March 23, 2009 7:20 am

    That’s some pretty terrific stuff – much appreciated!

One Trackback