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: