Wednesday, January 23, 2013

Devcloud Image Customization

Having recently worked on ProActive Cloudstack integration, I would like to share some challenges I faced and some tools that helped me. We present you a short video showing dynamic nodes deployment on a Cloudstack infrastructure.

Cloudstack is an open source cloud platform to build public, private or hybrid clouds. It offers a VirtualBox image, called DevCloud, that allows running a (virtual) cloud on a local machine without requiring a physical infrastructure. It basically consists of a Xen host virtual machine that will spawn Xen virtual machines as you create Cloudstack instances.

During the integration of Cloudstack with ProActive one of the challenges was to build a template allowing us to spawn instances that run as ProActive nodes. Consequently you are able to create elastic ProActive NodeSources that can grow more compute resources required. DevCloud comes with a lightweight ttyLinux template that is well suited to run several Cloudstack instances on your development machine. As ProActive requires only Java to run, I just needed to install it, unpack ProActive installation and create a boot script that would launch the ProActive node.

Being familiar with Debian based distribution, I first tried to create a template from an ISO image but then moved back on using the ttyLinux template as I hit issues regarding virtualization. It seems quite hard to create a new template using an ISO image on a paravirtualized Xen server. The ttyLinux template image comes with a disk of 50 MB only, so the JRE itself would not fit on it. The image is using VHD format and it seems quite hard to find useful information on the internet on how to work with. Here is how I managed to resize, mount and edit the image:

  • All operations were performed on the DevCloud virtual machine as it has all the required tools installed.
  • You can download the ttyLinux image from the Cloudstack web interface
  • First, we start by expanding the VHD image
    • vhd-util resize -n ttyLinux.vhd  -s 500 -j log.log
      • size is in MB
  • Now we need to expand the partition size otherwise the ttyLinux running with this template will not see the extra space
    • It can be done by attaching the VHD image as a device with blktap
device=$(tap-ctl allocate)
deviceid=${device#/dev/xen/blktap-2/tapdev}

spawn=$(tap-ctl spawn)
pid=${spawn#tapdisk spawned with pid }

tap-ctl attach -p $pid -m $deviceid
tap-ctl open -p $pid -m $deviceid -a vhd:ABSOLUTE_PATH_TO_VHD_IMAGE

  • A new device has been created under /dev/xen/blktap-2/, called tapdev (followed by the device id, let’s assume tapdev4), to check if it exists we can use fdisk
    • fdisk -l /dev/xen/blktap-2/tapdev$deviceid
  • resize2fs can now be used to resize the partition
    • resize2fs /dev/xen/blktap-2/tapdev4 1G
      • here we expand the partition to 1 gigabytes
      • a filesystem check might be required (fsck), it is ok to run it
  • Next are the commands to destroy the device properly
    • $pid and $deviceid are the values use when creating the device
tap-ctl close -m $deviceid -p $pid
tap-ctl detach -m $deviceid -p $pid
tap-ctl free -m $deviceid

Since the VHD image is present as a device, we can mount it and directly edit files on it.
  • To mount the device
    • mount /dev/xen/blktap-2/tapdev4 mounted_image/
  • For my needs, I copied Java and ProActive and created a boot script that runs a ProActive node
  • To un mount the device
    • umount mounted_image/

Installing the template in Cloudstack is just a matter of uploading the image file using the web client. As it requires downloading a file from a HTTP URL, "python -m SimpleHTTPServer 80" comes handy to expose local files on port 80.

We have now a custom made VHD image ready to use with Cloudstack!

 Sources: