Virtualización con KVM - Central Authentication Service (CAS)

Anuncio
VIRTUALIZACIÓN CON KVM
1
Virtualización con KVM
Introducción
La virtualización es una tecnología que fue desarrollada por IBM en los años
60. La virtualización es un término que se refiere a la abstracción de los recursos de un ordenador llamado Hypervisor o VMM (Virtual Machine Monitor).
El VMM crea una capa de la abstracción entre el hardware de la maquina física (host) y el sistema operativo de la maquina virtual (virtual machine,
guest) El VMM maneja los recursos de las maquinas físicas de manera que
el usuario pueda crear varias maquinas virtuales presentando a cada una de
ellas una interfaz del hardware que sea compatible con el sistema operativo
elegido.
Cada VM (máquina virtual) trabaja de manera separada en un espacio de
usuario con su propio esquema de direccionamiento, dispositivos virtuales,
etc. La maquina virtual generalmente es un sistema operativo completo que
corre como si estuviera instalado en una plataforma de hardware autónoma.
VIRTUALIZACIÓN CON KVM
3
Formas de virtualizar
Emulación del Hardware
La CPU y otros componentes de hardware como chips de E/S, tarjetas de
video, red, etc. son emulados
ª Productos:
Bochs
QEMU
MS Virtual PC para MAC (PowerPC)
ª Ventajas:
El S.O. invitado no necesita ser modificado (se puede emular una CPU x86
en una maquina PowerPC o al revés).
ª Inconvenientes:
Perdida de prestaciones importante al emular las instrucciones de hardware
de la CPU emulada a la CPU nativa
Virtualización del hardware (nativa o total)
La CPU no se emula. Se emula el resto del hardware (chips de E/S, tarjetas,
etc...)
ª Productos:
VMware Worstation y Server
Parallels Desktop • VirtualBox
Xen 3 con soporte de CPU Intel-VT o AMD-V
4
VIRUTUALIZACIÓN CON KVM
KVM con soporte de CPU Intel-VT o AMD-V
ª Ventajas:
El S.O. invitado (guest) no necesita modificarse • Mejores prestaciones que
con la emulación del hardware
ª Inconvenientes:
La arquitectura de la CPU debe ser igual en el S.O. central y el invitado
Mucha sobrecarga (overhead) importante: Intel VT y AMD-V para intentar
reducirla.
El S.O. invitado (guest) no necesita modificarse
Mejores prestaciones que con la emulación del hardware
Paravirtualización
Es una técnica de virtualización que consiste en crear un interface de software a las máquinas virtuales.
Permite que las VM's tengan unas prestaciones cercanas al hardware no
virtualizado.
Si el S.O. invitado puede comunicarse con el “hypervisor” para indicarle lo
que quiere hacer, coopera y mejora las prestaciones en cada máquina virtual. Un producto que utiliza la técnica de la paravirtualización es Xen3.
VIRTUALIZACIÓN CON KVM
Virtualización a nivel de Sistema
No hay emulación
Hay un único kernel para el S.O. anfitrión (host) y el S.O. invitado (guest)
ª Productos:
OpenVZ/Virtuozzo
Jaulas de FreeBSD
Solaris Containers (Solaris zonas)
Parallels Virtuozzo Containers
5
6
VIRUTUALIZACIÓN CON KVM
KVM
KVM
o Kernel-based Virtual Machine
(http://www.linux-kvm.org) usa
Qemu (http://www.qemu.org/) el cual es un emulador de procesador. Sin
embargo KVM usa las extensiones de procesador HVM para la virtualización. KVM usa qemu para emular la E/S del hardware. KVM está incluido a
partir del kernel 2.6.20 de Linux. Permite ejecutar múltiples sistemas operativos sin ninguna modificación y cada uno de ellos corriendo en su propio
hardware virtual (red, memorias, discos, gráficos ….).
Instalación de KVM
Antes de instalar KVM, debemos asegurarnos que nuestra máquina soporta
las extensiones de virtualización HVM Intel o AMD. Para Intel VT el flag es
vmx y para AMD-v es svm :
Para ello, ejecutamos el siguiente comando:
ª egrep '(vmx|svm)' --color=always /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 pni monitor ds_cpl vmx est tm2
ssse3 cx16 xtpr lahf_lm
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 pni monitor ds_cpl vmx est tm2
ssse3 cx16 xtpr lahf_lm
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 pni monitor ds_cpl vmx est tm2
ssse3 cx16 xtpr lahf_lm
VIRTUALIZACIÓN CON KVM
7
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 pni monitor ds_cpl vmx est tm2
ssse3 cx16 xtpr lahf_lm
Si el procesador no soporta las extensiones de virtualización, no aparecerá
nada en pantalla y no podremos trabajar con KVM. Para seguir con la instalación instalaremos los siguientes paquetes:
aptitude install kvm libvirt-bin virtinst
(python-virtinst en
Ubuntu)
Añadimos el usuario root al grupo libvirt :
adduser `id -un` libvirt
Libvirt y Virsh
Es una librería de C para gestionar las máquinas virtuales en Linux (Qemu,
KVM, Xen, VirtualBox, OpenVZ). Proporciona un interface en línea de comandos, configuración basada en xml.
Libvirt dispone de enlaces de programa para C/C++ y Python, de manera
que puede incorporarse fácilmente al conjunto de herramientas de gestión
existentes.
Para comprobar que funcionan correctamente ejecutamos el comando:
virsh list
virsh list
Id Name
State
-------------------------------------------------y veremos algo así:
Id Name
State
-------------------------------------------------
8
VIRUTUALIZACIÓN CON KVM
Seguimos instalando paquetes:
aptitude install bridge-utils
aptitude install virt-manager
Para activar el log de libvirt
export LIBVIRT_DEBUG=4
export LIBVIRT_LOG_OUTPUTS="1:file:/var/log/virsh.log"
VIRTUALIZACIÓN CON KVM
9
Instalar Maquinas virtuales Linux
Para instalar una VM Linux desde la línea de
comandos desde CD:
virt-install --connect qemu:///system -n vm_lenny -r 512 --vcpus=1 -f
/home/kvm/lenny/vm_lenny.qcow2 -s 12 -c /dev/cdrom --vnc -noautoconsole --os-type linux --os-variant debianLenny --accelerate -network=bridge:br0 --hvm --force
Para instalar una VM Linux desde la línea de
comandos desde Internet:
virt-install --connect qemu:///system -n vm_lenny -r 512 --vcpus=1 -f
/home/kvm/lenny/vm_lenny.qcow2 -s 12 -l
http://ftp.us.debian.org/debian/dists/lenny/main/installer-amd64/ --vnc -noautoconsole --os-type linux --os-variant debianLenny --accelerate -network=bridge:br0 --hvm –force
Las opciones del comando virt-install son las siguientes:
--connect
se conecta a un hypervisor que no es el de por defecto (qe-
mu en lugar de kvm)
qemu:///system
si correo en un kernel bare metal (directo
sobre el hardware) y como root (necesario para instalar VM’s)
-n
nombre de la VM
-r
memoria RAM
--hvm full virtualization
--vnc
activa una consola virtual en el invitado y lo exporta como un server
VNC en el host
10
--noautoconsole
VIRUTUALIZACIÓN CON KVM
no se intenta conectar automáticamente a la conso-
la del invitado. La acción por defecto es lanzar un cliente VNC para visualizar la consola gráfica o ejecutar el comendo virsh console para visualizar
la consola de texto del invitado
Las maquinas virtuales están localizadas en el directorio /etc/libvirt/qemu
Son ficheros xml y su contenido es el siguiente:
<domain type='kvm'>
<name>vm_lenny</name>
<uuid>6d3e8f1b-f852-3ee4-7005-3270f6926a2f</uuid>
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='block' device='cdrom'>
<target dev='hdc' bus='ide'/>
<readonly/>
</disk>
<disk type='file' device='disk'>
<source file='/home/kvm/lenny/vm_lenny.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='54:52:00:75:7f:10'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
</devices>
</domain>
VIRTUALIZACIÓN CON KVM
11
Instalar Maquinas virtuales
Windows
Para virtualizar Windows XP desde CD
Seguimos el asistente con virt-manager y hacemos la instalación típica de
Windows
Para que arranque desde disco dará un error de que no puede arrancar
desde el dispositivo /dev/sr0 . En el virt-manager vamos a los detalles de la
VM (en la pestaña Hardware) y desconectamos el CD:
En
modo
bridge
la
red
así
quedaría
el
fichero
xml
/etc/libvirt/qemu/Win_XP.xml:
<domain type='qemu'>
<name>Win_XP</name>
<uuid>74f67788-4d47-65ce-b4f1-97d290a408ae</uuid>
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
en
12
VIRUTUALIZACIÓN CON KVM
<features>
<pae/>
</features>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/qemu</emulator>
<disk type='file' device='disk'>
<source
file='/var/lib/libvirt/images/Win_XP.img'/>
<target dev='hda' bus='ide'/>
</disk>
<disk type='block' device='cdrom'>
<target dev='hdc' bus='ide'/>
<readonly/>
</disk>
<interface type='bridge'>
<mac address='54:52:00:5e:f1:aa'/>
<source bridge='br0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target port='0'/>
</console>
<input type='tablet' bus='usb'/>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='es'/>
<sound model='es1370'/>
</devices>
</domain>
Para instalar un Windows 2003 desde CDROM
virt-install --connect qemu:///system -n win2k3 -r 512 --vcpus=1 -f
win2003.raw -s 4 -c /dev/cdrom --vnc --noautoconsole --os-type windows -os-variant win2k3 --network=bridge:br0 --hvm
Starting install...
Creating domain...
0 B 00:01
Domain installation still in progress. Waiting for domain to complete
installation.
Después arrancamos el virt-manager para ver la consola.
VIRTUALIZACIÓN CON KVM
13
Instalar VM’s desde la línea de
comandos y desde Virt-manager
(Entorno Gráfico)
Instalando VM’s Linux y Windows usando
virt-manager
Podemos usar el asistente gráfico virt-manager para instalar las VM’s en lugar de hacerlo a través de comandos. Para ello debemos tener instalados
los siguientes paquetes en Debian:
apt-get install xserver-xorg-core gdm gnome-core virt-manager
Si ejecutamos virt-manager nos saldrá el siguiente asistente:
14
VIRUTUALIZACIÓN CON KVM
VIRTUALIZACIÓN CON KVM
15
16
VIRUTUALIZACIÓN CON KVM
Para instalar desde el Virt-manager al seleccionar el origen de la instalación
por red (http o ftp) en la opción URL del método de instalación:
Path to a local directory containing an installable distribution image
nfs:host:/path or nfs://host/path
An NFS server location containing an installable distribution image
http://host/path
An HTTP server location containing an installable distribution image
ftp://host/path
An FTP server location containing an installable distribution image
Some distro specific url samples:
Fedora/Red Hat Based
VIRTUALIZACIÓN CON KVM
http://download.fedoraproject.org/pub/fedora/linux/releases/10/Fedora/i386/os/
Debian/Ubuntu
http://ftp.us.debian.org/debian/dists/etch/main/installer-amd64/
Suse
http://download.opensuse.org/distribution/11.0/repo/oss/
Mandriva
ftp://ftp.uwsg.indiana.edu/linux/mandrake/official/2009.0/i586/
En nuestro ejemplo de instalación de una Etch el path ha sido el siguiente:
http://ftp.us.debian.org/debian/dists/etch/main/installer-i386/
17
18
VIRUTUALIZACIÓN CON KVM
Formatos y conversión de
imágenes
Con qemu podemos usar varios tipos de formatos de imagen. Básicamente
las dos más standards son RAW y qcow. Raw no tiene ningún formato especial. Qcow (y qcow2) la principal diferencia es que la imagen puede crecer
según se van añadiendo datos, soporta encriptación AES y descompresión
transparente.
Ya veremos más adelante que tenemos un comando para hacer la conversión entre diferentes tipos de imágenes usadas en varios productos de virtualización. Los diferentes formatos son:
vpc - Virtual PC
bochs - Bochs filesystem
cloop - linux Compressed LOOP
vmdk - vmware Virtual Machine DisK format
qcow - QEMU Copy-On-Write
qcow2 - QEMU Copy-On-Write (new in version 0.9)
raw - RAW filesystem (no special format)
Las imágenes qcow se pueden montar bajo Linux con la opción offset del
comando mount (se verá más adelante)
VIRTUALIZACIÓN CON KVM
19
Instalar las VM’s en volúmenes lógicos en
lugar de imágenes en fichero
Para trabajar con máquinas virtuales de gran tamaño y/o más necesidad de
prestaciones de entrada y salida a disco es recomendable no trabajar contra
fichero. Es mejor trabajar contra partición. Podemos trabajar con volúmenes
lógicos y beneficiarnos de la flexibilidad y facilidad para crecer en tamaño,
redimensionar volúmenes y sobre todo para los snapshots. Con esta característica será muy sencillo copiar la máquina en caliente si pérdida de datos
y sin afectar al funcionamiento de la VM.
Gestor de Volúmenes Lógicos (LVM)
El Logical Volume Manager o LVM es un método para concatenar muchos
volúmenes físicos (discos duros) en un grupo de volúmenes lógicos formando un pool de almacenamiento, una especie de disco virtual.
Los volúmenes físicos se combinan en grupos de volúmenes lógicos, con la
excepción de la partición /boot. La partición /boot no puede estar dentro de
un grupo de volumen lógico porque el cargador de arranque (boot loader) no
lo puede leer. Si queremos tener la partición / (raíz) dentro del volumen lógico, deberemos crear una partición /boot separada del volumen lógico.
Como un volumen físico no puede extenderse a más de un disco, si necesitamos que el volumen lógico se extienda sobre más de un disco, debemos
crear uno o más volúmenes físicos por disco.
20
VIRUTUALIZACIÓN CON KVM
El grupo del volumen lógico se divide en volúmenes lógicos, a los cuales se
les asigna los puntos de montaje como /, /home y el sistema de archivos
ext2 o ext3. Cuando las particiones se llenan, el espacio libre que le queda
al grupo del volumen lógico se le puede añadir al volumen lógico para
Incrementar el tamaño de la partición. Si añadimos un nuevo disco duro, éste puede añadirse al grupo del volumen lógico para aumentar el tamaño de
las particiones.
Nota: El soporte LVM debe estar compilado en el kernel.
VIRTUALIZACIÓN CON KVM
21
Pasos para trabajar con volúmenes lógicos
1. Instalamos el paquete lvm2 :
(apt-get install lvm2)
2. Creamos las particiones del tipo LVM:
parted /dev/sda
(parted) mkpart
Partition name? []? linux2
File system type? [ext2]? ext3
Start?
Start? 11G
End? 20G
(parted) toggle
Partition number? 3
Flag to Invert? boot/root/swap/raid/lvm? lvm
(parted) p
Disk /dev/sda: 30,0GB
Sector size (logical/physical): 512B/512B
Partition Table: mac
Number Start End
Size
File system Name
1
0,51kB 32,8kB 32,3kB
2
64,0MB 10,0GB 9936MB
Apple
2
lvm
Flags
22
VIRUTUALIZACIÓN CON KVM
3. Creamos el volumen físico:
pvcreate /dev/sda1
4. Creamos el Grupo de Volumen:
vgcreate volgrupo1 /dev/sda1
5. Creamos el volumen lógico de 12,68Gigas:
lvcreate -L 12,68G -n lvol1 volgrupo1
lvol1 es el nombre del volumen lógico dentro del grupo de volumen
volgrupo1
6. Formateamos la partición del volumen lógico :
mkfs -t reiserfs /dev/volgrupo1/lvol1
7. Montamos el volumen lógico:
mount /dev/volgrupo1/lvol1
/disco2
(o en el fstab)
pvdisplay Î nos muestra los volúmenes físicos
vgdisplay Î nos muestra los grupos de volumen
•
Para añadir una partición de otro disco físico u otra partición del mismo
disco (pvcreate /dev/sda2) :
pvcreate /dev/sdb1
vgextend volgrupo1
/dev/sdb1
Î extiende el grupo de volu-
men
lvextend -L
27,94G
/dev/volgrupo1/lvol1 Î extiende el volu-
men lógico
27,94G es el valor absoluto del tamaño. Se puede indicar un valor
relativo para sumar el valor con +300M o G
resize2fs
men
/dev/volgrupo1/lvol1 Î cambia el tamaño del voluÎ para ext2/ext3
VIRTUALIZACIÓN CON KVM
23
resize_reiserfs /dev/volgrupo1/lvol1 Î cambia el tamaño del
Î para reiserfs
volumen
Para Borrar el volumen lógico:
lvremove /dev/volgrupo1/lvol1
•
Para borrar el grupo de volumen:
vgremove /dev/volgrupo1
•
Para borrar el volumen físico:
pvremove /dev/sdb1
•
Para quitar una partición del grupo de volúmenes :
vgreduce volgrupo1 /dev/sdb1
•
Para reducir el tamaño de un volumen lógico:
umount /disco2
Î desmontamos el volumen lógico
e2fsck -f /dev/volgrupo1/lvol1 Î hacemos un fsck
resize2fs
/dev/volgrupo1/lvol1
5G
Î
lo redimensionamos
(ext3)
resize_reiserfs /dev/volgrupo1/lvol1 5G Î
lo redimensiona-
mos (en reiserfs)
lvreduce -L 5G /dev/volgrupo1/lvol1
mount -t ext3 /dev/volgrupo1/lvol1 /disco2
Î montamos el
volumen lógico
Fotos (Snapshots) con LVM
Las “fotos” con LVM es una característica estupenda de la gestión de volúmenes lógicos. Los snapshots permiten que creemos un nuevo dispositivo
de bloque que es una copia EXACTA de un volumen lógico congelado en
24
VIRUTUALIZACIÓN CON KVM
algún punto en el tiempo. La ventaja es que no necesitamos parar un sistema que funciona en caliente y que está modificando datos.
Los snapshots son creados por defecto en modo lectura/escritura. Esto nos
permite montar el snapshot, y modificar cosas en el volumen para hacer
pruebas. Si después no nos gusta, podemos desmontarlo y montar el volumen original. También es útil para crear volúmenes con Xen y KVM.
Suponiendo que hemos creado una partición /dev/sda4:
pvcreate /dev/sda4
Physical volume "/dev/sda4" successfully created
vgextend volgrupo1 /dev/sda4
Volume group "volgrupo1" successfully extended
lvcreate -L 10G
-s
-n foto1
/dev/volgrupo1/lvol1
10G Î debería tener igual tamaño que el original por lo menos
-s Î indica que el volumen lógico es un snapshot
-n foto1 Î nombre del snapshot
Después podemos montarlo como una partición más:
mount /dev/volgrupo1/foto1
•
/mnt/disco3
Para convertir la imagen de fichero a lvm:
qemu-img convert vm_lenny.qcow2 -O raw /dev/vol_group1/vm_lenny
•
Para crear el lvm:
lvcreate -L 13G -n vm_lenny vol_group1
•
Con dd también podemos copiar la imagen al lvm:
dd if=/home/kvm/lenny/vm_lenny.qcow2 of=/dev/vol_group1/vm_lenny
•
Para trabajar con LVM en lugar de imágenes, en el fichero xml ponemos
estas líneas:
VIRTUALIZACIÓN CON KVM
25
<disk type='block' device='disk'>
<source dev='/dev/volgrupo1/etch_kvm-disk'/>
Para instalar desde la línea de comandos
desde Internet con LVM:
•
Creamos el volumen lógico:
lvcreate -L 5G -n /dev/volgrupo1/lenny-disk
•
Comenzamos el proceso de instalación:
virt-install --connect qemu:///system -n vm_lenny -r 512 -vcpus=1 -f /dev/volgrupo1/lenny-disk -s 5 -l
http://ftp.us.debian.org/debian/dists/lenny/main/installer-amd64/
--vnc --noautoconsole --os-type linux --os-variant debianLenny -accelerate --network=bridge:br0 --hvm
Esta es la parte del fichero xml que ha creado el instalador:
/etc/libvirt/qemu/vm_lenny.xml
<disk type='block' device='disk'>
<source dev='/dev/volgrupo1/lenny-disk'/>
<target dev='vda' bus='virtio'/>
</disk>
Este sería el fichero xml completo:
<domain type='kvm'>
<name>vm_lenny</name>
<uuid>503a6f57-0faf-80e8-3bd8-5a0e371f9b3c</uuid>
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
26
VIRUTUALIZACIÓN CON KVM
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='block' device='disk'>
<source dev='/dev/volgrupo1/lenny-disk'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='54:52:00:29:44:a8'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='es'/>
</devices>
</domain>
Para convertir una VM de VMDK (Vmware) a
KVM
•
Convertimos la imagen vmdk a raw:
qemu-img convert "Lenny.vmdk" -O raw Lenny.img
El fichero .vmx debe ser convertido a formato xml de libvirt, la utilidad python
vmware2libvirt disponible en Ubuntu Interpid/Jaunty en el paquete virtgoodies permite hacer esta conversión. La syntaxis es:
vmware2libvirt -f file.vmx > file.xml
•
Para que funcione bien el teclado y arranque la máquina, debemos
cambiar el disco (hda por sda) y el teclado en castellano:
Añadimos autoport='yes' keymap='es' a la línea
graphics y debe que-
dar así:
<graphics type='vnc' port='-1' autoport='yes' keymap='es'/>
•
El disco debe ser sda en lugar de hda:
<target dev='sda'/>
VIRTUALIZACIÓN CON KVM
El lo guarda como:
27
<target dev='sda' bus='scsi'/>
en el fichero xml de /etc/libvirt/qemu
Después, debemos importar el fichero xml a libvirt y almacenarlo en
/etc/libvirt/qemu
virsh -c qemu:///system define Lenny.xml o virsh define Lenny.xml
Para convertir una VM de Xen a KVM
Instalamos desde Internet (o desde CD) un S.O. Linux básico.
virt-install --connect qemu:///system -n etch -r 512 --vcpus=1 -f
etch_kvm.raw -s 5 -l
http://ftp.us.debian.org/debian/dists/etch/main/installer-i386/ --vnc -noautoconsole --os-type linux --os-variant debianEtch --accelerate -network=bridge:br0 --hvm --force
- Nos creamos 3 particiones de 512 MB para la /boot , una del tamaño de la
Xen (en este caso 4 GB) y el resto para swap . Total en nuestro ejemplo 5
GB
- Creamos un dispositivo de bloques loop0 con la imagen original de Xen
losetup /dev/loop0 etch_xen.raw
- Creamos un dispositivo del tipo mapper con la etch creada
apt-get install kpartx ; kpartx -a etch_kvm.raw
-
Montamos las particiones de Xen y de KVM
mkdir /mnt/loop0
mkdir /mnt/loop1
mount /dev/mapper/loop1p2 /mnt/loop1
==>
KVM
(loop1p1 es
/boot y loop1p2 es / )
mount /dev/loop0 /mnt/loop0
==> Xen
28
VIRUTUALIZACIÓN CON KVM
- Movemos el directorio /boot, /lib/modules y /initrd de la imagen KVM fuera del punto de montaje
mv /mnt/loop1/boot/ .
mv /mnt/loop1/initrd .
mv /mnt/loop1/lib/modules .
- Borramos todos los directorios de la maquina KVM recién creada
rm -rf /mnt/loop1/*
- Copiamos todos los datos del punto de montaje de Xen a la KVM
cp -a /mnt/loop0/* /mnt/loop1
- Movemos los directorios /boot , /lib/modules y /initrd a la imagen KVM
rm -rf /mnt/loop1/boot/
rm -rf /mnt/loop1/initrd/
mv boot/ /mnt/loop1
mv initrd/ /mnt/loop1
mv modules /mnt/loop1/lib
- Si está vacío el directorio initrd, restauramos el link (dependerá de la versión del kernel):
rm /mnt/loop1/initrd ; ln -s /mnt/loop1/boot/initrd.img-2.6.18-6-k7
/mnt/loop1/initrd
- Desmontamos las particiones
umount /mnt/loop1
umount /mnt/loop0
- Deshacemos los dispositivos de bloques del tipo loop y mapper
kpartx -d etch_kvm.raw
VIRTUALIZACIÓN CON KVM
losetup -d /dev/loop0
La VM KVM (copia del Xen) estará lista para arrancar.
Este es el fichero de conf. xml:
<domain type='kvm'>
<name>etch</name>
<uuid>e5c55748-7e36-0a4b-9de4-4265ca4ff882</uuid>
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='disk'>
<source file='/home/ibex/etch_kvm.raw'/>
<target dev='hda' bus='ide'/>
</disk>
<interface type='bridge'>
<mac address='54:52:00:5b:e2:46'/>
<source bridge='br0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='es'/>
</devices>
</domain>
29
30
VIRUTUALIZACIÓN CON KVM
Snapshots (fotos) y clonación
Para clonar VM’s disponemos del comando virt-clone. Sin embargo en Debian Lenny el comando virt-clone da este error:
virt-clone -o vm_lenny -n copia_vm_lenny -f
/home/kvm/lenny/copia_vm_lenny.img
ERROR
list index out of range
hay que bajarse la versión de squeeze :
wget http://debian.inode.at/debian/pool/main/v/virtinst/virtinst_0.400.32_all.deb
y hacer un dpkg -i para instalar el paquete:
DEBUG
Starting duplicate.
mar, 08 sep 2009 13:14:28 DEBUG
Local Cloning
/home/kvm/lenny/vm_lenny.qcow2 to /home/kvm/lenny/copia_vm_lenny.img,
sparse=True, block_size=4096
Cloning /home/kvm/lenny/v 100% |===================| 12 GB
mar, 08 sep 2009 13:15:57 DEBUG
Duplicating finished.
Clone 'copia_vm_lenny' created successfully.
mar, 08 sep 2009 13:15:57 DEBUG
end clone
el modo debug del comando se activa con -d
NOTA: NO se puede ejecutar con la maquina en ejecución.
Las opciones del comando virt-cline son las soguientes:
01:28
VIRTUALIZACIÓN CON KVM
31
-o
original guest
-n
nombre nuevo del guest
-f
archivo o partición (o volumen lógico)
Las maquinas virtuales están en /etc/libvirt/qemu
Para crear un snapshot de una VM en un volumen lógico lo haremos con los
siguientes comandos:
Miramos el tamaño del volumen lógico de una VM con el comando lvdisplay:
--- Logical volume --LV Name
/dev/volgrupo1/lenny-disk
VG Name
volgrupo1
LV Size
5,00 GB
Y nos creamos el snapshot con el comando lvcreate:
lvcreate -L 5G -s -n fotolenny-disk /dev/volgrupo1/lenny-disk
Logical volume "fotolenny-disk" created
Hacemos la copia del snapshot con el comando dd (por ejemplo) a un disco
destino, a un fichero o a otro volumen lógico:
dd if=/dev/volgrupo1/fotolenny-disk
of=/mnt/disco_ethernet/kvm/fotolenny-dis.img bs=16m
y borramos el snapshot una vez copiados los datos :
lvremove /dev/volgrupo1/fotolenny-disk
Do you really want to remove active logical volume "fotolenny-disk"?
[y/n]: y
Logical volume "fotolenny-disk" successfully removed
32
VIRUTUALIZACIÓN CON KVM
Opciones del comando virsh
(virtual shell)
virsh dominfo etch
Id:
==> muestra información básica de una VM
33
Name:
etch
UUID:
e5c55748-7e36-0a4b-9de4-4265ca4ff882
OS Type:
State:
hvm
running
CPU(s):
1
CPU time:
3918,0s
Max memory:
524288 kB
Used memory:
524288 kB
Autostart:
disable
virsh domstate etch ==> estado de la VM (en este caso corriendo)
running
virsh nodeinfo ==> información básica sobre el nodo como números de
CPU's, memoria física
CPU model:
CPU(s):
CPU frequency:
CPU socket(s):
x86_64
4
2400 MHz
1
VIRTUALIZACIÓN CON KVM
33
Core(s) per socket: 4
Thread(s) per core: 1
NUMA cell(s):
1
Memory size:
8199492 kB
virsh capabilities ==> imprime un documento xml con las capacidades del
hypervisor al cual estamos conectados.
virsh vcpuinfo etch ==> devuelve información sobre las CPU's virtuales del
dominio
VCPU:
CPU:
State:
0
0
running
CPU Affinity: yyyy
virsh edit etch ==> edita el fichero de conf. de ese dominio. Entra en modo
vi y no funciona un export VISUAL
virsh freecell ==> imprime la cantidad de memoria disponible. Solo funciona cuando tenemos dos o más procesadores y verifica la memoria que se
usa entre la comunicación entre CPU's
virsh net-list
==> lista las redes virtuales
Name
State
Autostart
----------------------------------------La configuración de red virtual está en ficheros xml en el directorio
/etc/libvirt/qemu/networks/ y el fichero por defecto es el
default.xml. Es-
te es su contenido:
<network>
<name>default</name>
<uuid></uuid>
<bridge name="virbr0" />
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254"
/>
</dhcp>
34
VIRUTUALIZACIÓN CON KVM
</ip>
</network>
Para crear una red virtual hay que generar un fichero en formato xml . El
comando net-create file crea una red virtual partiendo de un fichero xml:
virsh net-create default.xml.
Network default created from default.xml
Al hacer un ifconfig veremos el nombre del bridge:
virbr0
Link encap:Ethernet HWaddr d2:a3:e4:1e:97:2d
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
inet6 addr: fe80::d0a3:e4ff:fe1e:972d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)
Para quitarlo:
virsh net-destroy default
Network default destroyed
VIRTUALIZACIÓN CON KVM
35
Configuración de la red en KVM
Si no especificamos nada en la conf. De la máquina virtual (VM) ni en el anfitrión, la red de las VM’s funciona en modo NAT. Para que las máquinas virtuales puedan trabajar en modo bridge, es decir, que accedan a la red con
su propia IP de manera transparente como si estuvieran en modo no virtual,
debemos tener instaladas las utilidades de bridge en el host anfitrión:
apt-get install bridge.utils
El fichero /etc/network/interfaces contiene:
auto lo
iface lo inet loopback
auto eth0 eth1
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.5.55
network 192.168.5.0
netmask 255.255.255.0
broadcast 192.168.5.255
gateway 192.168.5.1
bridge_ports eth0
bridge_fd 9
bridge_hello 2
36
VIRUTUALIZACIÓN CON KVM
bridge_maxage 12
bridge_stp off
iface eth1 inet static
address 192.168.9.55
network 192.168.9.0
netmask 255.255.255.0
broadcast 192.168.9.255
Para modo bridge basta con que la maquina virtual defina esto en su xml:
<interface type='bridge'>
<mac address='54:52:00:29:44:a8'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
Para definir un segundo interface para la VM:
<interface type='bridge'>
<mac address='54:52:00:29:44:a8'/>
<source bridge='br0'/>
<model type='virtio'/>
==> ! ojo! con etch. y versiones antiguas.
No soporta modelo virtio
</interface>
<interface type='bridge'>
<mac address='54:52:00:29:44:a9'/>
<source bridge='br1'/>
VIRTUALIZACIÓN CON KVM
37
<model type='virtio'/>
</interface>
Para sacarlo por otro interface físico usaremos br1 en lugar de br0
br0 es el interface tipo bridge
==>
veremos solo tráfico del tipo
bridge
virbr0 es el interface bridge virtual
==> se usa para red del tipo rutado
y NAT. No se ve tráfico de las VM en modo bridge
vnet0 es el nic virtual
==> hay uno poe cada VM
Para ver los interfaces del tipo bridge:
brctl show
bridge name
bridge id
STP enabled
interfaces
br0
8000.0025643abbf1
no
eth0
br1
8000.0025643abbf2
no
eth1
vnet0
vnet1
virbr1
8000.000000000000
yes
Para saber que vnet tiene una VM:
grep "ifname=" /var/log/libvirt/qemu/etch.log
etch_kvm.raw,if=ide,index=0 -net nic,macaddr=54:52:00:77:ca:a2,vlan=0 net tap,fd=14,script=,vlan=0,ifname=vnet1 -serial pty -parallel none -usb vnc 127.0.0.1:1 -k es
La configuración de la red por defecto está en :
/etc/libvirt/qemu/networks/default.xml
Y para indicarle que definiciones de red se arrancan de manera automática
están en :
38
VIRUTUALIZACIÓN CON KVM
ls -l /etc/libvirt/qemu/networks/autostart/
lrwxrwxrwx
1
root
root
38
mar
1
16:57
default.xml
->
/etc/libvirt/qemu/networks/default.xml
Configuración en modo NAT (no bridge) a
través del interface eth1 :
/etc/libvirt/qemu/networks# cat default.xml
<network>
<name>default</name>
<uuid></uuid>
<bridge name="virbr0" />
<forward mode="nat"/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254"
/>
</dhcp>
</ip>
</network>
Esta es la conf. del xml de la máquina virtual:
<interface type='network'>
<mac address='52:54:00:83:bb:e1'/>
<source network='default'/>
</interface>
Libvirt pone las reglas de NAT necesarias:
iptables -n -L -t nat
Chain PREROUTING (policy ACCEPT)
target
prot opt source
destination
Chain POSTROUTING (policy ACCEPT)
target
prot opt source
destination
MASQUERADE all -- 192.168.122.0/24
!192.168.122.0/24
Chain OUTPUT (policy ACCEPT)
target
prot opt source
destination
VIRTUALIZACIÓN CON KVM
39
Configuración en modo rutado a través del
interface eth1 :
Los interfaces de red del anfitrión igual que en la configuración anterior. El
fichero default.xml (o como lo queramos llamar):
<network>
<name>default</name>
<uuid></uuid>
<bridge name="virbr0" />
<forward mode="route" dev="eth1"/>
Î sin forward
la red es privada para los invitados
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254"
/>
</dhcp>
</ip>
</network>
Y el del invitado no cambia:
<interface type='network'>
<mac address='52:54:00:83:bb:e1'/>
<source network='default'/>
</interface>
NOTA: Para que los invitados usen DHCP debemos tener parado el servicio
dnsmasq (y quitado de los rc de arranque):
40
VIRUTUALIZACIÓN CON KVM
/etc/init.d/dnsmasq stop
virsh net-autostart default
==> arranca automáticamente una red vir-
tual en el reboot del anfitrión
Network default marked as autostarted
Si miramos antes de ejecutar el comando anterior, comprobamos que este
directorio está vacío:
ls /etc/libvirt/qemu/networks/autostart/
Después de ejecutar el comando veremos un link al fichero xml de la red definida:
ls -l /etc/libvirt/qemu/networks/autostart/
total 0
lrwxrwxrwx
1
root
root
38
oct
22
13:34
default.xml
->
/etc/libvirt/qemu/networks/default.xml
Conectarse a la consola de una VM
virsh console vm
Î se conecta a la consola de una VM
NOTA: Para que nos podamos conectar a la consola serie desde virsh:
Hay que desconectar en el invitado en el fichero inittab las líneas Tx (T0, T1,
….) y tenemos que tener instalado el paquete mgetty:
/etc/inittab
# The default runlevel.
# This is run first except when booting in emergency (-b) mode.
# What to do when CTRL-ALT-DEL is pressed.
# Action on special keypress (ALT-UpArrow).
# The "id" field MUST be the same as the last
VIRTUALIZACIÓN CON KVM
41
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
Y en la VM ejecutamos el comando kill -1 1 (reiniciamos init).
El comando es:
virsh console etch
(virsh console dom)
Para salir de la consola es igual que en Xen:
Ctrl - ]
42
VIRUTUALIZACIÓN CON KVM
Gestionar VM’s con luns de
almacenamiento compartido iSCSI
Para acceder a una lun iscsi
aptitude install open-iscsi
editamos el fichero /etc/iscsi/iscsid.conf
... and set node.startup to automatic:
[...]
node.startup = automatic
[...]
Arrancamos el iniciador :
/etc/init.d/open-iscsi restart
Vemos el target:
iscsiadm -m discovery -t st -p 192.168.5.99
192.168.5.99:3260,1 iqn.2006-01.com.openfiler:tsn.e94659140bc2
Y nos conectamos a el:
open-iscsi restart
Disconnecting iSCSI targets:.
Stopping iSCSI initiator service:.
Starting iSCSI initiator service: iscsid.
Setting up iSCSI targets:
VIRTUALIZACIÓN CON KVM
43
Logging in to [iface: default, target:
iqn.2006-01.com.openfiler:tsn.e94659140bc2, portal: 192.168.5.99,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.e94659140bc2,
portal: 192.168.5.99,3260]: successful
Mounting network filesystems:.
Vemos nuestro nodo:
iscsiadm -m node
192.168.5.99:3260,1 iqn.2006-01.com.openfiler:tsn.e94659140bc2
En este caso nuestro target iscsi Openfiler (www.openfiler.com):
Los nodos los podemos ver en /etc/iscsi/nodes/
Las lun las podemos ver así en lugar de ver como discos dB, sdc …..:
ls /dev/disk/by-path/ip-192.168.5.99\:3260-iscsi-iqn.200601.com.openfiler\:tsn.4fe47b1d4c27-lunip-192.168.5.99:3260-iscsi-iqn.2006-01.com.openfiler:tsn.4fe47b1d4c27-lun-0
ip-192.168.5.99:3260-iscsi-iqn.2006-01.com.openfiler:tsn.4fe47b1d4c27-lun-1
pvcreate /dev/disk/by-path/ip-192.168.5.99:3260-iscsi-iqn.200601.com.openfiler:tsn.4fe47b1d4c27-lun-1
Physical
volume
"/dev/disk/by-path/ip-192.168.5.99:3260-iscsi-iqn.2006-
01.com.openfiler:tsn.4fe47b1d4c27-lun-1" successfully created
Si ya tenemos un grupo de volumen y queremos añadir la lun de openfiler:
vgextend
volgrupo1
/dev/disk/by-path/ip-192.168.5.99:3260-iscsi-
iqn.2006-01.com.openfiler:tsn.4fe47b1d4c27-lun-0
44
VIRUTUALIZACIÓN CON KVM
Si queremos crear otro grupo de volumen contra la lun del openfiler:
vgcreate
volgrupo_openfiler
/dev/disk/by-path/ip-192.168.5.99\:3260-
iscsi-iqn.2006-01.com.openfiler\:tsn.4fe47b1d4c27-lun-0
Volume group "volgrupo_openfiler" successfully created
Para instalar en la nueva lun como un volumen lógico de 5Gigas:
virt-install --connect qemu:///system -n vm_lenny -r 512 --vcpus=1 -f
/dev/volgrupo_openfiler/lenny-disk -s 5 -l
http://ftp.us.debian.org/debian/dists/lenny/main/installer-amd64/ --vnc -noautoconsole --os-type linux --os-variant debianLenny --accelerate -network=bridge:br0 --hvm
En las siguientes capturas podemos ver la conf. de nuestro Openfiler. Primero nos conectamos al puerto 446 en https y entramos como usuario:
openfiler y password:
password
VIRTUALIZACIÓN CON KVM
45
Después configuramos la red en System Î Network Configuration:
Creamos un nuevo volumen físico para el almacenamiento. Para ello vamos
a la pestaña Block Devices:
46
Después creamos un grupo de Volumen:
Y creamos un volumen lógico en Add Volume:
VIRUTUALIZACIÓN CON KVM
VIRTUALIZACIÓN CON KVM
Habilitamos el servicio iSCSI Target en la pestaña Services :
Y añadimos un Target iSCSI en la pestaña Volumes Î iSCSI targets:
Y finalmente mapeamos las diferentes luns en la pestaña LUN Mapping :
47
48
VIRUTUALIZACIÓN CON KVM
Y en la pestaña Network ACL permitimos acceso al target iSCSI:
Descargar