This is an old revision of the document!
Table of Contents
scanner
Instalar
1. Entrar en la BIOS del sistema y asegurarse de que el soporte de virtualización está activado
2. Instalar un sistema GNU/Linux reciente (yo pruebo con Debian 6.x=
3. Comprobar que el sistema operativo soporta virtualizacion:
sudo egrep '(vmx|svm)' --color=always /proc/cpuinfo
En caso de que SI soporte virtualizacion veremos lo siguiente:
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 smx est tm2 ssse3 cx16 xtpr pdcm lahf_lm tpr_shadow vnmi flexpriority 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 smx est tm2 ssse3 cx16 xtpr pdcm lahf_lm tpr_shadow vnmi flexpriority
Con la palabra 'vmx' o 'svm' en rojo
4. Instalar los siguientes paquetes:
sudo aptitude install qemu-kvm libvirt-bin virtinst qemu-utils
Nota: qemu-utils es necesario para exportar de discos raw a qcow2
5. Anyadir el usuario X al grupo:
sudo adduser USUARIO libvirt
6. Comprobar que el demonio libvirtd esta corriendo (necesario para poder administrar KVM desde un entorno grafico con virt-manager):
ps ax | grep libvirt 4149 ? Sl 0:00 /usr/sbin/libvirtd -d
Crear VM desde la linea de comando (probar)
Lanzar los comandos desde el hipervisor.
Debian estable desde red configurada con NAT, 512MB de RAM y 2 GB de disco duro:
virt-install \ -n vm1 \ -r 512 \ --vcpus=2 \ --os-variant=debiansqueeze \ --disk /var/lib/libvirt/images/vm1.img,size=2 \ --nographics \ --network user \ -l http://ftp.debian.org/debian/dists/squeeze/main/installer-amd64/ \ -x console=ttyS0,115200
Debian estable desde red configurada con bridge, 512MB de RAM y 2 GB de disco duro:
virt-install \ -n vm1 \ -r 512 \ --vcpus=2 \ --os-variant=debiansqueeze \ --disk /var/lib/libvirt/images/vm1.img,size=2 \ --nographics \ --bridge br0 \ -l http://ftp.debian.org/debian/dists/squeeze/main/installer-amd64/ \ -x console=ttyS0,115200
vmbuilder
http://www.howtoforge.com/virtualization-with-kvm-on-a-debian-squeeze-server
Administrar KVM (y VM) desde una GUI en el cliente
Escenario: NO quiero instalar las X en el hipervisor, y quiero administrar gráficamente el hipervisor y las máquinas virtuales desde otra máquina (cliente) con las X instaladas
1. (Hipervisor) Instalar los siguientes paquetes:
sudo aptitude update; sudo aptitude install netcat socat -R
2. (Hipervisor) Crear el siguiente archivo:
sudo vim /bin/netcatsocket
Con el siguiente contenido:
#!/bin/bash socat - unix-client:$2
3. (Hipervisor) Darle permisos
sudo chmod +x /bin/netcatsocket
4. (Cliente) Instalar paquetes:
sudo aptitude update; sudo aptitude install virt-manager ssh-askpass -R
5. (Cliente) Conectarse al hipervisor:
virt-manager -c qemu+ssh://USUARIO@HIPERVISOR:PUERTO/system?netcat=netcatsocket
Conectarse a la consola de VM sin GUI
1. (VM) Editar
sudo vim /etc/inittab
Y anyadir:
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
2. (VM) Editar
sudo vim /etc/default/grub
Y dejar la linea tal que asi:
GRUB_CMDLINE_LINUX="console=tty0"
3. (VM) Recargar grub:
sudo update-grub
4. (Hipervisor) Conectarse a la consla de la VM:
sudo virsh console template Connected to domain template Escape character is ^]
Toca un tecla (por ejemplo enter) y aparecera el prompt:
Debian GNU/Linux 6.0 template ttyS0 template login:
5. Para finalizar la conexion CTRL + ]
Comandos varios
* Listar todas las Maquinas Virtuales (VM):
virsh list --all Id Name State ---------------------------------------------------- - name shut off
* Eliminar por completo una VM:
virsh undefine vm2 Domain vm2 has been undefined
Salir de la consola (virt-manager)
CTRL + ALT + F7
Errores
* Cannot recv data: Host key verification failed. : Connection reset by peer
Sucede al lanzar:
virt-manager -c qemu+ssh://usuario@hipervisor/system
Solucion: iniciar una sesion SSH para almacenar las claves del hipervisor en el cliente:
ssh usuario@hipervisor
* Error starting network 'default': internal error
Suce al intentar activar o crear una nueva red virtual desde virt-manager debido a un bug de libvirt.
Solucion: actualizar los paquetes relacionados con libvirt
1. Editar:
sudo vim /etc/apt/sources.list
Y anyadir la siguiente linea:
deb http://backports.debian.org/debian-backports squeeze-backports main
2. Actualizar la cache de paquetes:
sudo aptitude update
3. Instalar la version de backports de los siguientes paquetes:
sudo aptitude -t squeeze-backports install libvirt-bin libvirt0 python-libvirt dnsmasq-base -R
4. Reiniciar el demonio libvirtd:
sudo /etc/init.d/libvirt-bin restart
Renombrar VM
sudo su - cd /etc/libvirt/qemu/ virsh dumpxml dns-1.test.jj.com > dns-1.dev.jj.com.xml Apagar la VM si no lo esta Asegurar que NO tiene snapshot virsh undefine dns-1.test.jj.com vim dns-1.dev.jj.com.xml (cambios) virsh define dns-1.dev.jj.com.xml
Discos
Acronimos:
| LVM | Logical Volume Manager | | PV | Physical Volume | | VG | Volume Group | | LV | Logical Volume |
(qcow2 + LVM) agrandar disco
La estrategia es extender el disco, crear una nueva particion en el nuevo espacio, crear un PV, anyadirlo al VG, extender el LV y redimensionar el sistema de archivos (EXT4…).
Para este ejemplo clonaremos una VM pre-existente (template_lvm) de 2GB a una nueva (test7). Necesitaremos por comodidad tener habilitada la consola (conectarse_a_la_consola_de_vm_sin_gui)
1. Clonar la VM. Original: template_lvm, copia: test7
sudo virt-clone --connect=qemu:///system -o template_lvm -n test7 -f /var/lib/libvirt/images/test7.qcow2Asignando 'test7.qcow2' | 2.0 GB 00:02 Clon 'test7' creado correctamente.
2. Extender el disco:
sudo qemu-img resize /var/lib/libvirt/images/test7.qcow2 +8G Image resized.
3. Arrancar la nueva VM:
sudo virsh start test7 Domain test7 started
4. Conectarse a la consola de la VM:
sudo virsh console test7 [sudo] password for usuario: Connected to domain test7 Escape character is ^] Debian GNU/Linux 6.0 template ttyS0 template login:
5. Comprobar que el Sistema Operativa ve el nuevo espacio (10 GB):
sudo fdisk -l
Disk /dev/vda: 10.7 GB, 10737418240 bytes 16 heads, 63 sectors/track, 20805 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00031f27 Device Boot Start End Blocks Id System /dev/vda1 * 3 496 248832 83 Linux Partition 1 does not end on cylinder boundary. /dev/vda2 498 4159 1845249 5 Extended Partition 2 does not end on cylinder boundary. /dev/vda5 498 4159 1845248 8e Linux LVM Disk /dev/dm-0: 1753 MB, 1753219072 bytes 255 heads, 63 sectors/track, 213 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/dm-0 doesn't contain a valid partition table Disk /dev/dm-1: 134 MB, 134217728 bytes 255 heads, 63 sectors/track, 16 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/dm-1 doesn't contain a valid partition table
6. Crear una nueva particion
sudo fdisk /dev/vda
2 opciones:
a) DOS-compatible mode
n p 3 4160 Enter w
a) Deshabilitar DOS-compatible mode (RECOMENDADO)
c u n p 3 4192256 enter w
En 'First cylinder' hemos especificado 4160 (o 4192256) que es el resultante de anyadirle 1 al cilindor final de la particion '/dev/vda5' (ver paso 5)
7. Aqui hay que reiniciar para que la particion sea usable por el Sistema Operativo:
sudo shutdown -r now
8. Crear un PV con la nueva particion:
sudo pvcreate /dev/vda3 Physical volume "/dev/vda3" successfully created
9. Anyadir ese PV al VG. Primero obtener el nombre del VG y del PV:
sudo vgscan
Reading all physical volumes. This may take a while... Found volume group "template" using metadata type lvm2
sudo pvscan
PV /dev/vda5 VG template lvm2 [1.76 GiB / 0 free] PV /dev/vda3 lvm2 [8.00 GiB] Total: 2 [9.76 GiB] / in use: 1 [1.76 GiB] / in no VG: 1 [8.00 GiB]
Anyadimos el PV '/dev/vda3' al VG 'template':
sudo vgextend template /dev/vda3 Volume group "template" successfully extended
10. Extendemos el VL. Primero los listamos:
sudo lvscan
ACTIVE '/dev/template/root' [1.63 GiB] inherit ACTIVE '/dev/template/swap_1' [128.00 MiB] inherit
Vamos a extender el LV '/dev/template/root' todo lo que podamos:
sudo lvextend -l +100%FREE /dev/template/root Extending logical volume root to 9.63 GiB Logical volume root successfully resized
11. Extendemos el sistema de archivos. El proceso tarda 1 minuto para 8GB:
sudo resize2fs /dev/mapper/template-root
resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/mapper/template-root is mounted on /; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/mapper/template-root to 2525184 (4k) blocks. The filesystem on /dev/mapper/template-root is now 2525184 blocks long.
Comprobamos que todo ha ido bien:
df -h
Filesystem Size Used Avail Use% Mounted on /dev/mapper/template-root 9.5G 565M 8.5G 7% / tmpfs 249M 0 249M 0% /lib/init/rw udev 244M 108K 244M 1% /dev tmpfs 249M 0 249M 0% /dev/shm /dev/vda1 228M 16M 201M 8% /boot
Snapshots
http://redes-privadas-virtuales.blogspot.com.es/2011/03/taking-snapshots-on-kvm-with-libvirt.html
Caracteristicas/limitaciones:
* Virt-manager (0.9.1) NO soporta snapshots, por lo que tenemos que hacerlo desde la lina de comandos * Solo el formato de disco virtual qcow2 soporta snapshots * Se puede tomar un snapshot con la VM corriendo (2GB disco tarda 3m14.810s) * Se puede restaurar un snapshot con la VM corriendo (creo que Virtualbox NO lo soporta)
Tomar snapshot / migrar formato de disco raw a qcow2
1. Conectarse al hipervisor. Yo por simplicidad lo hago a traves de SSH, pero a lo mejor es posible conectarse desde el cliente con un virsh -c URL
ssh usuario@hipervisor
2. Crear un archivo .xml con informacion sobre el snapshot:
sudo vim /var/lib/libvirt/qemu/snapshot/test2_snapshot_01.xml
Con el siguiente contenido:
<domainsnapshot> <name>test2_snapshot_01_160520121140</name> <description>Fresh install of Debian Squeeze 64 bits</description> </domainsnapshot>
Grabar y salir
3. IMPORTANTE: solo el formato qcow2 soporta snapshots. Vamos a comprobar que formato tiene el disco duro de la VM, que en este ejemplo se llama “test2”
sudo virsh edit test2
De la informacion que muestra nos fijamos en el disco:
... <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/test2.img'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> ...
Si intentamos tomar el snapshot veremos que NO lo soporta (:q! para salir de la ventana de edicion):
sudo virsh snapshot-create test2 /var/lib/libvirt/qemu/snapshot/test2_snapshot_01.xml error: Requested operation is not valid: Disk '/var/lib/libvirt/images/test2.img' does not support snapshotting
Por lo que volvemos a editar:
sudo virsh edit test2
Y dejamos la seccion de disco tal que asi (solo cambiar qcow2):
... <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/test2.qcow2'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> ...
Grabar y salir
Domain test2 XML configuration edited.
TODO: quiza hay un comando para cambiar el formato del disco
4. Convertir el disco de formato raw a qcow2. La VM debe estar apagada
sudo qemu-img convert -f raw -O qcow2 -o preallocation=metadata /var/lib/libvirt/images/test2.img /var/lib/libvirt/images/test2.qcow2 sudo chown libvirt-qemu:kvm /var/lib/libvirt/images/test2.qcow2
5. Volver a tomar el snapshot:
sudo virsh snapshot-create test2 /var/lib/libvirt/qemu/snapshot/test2_snapshot_01.xml Domain snapshot test2_snapshot_01_160520121140 created from '/var/lib/libvirt/qemu/snapshot/test2_snapshot_01.xml'
Para verlo:
sudo virsh snapshot-list test2 Name Creation Time State ------------------------------------------------------------ test2_snapshot_01_160520121140 2012-05-16 12:46:48 +0200 shutoff
RENDIMIENTO si tomamos el snapshot de una VM corriendo (2GB de disco duro) me tomo 03'14“
6. Arrancar la VM y verificar que funciona correctamente
sudo virsh start test2 Domain test2 started
7. Si ha arrancado correctamente, eliminar el viejo disco:
sudo rm -fr /var/lib/libvirt/images/test2.img
Script para tomar snapshot
- Requiere python 2
- Se tiene que ejecutar como root
- Ejecutar 'sudo ./snapshot.py', o el nombre que le des al script
#!/usr/bin/python import sys, commands, time, os, datetime # Variables path_snapshots = '/var/lib/libvirt/qemu/snapshot/' header = ['Id', 'Name', 'State'] snapshot_template = """\ <domainsnapshot> <name>NAME</name> <description>DESCRIPTION</description> </domainsnapshot> """ # Code if not os.geteuid() == 0: print "You aren't root. Goodbye." sys.exit() output = commands.getoutput('virsh list --all') print output list_vm = [line for line in output.split('\n') if '---' not in line and not all(e in line for e in header)] row_number_list_vm = int(raw_input('Select which VM to take snapshot.\nUse line number (1 for " %s" etc...): '\ %(list_vm[0]))) line = list_vm[row_number_list_vm-1] print 'You selected "%s"' %(line) description = raw_input('Please type a description for this snapshot: ') aux = line.split(' ')[0].split(' ') vm_name = aux[len(aux)-1] snapshot_name = vm_name + '_' + str(time.time()).split('.')[0] snapshot_xml_path = path_snapshots + snapshot_name + '.xml' snapshot_xml = snapshot_template.replace('NAME',snapshot_name).replace('DESCRIPTION',description) file = open(snapshot_xml_path, 'w+') file.write(snapshot_xml) file.close() print "WARNING, the process takes a while. For a running machine with 2 GB disk can take 3 minutes" print datetime.datetime.today() output = commands.getstatusoutput('virsh snapshot-create %s %s' %(vm_name,snapshot_xml_path)) if output[0] != 0: print 'Error %s' %(str(output)) print datetime.datetime.today()
Restaurar snapshot
1. Conectarse al hipervisor. Yo por simplicidad lo hago a traves de SSH, pero a lo mejor es posible conectarse desde el cliente con un virsh -c URL
ssh usuario@hipervisor
2. Listar las snapshots que tenemos (nuestra VM se llama 'test2'):
sudo virsh snapshot-list test2 Name Creation Time State ------------------------------------------------------------ test2_snapshot_01_160520121140 2012-05-16 12:46:48 +0200 shutoff test2_snapshot_02 2012-05-16 12:58:29 +0200 running test2_snapshot_03 2012-05-16 13:03:33 +0200 running
3. Restaurar por ejemplo segunda (test2_snapshot_02):
sudo virsh snapshot-revert test2 test2_snapshot_02
Tarda un par de segundos
Borrar snapshot
Los snapshots soportan como parametros –children, pero si no se le ha pasado en el momento de tomarlo, son considerados totalmente independientes, es decir, se pueden borar 1 a 1:
sudo virsh snapshot-delete test2 test2_snapshot_02 Domain snapshot test2_snapshot_02 deleted
Clonar
- Se puede hacer tanto desde GUI (no lo he probado) como desde linea de comandos
- Requiere pausar (mejor) o apagar la VM
- Para una maquina de 2 GB de disco duro .qcow2 provisionado por completo el proceso completo tarda unos 20”
1. Conectar al hipervisor
ssh USUARIO@HIPERVISOR
2. Pausar la VM a clonar. Durante este tiempo consume recursos pero NO es accesible
sudo virsh suspend template Domain template suspended
3. Clonar la VM:
sudo virt-clone --connect=qemu:///system -o template -n template_clone -f /var/lib/libvirt/images/template_clone.qcow2 Asignando 'template_clone.qcow2' | 2.0 GB 00:02 Clon 'template_clone' creado correctamente.
4. Reanudar la VM:
sudo virsh resume template Domain template resumed/description