Virtualization in Grid'5000: Difference between revisions

From Grid5000
Jump to navigation Jump to search
No edit summary
Line 120: Line 120:


Libvirt is a toolkit for managing virtualization servers. Libvirt is also an abstraction layer for different virtualization solutions, including KVM but also Xen and VMWare ESX.
Libvirt is a toolkit for managing virtualization servers. Libvirt is also an abstraction layer for different virtualization solutions, including KVM but also Xen and VMWare ESX.
In our case, we use libvirt on top of KVM.
In our case, we use libvirt on top of KVM.


Line 179: Line 180:


{{Note|text=Use <code class="command">CTRL+AltGr+]</code> to disconnect from <code class="command">virsh console</code>}}
{{Note|text=Use <code class="command">CTRL+AltGr+]</code> to disconnect from <code class="command">virsh console</code>}}
* At this point, you can repeat the full process and launch several VMs in parallel.


=== SSH===
=== SSH===

Revision as of 20:33, 18 November 2012

Purpose

This page presents how to use KVM on the production environment, with a "non-deploy" reservation. The aim is to permit the execution of virtual machines on the nodes, along with a subnet reservation, which will give you a range of routed IP for your experiment.

Note.png Note

For more network related information, see the virtual network interlink page.

In the last part, we will explain more precisely the contextualization mechanism, which allow you to customize your virtual machines.

Quick start

In this part, we will create a virtual machine in a few steps, and ssh to it.

Job submission

In order to test easily the kvm environment, we use an interactive job, and we reserve one subnet and one node.

Terminal.png frontend:
oarsub -l slash_22=1+nodes=1 -I


Note.png Note

- Some clusters don't have virtualization support in the BIOS. You can check if a node supports virtualization with the following command:

Terminal.png node:
egrep '^flags.*(vmx|svm)' /proc/cpuinfo

- You can request nodes with enabled virtualization support, using the "virtual" property:

Terminal.png frontend:
oarsub -I -l "slash_22=1+{virtual!='none'}/nodes=1"

Disk image, virtual machine

A disk image containing debian squeeze is available at the following path: /grid5000/images/KVM/squeeze-x64-base.qcow2

It can be used as a base for more advanced work. For the next steps of this tutorial, copy the disk image to /tmp on the node:

Terminal.png node:
cp /grid5000/images/KVM/squeeze-x64-base.qcow2 /tmp/

Network configuration

In order to use the network with kvm, a Tun/Tap interface must be created for each virtual machines. This virtual interface will be attached to your virtual machine, and bridged on the production network. Therefore, the virtual machine will be able to get an IP from the DHCP server and access the network.

A script is available to create automatically this interface on the node: create_tap:

Terminal.png node:
sudo create_tap
  • Tun/Tap interfaces are listed by issuing the command /sbin/ifconfig.
Terminal.png node:
/sbin/ifconfig
tap0      Link encap:Ethernet  HWaddr 00:16:3e:db:c6:41
          inet6 addr: fe80::58ff:a4ff:fe97:c6a8/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:29435 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
Note.png Note

- Create one Tun/Tap interface per guest OS.

- Use tunctl if you need to delete a Tun/Tap device.

Terminal.png node:
/usr/sbin/tunctl -d tap0

Generate the contextualization iso file

This file contains a script which will set the network configration of your VM. First, choose an IP in the range you have reserved. The command g5k-subnets will give you more information.

Terminal.png node:
g5k-subnets -a
10.172.0.0/22   10.175.255.255  255.252.0.0     10.175.255.254  10.172.0.0      dns.luxembourg.grid5000.fr      172.16.191.101

You can get the list of available IP, and an associated unique mac address with the following command.

Terminal.png node:
g5k-subnets -im
10.172.0.1      00:16:3E:AC:00:01
10.172.0.2      00:16:3E:AC:00:02
10.172.0.3      00:16:3E:AC:00:03
10.172.0.4      00:16:3E:AC:00:04
10.172.0.5      00:16:3E:AC:00:05
10.172.0.6      00:16:3E:AC:00:06
10.172.0.7      00:16:3E:AC:00:07
10.172.0.8      00:16:3E:AC:00:08
10.172.0.9      00:16:3E:AC:00:09
10.172.0.10     00:16:3E:AC:00:0A
...
Note.png Note

- The mac address is a translation of the IP. Do not change it.
- The first three bytes of the mac address 00:16:3e are important. If you omit to use the contextualization iso file for the network configuration, you will be able to receive an IP from the DHCP server only if you use this prefix.


Generate this iso file with this command:

Terminal.png node:
/grid5000/images/KVM/g5k-vm --ip $IP --iso /tmp/kvm-context-$IP.iso
Note.png Note

The variable $IP contains the IP that you have chosen in your range.

Run the guest OS using the kvm command

Start the virtual machine with the kvm command. The following command is just an example, feel free to adapt it to your use case. The kvm process is launched in a screen session, if you are not familiar with screen, read its documentation.

Terminal.png node:
screen kvm -m 512 -hda /tmp/squeeze-x64-base.qcow2 -cdrom $ISOFILE -net nic,model=virtio,macaddr=$MACADDR -net tap,ifname=tap0,script=no -nographic
Note.png Note

- tap0 is the name of our Tun/Tap interface. Adapt it with the Tun/Tap name on witch you want to attach your guest OS.

- The variable $ISOFILE contains the full path to the iso previously generated (for example, /tmp/kvm-context-10.172.0.1.iso).
- The variable $MACADDR contains the previously generated mac address, given by g5k-subnets.

- The password for the root account is grid5000

Or, use libvirt

Libvirt is a toolkit for managing virtualization servers. Libvirt is also an abstraction layer for different virtualization solutions, including KVM but also Xen and VMWare ESX.

In our case, we use libvirt on top of KVM.

  • Create a domain file in XML, describing a virtual machine. Don't forget to adapt this example to your case (especially, replace the mac address by a randomly generated one).

eg : domain.xml

 <domain type='kvm'>
  <name>squeeze</name>
  <memory>524288</memory>
  <vcpu>1</vcpu>
  <os>
    <type arch="x86_64">hvm</type>
  </os>
  <clock sync="localtime"/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver type='qcow2'/>
      <source file='/tmp/squeeze-x64-base.qcow2'/>
      <target dev='vda' bus='virtio'/>
     <shareable/>
    </disk>
    <disk type='file' device='cdrom'>
      <source file='/tmp/kvm-context-10.172.0.1.iso'/>
      <target dev='vdb' bus='virtio'/>
      <readonly/>
    </disk>
    <interface type='ethernet'>
      <target dev='tap0'/>
      <script path='no'/>
      <model type='virtio'/>
      <mac address='00:16:3e:ac:00:01'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/ttyS0'/>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <source path='/dev/ttyS0'/>
      <target port='0'/>
    </console>
  </devices>
 </domain>
Note.png Note

Adapt this file to your case, especially, the mac address, the path of your contextualization iso file and the name of your VM

  • Now, the guest OS can be started.
Terminal.png node:
virsh create domain.xml
  • You can also use virsh to manage your guest OS:
    • list the running virtual machines: virsh list
    • open a console on the "squeeze" virtual machine: virsh console squeeze
Note.png Note

Use CTRL+AltGr+] to disconnect from virsh console

  • At this point, you can repeat the full process and launch several VMs in parallel.

SSH

Finally, you can ssh directly to your VM:

Terminal.png node:
ssh root@$IP
Note.png Note

The password for the root account is grid5000



KVM contextualization explained

This part describes the basic usage of a contextualization iso file with KVM, in order to configure the virtual machines (especially the network side). The contextualization script can be easily extended for other purposes.

Mechanism

Principe

Contextualization mechanism works like the following :

  • Test for the presence of a CD in the CD drive of the VM
  • if it exists, mount the CD, test the presence of a script post-install, and run it as root
  • if it does not exist, use dhcp on the first network interface.

Installation

The contextualization mechanism is not standard, if you want to use it on your vm, you must copy and adapt a few scripts.

  • The contextualization script is executed during the boot sequence.

This script can be placed in /etc/rc.local, at the end of the file (before the exit 0 if any).

# KVM contextualization script
/usr/local/bin/init
  • Here is an example of a contextualization script :
#!/bin/bash

DEVICE=
[ -b /dev/hdb ] && DEVICE=/dev/hdb
[ -b /dev/sdb ] && DEVICE=/dev/sdb
[ -b /dev/vdb ] && DEVICE=/dev/vdb
[ -b /dev/xvdb ] && DEVICE=/dev/xvdb
[ -b /dev/sr0 ] && DEVICE=/dev/sr0

if [ -b "$DEVICE" ];then
    /bin/mount -t iso9660 $DEVICE /mnt 2> /dev/null

    if [ -f /mnt/post-install ]; then
      bash /mnt/post-install
    fi

    umount /mnt 2> /dev/null
else
    ifup eth0
fi
exit 0

Generate your contextualization iso file

This part explain how to generate the contextualization iso file manually. Note that the manipulation can be automated with the script g5k-vm.

Terminal.png node:
/grid5000/images/KVM/g5k-vm --ip 10.172.0.1 --iso /tmp/kvm-context-10.172.0.1.iso
  • A basic example of contextualization iso file is available at /grid5000/images/KVM/kvm-context.tgz on each site.
    • the entry point is the file kvm-context/post-install ;
    • this example configure the network interface using a static IP address and the network information provided in the file kvm-context/network/common ;
    • you can customize that iso file for your experiments.
  • Use the tool genisoimage to generate the contextualization iso file.

Retrieve the file kvm-context.tgz

Uncompress the file /grid5000/images/KVM/kvm-context.tgz in your home directory. This tarball contains an example of contextualization script.

Terminal.png node:
tar xzvf /grid5000/images/KVM/kvm-context.tgz

Adapt the network configuration in the contextualization script

  • The contextualization script will apply your network settings.
  • The command g5k-subnets will give you all the needed network information related to your reservation.
Terminal.png node:
g5k-subnets -a
  • Choose an IP and a mac address in your range:
Terminal.png node:
g5k-subnets -im
10.172.0.1      00:16:3E:AC:00:01
10.172.0.2      00:16:3E:AC:00:02
10.172.0.3      00:16:3E:AC:00:03
10.172.0.4      00:16:3E:AC:00:04
10.172.0.5      00:16:3E:AC:00:05
10.172.0.6      00:16:3E:AC:00:06
10.172.0.7      00:16:3E:AC:00:07
10.172.0.8      00:16:3E:AC:00:08
10.172.0.9      00:16:3E:AC:00:09
10.172.0.10     00:16:3E:AC:00:0A
...
  • Following the information displayed, you should adapt the file ./kvm-context/common/network.

This file is used by the script ./kvm-context/distributions/debian/00_network in order to configure the network interface for your VM.

Here is an example:

IPADDR=10.172.0.1
MACADDR=00:16:3e:ac:00:01
GATEWAY=10.175.255.254
NETWORK=10.172.0.0
BROADCAST=10.175.255.255
NETMASK=255.252.0.0
NAMESERVER=172.16.191.101
DOMAIN=luxembourg.grid5000.fr
SEARCH=luxembourg.grid5000.fr

Generate the iso file

Once you have prepared the content of the iso file for the contextualization, you can generate it in /tmp on the node.

Terminal.png node:
genisoimage -r -o /tmp/kvm-context-10.172.0.1.iso kvm-context/

The file (kvm-context-10.172.0.1.iso) is ready to be attached to a VM, the script included in the iso will then configure the network interface during boot time.