Thursday, April 17, 2014

Using cloud images with Ganeti

Ganeti is an open source private cloud platform. It is primarily developed by Google. It is written in python, with bits of haskell thrown in for flair.

Virtual machine creating in ganeti is done through debootstrap or traditional methods such as PXE loading or cd-rom/iso interactive installations.

This approach is slower and more error prone than the image-based VM creation favored by other private cloud software such as Openstack.

Most major distributions that identify as 'cloud ready' produce regular 'cloud images' to be deployed to public clouds like Amazon or private clouds such as Openstack.

Out of the box, ganeti does not support these cloud images. This post will describe our super janky way of getting them to work. We present a method for launching ganeti vms quickly from stock cloud images. Future work may come of this where we develop what ganeti calls a 'os install template.' If we do that, expect a follow up post on this blog.

This work has been done in collaboration with nightfly19.

First, we collect the Ubuntu cloud image from the web:

# wget ''

This file is a disk image containing a disk label, a bootloader, a partition table, and a partition with the root filesystem of the ubuntu server os. From the README:

- <prefix>-disk1.img
  This is a qcow2 compressed disk image.  It can be uploaded to OpenStack
  or booted directly via kvm.  You should probably uncompress the image
  (qemu-img convert) before use in non-testing environment.

To prove this, lets inspect it with qemu-img:

# qemu-img info precise-server-cloudimg-amd64-disk1.img
image: precise-server-cloudimg-amd64-disk1.img
file format: qcow2
virtual size: 2.2G (2361393152 bytes)
disk size: 248M
cluster_size: 65536

This file is in the format qcow2 which stands for qemu copy on write version 2. This is the file format used by kvm with qemu. Since we're using ganeti  of raw kvm, we need to apply this image to the disk of a ganeti virtual machine. Furthermore, this image is compressed so we will first uncompress it:

# qemu-img convert -O qcow2 precise-server-cloudimg-amd64-disk1.img precise64.img

This command will take several seconds to run.

# ls
precise64.img  precise-server-cloudimg-amd64-disk1.img

Now we must convert the uncompressed qcow image into a raw disk, the exact byte for byte representation of a block device, suitable for dding directly onto the ganeti instance block device.

# qemu-img convert precise64.img -O raw precise64raw.img

We can then verify that the precise64raw.img file contains valid partition data:

# fdisk -l precise64raw.img

Disk precise64raw.img: 2361 MB, 2361393152 bytes
4 heads, 32 sectors/track, 36032 cylinders, total 4612096 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000a23e

           Device Boot      Start         End      Blocks   Id  System
precise64raw.img1   *        2048     4194303     2096128   83  Linux

This precise64raw.img can be reused every time we want to create a new virtual machine.

The file we'll use to customize each instance of the ubuntu cloud vm is created by a script cloud-localds. On newer ubuntu releases, this script is available from packages. On older releases download it from here:

This configuration is part of an ubuntu specification called NoCloud. You can research it for more control flags.

#cat > my-user-data <<EOF
password: passw0rd
chpasswd: { expire: False }
ssh_pwauth: True

# /usr/local/bin/cloud-localds my-seed.img my-user-data
wrote my-seed.img with filesystem=iso9660 and diskformat=raw

With these two images created (my-seed.img is very small,) we can create the ganeti instance. Assuming you have set up networking in your environment, you can use this:

# gnt-instance add --disk-template plain -o image+default --disk 0:size=10g --net 0:mac="cc:aa:77:bb:1c:2d" -H serial_console=true --no-install --no-start 
Thu Apr 17 01:16:04 2014  - INFO: Selected nodes for instance via iallocator hail:
Thu Apr 17 01:16:05 2014 * disk 0, size 10.0G
Thu Apr 17 01:16:05 2014 * creating instance disks...
Thu Apr 17 01:16:05 2014 adding instance to cluster config
Thu Apr 17 01:16:07 2014  - INFO: Waiting for instance to sync disks
Thu Apr 17 01:16:07 2014  - INFO: Instance's disks are in sync

# gnt-instance modify --disk add:size=1g
Thu Apr 17 01:20:07 2014 * disk 1, size 1.0G
Thu Apr 17 01:20:08 2014  - INFO: Waiting for instance to sync disks
Thu Apr 17 01:20:08 2014  - INFO: Instance's disks are in sync
Modified instance
 - disk/1 -> add:size=1024,mode=rw
Please don't forget that most parameters take effect only at the next (re)start of the instance initiated by ganeti; restarting from within the instance will not be enough.

Make sure the instance is down:

# gnt-instance list        kvm        image+default   ADMIN_down      -

Activate its disks:

# gnt-instance activate-disks solarium

DD the images to the disks:

# dd if=precise64raw.img of=/dev/ganeti/78f5c111-f6a0-4446-a590-66ed1d6c2b04.disk0
4612096+0 records in
4612096+0 records out
2361393152 bytes (2.4 GB) copied, 68.8486 s, 34.3 MB/s

# dd if=my-seed.img of=/dev/ganeti/4a9a53e0-e2b7-49c7-a09f-d0dafda9fb28.disk1
732+0 records in
732+0 records out
374784 bytes (375 kB) copied, 0.0289169 s, 13.0 MB/s

Now deactivate the disks and start the instance:

# gnt-instance start solarium
Waiting for job 4670 for ...

This machine by default will write all its output to the serial console. Watch this with:

# gnt-instance console solarium


This will show a combination of standard dmesg from a system booting and the output of the cloud-init/NoCloud scripts. Part of what will be echoed are the ip address and routing table of the instance:

mountall: Event failed
ci-info: lo    : 1       .
ci-info: eth0  : 1   cc:aa:77:bb:1c:2d
ci-info: route-0:         eth0   UG
ci-info: route-1:   eth0   U
cloud-init start running: Thu, 17 Apr 2014 08:38:07 +0000. up 4.66 seconds

Then you will see the host key randomart pictures for ssh as well as the fingerprints:

ec2: #############################################################
ec2: 1024 9e:55:82:94:82:db:59:c1:60:1f:94:38:3b:36:af:83  root@ubuntu (DSA)
ec2: 256 22:b5:0c:45:83:5e:ee:a4:fb:4f:96:c7:01:88:26:7a  root@ubuntu (ECDSA)
ec2: 2048 cf:0f:ea:cf:ff:89:ed:7d:f5:cb:3e:48:e1:9e:2d:72  root@ubuntu (RSA)
ec2: #############################################################
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAQAEcZ08DnGNr6HF8UcRsOge98sYVOm37sSZyj+NplKtBl+oL6lqCmwqgNwrz1F497ym2XVT7IEpXJ5NyuMqsk= root@ubuntu
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvIu5vC8FaGe4Hk+A280VGi07CsXFiDXpuA5q2ajTnMKa0Wy8PSWArZthSZrYpeoHYFL0ac+8mxfQMv8wafnxSiNkaYLOQ1GZr0lZr08oGry9FzD4w+kzqRudmE29aivffmNj4Qe
vLn8pW+xt4rCHhlbGoEsx5sUzbscrx4p root@ubuntu

The machine should dhcp itself and be  ready to accept password authentication momentarily.

# ssh
The authenticity of host ' (' can't be established.
ECDSA key fingerprint is 22:b5:0c:45:83:5e:ee:a4:fb:4f:96:c7:01:88:26:7a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ',' (ECDSA) to the list of known hosts.'s password:
Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.2.0-60-virtual x86_64)

This was a pretty rough cut of the process. We hope to streamline it and make software that evens this process out. One obvious place to look for making things faster is placing the precise64raw.img file in /dev/shm so that we read from memory and write to disk, instead of reading and writing from disk.


1 comment:

  1. فكرة برمجية لتقنية المعلومات . متخصصين في إنتاج البرمجيات تقديم حلول مميزة لادارة اعمالك
    وإنطلاقا من خبرتنا فى مجال البرمجيات الحسابية و الإدارية توصلنا إلى حل مناسب لصناعة برمجيات تساعد فى عملية الإدارة لـ " المحلات - المؤسسات - المستودعات - الشركات - المصانع - المعارض - الصيدليات
    بحيث يصبح تخزين المنتجات وحفظ الحسابات ومعرفة الصادر والوارد وبيانات الموظفين والارباح أو الخسائر والمبيعات والمشتريات والتخزين ومتابعتهم واصدار الفواتير وعمليات الجرد والتسوية وإنشاء تقارير منوعة لاداء وحسابات الشركة اكثر سهوله ودقة وسرعة وحرفية

    “ما يميز البرنامج هو التصميم البسيط و السهولة المحكمة التي لا تُخل بجودة مخرجات
    البرنامج وسرعة الإنجاز. يعجبني أيضا التكامل بين مختلف مكونات البرنامج، إمكانية إدارة البرنامج من أي مكان بالعالم، الدعم الفني السريع و أخيرا التجاوب السريع في تلبية اقتراحات العملاء
    محاسبة أونلاين
    أدر محاسبة شركتك على الانترنت في أي وقت ومن أي مكان. يمكن تخصيص البرنامج وجميع المستندات كالفواتير، عروض الأسعار، سندات الطلب، إشعار الدائن لتتماشى مع جميع ميادين العمل
    إستيراد البيانات
    الانتقال من البرنامج القديم إلى النظام يتم بسهولة بفضل خاصيات إستيراد البيانات. بالمقابل يمكن في أي وقت عمل نسخة احتياطية وإستيراد جميع المستندات والتقارير. تاتي على شكل CSV أو اكسيل أو PDF
    إدارة كاملة ومبسطة
    صمم حتى يكون أفضل برنامج محاسبي عربي وذلك بفضل تمكنه من جمع جميع ما تحتاج إليه الشركة : برنامج مخازن، برنامج مبيعات، برنامج العملاء،وبرامج محاسبي يتضمن شجرة حسابات كاملة.
    تتبع بسهولة فواتيرك في مكان واحد
    بفضل وضع فواتيرك يمكنك متابعة الزبائن لمعرفة اذا كانوا قد توصلوا بفواتيرهم ومعرفة بسهولة إذا قاموا بدفع مستحقاتهم بالكامل أو جزئيا و مراسلتهم إذا كانوا متأخرين. رموز الألوان هي مفيدة لمتابعة المعاملات الخاصة بك ومراقبة رصيدك.
    نموذج فاتورة بخيارات متعددة
    يمكنك التعديل على فواتيرك في أي وقت وإرفاق ملفات مثل
    صور المنتجات لإرسالها إلى الزبائن. يمكن تحميل الفواتير على شكل بي دي إف، طباعتها أو ارسالها عبر البريد من دون مغادرة البرنامج. ودون تغيير تسلسل الترقيم، يمكنك شطب فاتورة غير مدفوعة أو إلغائها حتى وإن كانت قد أرسلت سابقا. برنامج محاسبة للمحلات افضل برنامج محاسبة في السعودية برنامج محاسبة للشركات الصغيرة فضل برامج المحاسبة العالمية برنامج محاسبة للشركات