#format wiki
#language fr

= Machine virtuel Debian sur un cloud Opennebula =

J'essaie de monter un cloud avec le logiciel libre Opennebula, en suite lancer un serveur virtuel Debian 6 sur ce cloud. Je choisis à utiliser KVM comme logiciel de virtualisation.

== Matériel ==
Il faut préparer au moins 2 machines: 

- Front-End: Opennebula serveur. Sur cette machine on manipule les actions sur les machines virtuels. Sur mon cas son IP est 192.168.104.120

- VMHost: Opennebula virtuel host. Sur cette machine les serveurs virtuels marchent. Sur mon cas son IP est 192.168.104.166

On peut y avoir plusieurs VMHost qui connectent à un Front-End

Les VMHost  doivent avoir la possibilité de supporter la virtulisation dans ses CPU. Elles  doivent avoir le flag vmx dans cpuinfo


{{{
#cat /proc/cpuinfo

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl '''vmx''' est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm tpr_shadow vnmi flexpriority
}}}


== Installation le cloud ==

Heuresement il existe déjà des paquets de Debian.

il faut ajouter cette ligne dans /etc/apt/sources.list
{{{
deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free
}}}

Sur le Front-End lance {{{
aptitude install opennebula
}}}

Sur le VMHost lance{{{
aptitude install opennebula-node
}}}

Et voila. C'est tout pour l'installation

== Configuration ==
Quand on installe opennebula, il crée un spécial utilisateur oneadmin. Il faut utiliser cet utilisateur pour manipuler le cloud


=== Sur le Front-End ===
Ajouter le VMHost au cloud

{{{
#su - oneadmin
oneadmin@brochet:~$ onehost add 192.168.104.166 im_kvm vmm_kvm tm_ssh

oneadmin@brochet:~$ onehost list
  ID NAME              CLUSTER  RVM   TCPU   FCPU   ACPU    TMEM    FMEM STAT
  11 192.168.104.166   default    2    200    192    140    2.9G    2.3G   on
}}}

=== sur le VMHost ===

Il faut que user oneadmin sur le Front-End puisse faire un ssh sur le VMHost sans avoir besoin de taper mdp.
Donc ajouter la clé public de user oneadmin de Front-End dans .ssh/authorized-keys de oneadmin sur VMHost


editer /etc/default/libvirt-bin
{{{
# Start libvirtd to handle qemu/kvm:
start_libvirtd="yes"

# options passed to libvirtd, add "-l" to listen on tcp
libvirtd_opts="-d"

/etc/init.d/libvirt-bin restart
}}}


Il faut aussi ajouter un bridge br0. Editer le fichier /etc/network/interface et ajouter

{{{
auto br0
iface br0 inet static
        address 192.168.104.166
        netmask 255.255.255.0
        network 192.168.104.0
        boadcast 192.168.104.255
        bridge_ports eth0
        bridge_stp off
        bridge_fd 1
}}}


== Lancer une machine virtuelle ==

D'abord il faut créer un réseau virtuel
{{{
oneadmin@brochet:~$vi vmnet.template 
NAME   = "Private LAN"
TYPE   = FIXED
BRIDGE = br0
LEASES = [IP=192.168.104.230]
LEASES = [IP=192.168.104.231]
LEASES = [IP=192.168.104.232]
LEASES = [IP=192.168.104.233]
LEASES = [IP=192.168.104.234]
# Custom Attributes to be used in Context
GATEWAY= 192.168.104.1
DNS= 192.168.104.1

oneadmin@brochet:~$onevnet create vmnet.template
oneadmin@brochet:~$ onevnet list
  ID USER     NAME              TYPE BRIDGE P #LEASES
   3 oneadmin Private LAN      Fixed    br0 N       2
}}}


En suite on peut lancer une machine virtuel. Pour tester il y a une petite image ttylinux de test à télécharger ici

{{{
wget http://dev.opennebula.org/attachments/download/170/ttylinux.tar.gz
}}}
Dans ce fichier il y a une image ttylinux.img. On le met dans /opt/nebula/ttylinux.img

On crée un fichier config de la machine virtuelle

{{{
oneadmin@brochet:~$ vi ttylinux.one

NAME   = ttylinux
CPU    = 0.1
MEMORY = 64

DISK   = [
  source   = "/opt/nebula/ttylinux.img",
  target   = "hda",
  readonly = "no" ]

NIC    = [ NETWORK = "Private LAN" ]

FEATURES=[ acpi="no" ]


oneadmin@brochet:~$ onevm create ttylinux.one

oneadmin@brochet:~$ onevm list
   ID     USER     NAME STAT CPU     MEM        HOSTNAME        TIME
   39 oneadmin ttylinux runn   0     64M 192.168.104.166 00 18:37:46
}}}

On a une machine virtuelle avec ID=39

Pour voir quelle IP cette machine a, on utilise la command onevnet

{{{
oneadmin@brochet:~$ onevnet list
  ID USER     NAME              TYPE BRIDGE P #LEASES
   3 oneadmin Private LAN      Fixed    br0 N       3

oneadmin@brochet:~$ onevnet show 3
LEASES INFORMATION                                                              
LEASE=[ IP=192.168.104.230, MAC=02:00:c0:a8:68:e6, USED=0, VID=-1 ]
LEASE=[ IP=192.168.104.231, MAC=02:00:c0:a8:68:e7, USED=0, VID=-1 ]
LEASE=[ IP=192.168.104.232, MAC=02:00:c0:a8:68:e8, USED=1, VID=37 ]
LEASE=[ IP=192.168.104.233, MAC=02:00:c0:a8:68:e9, USED=1, VID=38 ]
LEASE=[ IP=192.168.104.234, MAC=02:00:c0:a8:68:ea, USED=1, VID=39 ]
}}}

Alors la machine 39 a IP=192.168.104.234

On peut faire un ssh dessus. Le mdp est '''password'''

{{{
oneadmin@brochet:~$ ssh root@192.168.104.234
root@192.168.104.234's password: 

Chop wood, carry water.
#
}}}


== Lancer Debian sur le cloud ==
On doit préparer une image de debian comme ttylinux.img au-dessus. Je le fais sur mon poste personnel. Il faut avoir un fichier ISO de debian debian-6.0.3-i386-CD-1.iso

{{{
qemu-img create squeeze.img -f raw 1G
kvm -m 512 -cdrom debian-6.0.3-i386-CD-1.iso -boot d squeeze.img 
}}}

Suivre les étapes pour installer Debian. Quand c'est fini on peut toujours lancer la machine et faire les modifications
{{{
kvm -no-acpi -m 512 squeeze.img
}}}

Maintenant on a l'image, fais comme au-dessus avec ttylinux.img et on peut lancer la machine virtuelle debian sans problème.

Mais il y a quand même un problème: comment on connait l'IP de cette machine?

Bon pour ttylinux.img, quand la machine est booter, il y a un script qui converti MAC -> IP. Par example le Front-End donne un MAC 02:00:C0:A8:68:EA à la machine virtuelle, et elle sait convertir C0:A8:68:EA -> 192.168.104.234. Il suffit d'utiliser onevnet pour savoir. On peut faire la même chose avec l'image de Debian en mettant des scripts dans rc.local. Pour mon image, j'utilise DHCP, donc je dois chercher dans le log de server DHCP pour avoir son IP

Il y a une autre méthode pour appliquer un IP à la machine virtuelle (et aussi faire des autres manipulations après le démarrage), c'est de lancer un script externe (qui n'est pas dans l'image, mais qui est un fichier sur le Front-End) au moment de booter la machine virtuelle. Dans le fichier config le la machine virtuelle on peut ajouter ce texte

CONTEXT = [
    files      = "/var/lib/one/debian/init.sh",
]

Le Front-End crée une image de type iso9660 qui contient ce fichier et le mettre comme un paramètre quand il lance la machine virtuelle. Dans rc.local de la machine virtuelle, on monte cette image CD et lance le script. Mais j'ai pas encore réussit à monter cette image CD dans la machine virtuel comme il n'y a pas de device correspondant dans /dev/. Quand je lance la machine virtuelle à la main et modifier if=ide au lieu de if=none, je peux le monter en utilisant /dev/cdrom0. Donc à étudier encore comment faire de façon automatiquement.

{{{
kvm -M pc-0.12 -cpu qemu32 -m 512 -enable-kvm  -smp 1,sockets=1,cores=1,threads=1 -name one-34 -uuid 4840b512-8b8f-3dcc-f5e4-4fb879f52d8f  -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/one-34b.monitor,server,nowait -mon chardev=monitor,mode=readline -rtc base=utc -no-acpi  -boot c -drive file=/var/lib/one//34.b/images/disk.0 ,if=none,id=drive-ide0-0-0,boot=on,format=raw -drive file=/var/lib/one/34.b/images/disk.1,if=ide,media=cdrom,id=drive-ide0-0-0,format=raw 
}}}