KVM: virtualización nativa en Linux

Las soluciones de virtualización son cada vez más utilizadas, y es que sus beneficios están fuera de discusión ya que nos permiten tener a nuestra disposición diferentes plataformas, ya sea para desarrollo, testing, servidores o la tarea que vayamos a necesitar, sin tener que caer en lo costoso de adquirir nuevo hardware para ello.

virt-manager-vm-list

Y entre las alternativas más conocidas tenemos a VMware, Virtualbox o Hyper-V, pero hay una que es prácticamente nativa en GNU/Linux y se llama KVM.

Introducción

¿Qué es KVM?

KVM (Kernel Virtual Machine) es un módulo del kernel Linux que permite que los programas en espacio usuario utilicen las características de virtualización por hardware ofrecidas por diferentes procesadores. En la actualidad, soporta procesadores AMD e Intel (x86 y x86_64), PPC 440, PPC 970, S/390, y ARM (Cortex A15).

¿Qué es QEMU?

QEMU es un emulador de máquinas y virtualizador genérico open source. Cuando se usa como emulador de máquinas, QEMU puede ejecutar sistemas operativos y programas compilados para una arquitectura (por ejemplo un sistema ARM) en una máquina diferente (por ejemplo una PC), tal como lo demostré en el artículo Emular Raspberry Pi con QEMU y KVM en CentOS 6. Al utilizar traducción dinámica, alcanza muy buena performance.

Cuando se utiliza como virtualizador, QEMU alcanza casi la performance nativa ya que ejecuta el código guest directamente en el CPU host. QEMU soporta virtualización cuando se ejecuta bajo el hipervisor Xen o a través del módulo del kernel KVM en Linux. Cuando se usa con KVM, QEMU puede virtualizar sistemas guest x86, PowerPC y S390, entre otros.

QEMU aprovecha KVM cuando ejecuta una arquitectura guest que coincide con la arquitectura host. Por ejemplo, cuando se utiliza qemu-system-x86 sobre un procesador x86 compatible, se aprovecha la aceleración de KVM (beneficiando tanto al sistema guest como al host), ya que el código guest se ejecuta directamente en el host (sin traducción).

Anteriormente, KVM mantenía su propio fork de QEMU llamado «qemu-kvm» para soportar virtualización por hardware en arquitecturas x86. Actualmente está deprecated ya que QEMU ha incorporado la funcionalidad necesaria (ver http://wiki.qemu.org/KVM).

¿Qué es libvirt?

libvirt (The virtualization API) es un conjunto de herramientas para interactuar con las capacidades de virtualización de las versiones recientes de Linux (y otros sistemas operativos), liberado bajo la licencia «GNU Lesser General Public License».

libvirt soporta un gran conjunto de tecnologías entre las que se destacan:

  • KVM/QEMU
  • Xen (en Linux y Solaris)
  • LXC
  • OpenVZ
  • El kernel paravirtualizado User Mode Linux
  • VirtualBox
  • VMware ESX y GSX
  • VMware Workstation y Player
  • Microsoft Hyper-V
  • IBM PowerVM
  • El hipervisor Parallels
  • Redes virtuales usando bridging, NAT, VEPA y VN-LINK
  • Almacenamiento en discos IDE/SCSI/USB, FibreChannel, LVM, iSCSI y NFS

libvirt permite administrar hosts de forma remota utilizando encriptación TLS y certificados x509; autenticación con Kerberos y SASL; control de acceso local mediante PolicyKit; Zeroconf utilizando Avahi; administración de máquinas virtuales, redes y almacenamiento; y una API cliente portable para Linux, Solaris y Windows.

Entre su amplia variedad de aplicaciones se destacan: virsh y virt-manager.

Eso si, para poder instalar KVM vamos a necesitar que nuestro hardware ofrezca soporte para virtualización, algo que en general cualquier equipo nuevo va a ofrecernos pero pues nunca está de más saber a ciencia cierta. Así que abrimos una ventana de terminal (Ctrl + Alt + T) y ejecutamos:

egrep -c '(svm|vmx)' /proc/cpuinfo

Si el resultado es 0 esto quiere decir que nuestro hardware no ofrece soporte para virtualización, tanto de Intel VT-x como de AMD-V, pero si por el contrario obtenemos un 1 o más esto significa que estamos habilitados para instalar KVM en nuestro equipo, así que nos preparamos para ello pero atención, que puede que necesitemos habilitar la virtualización desde la BIOS, así que si algo falla a pesar de haber obtenido el visto bueno con este comando, ya sabemos donde tenemos que ir a mirar.

k1

Instalamos los paquetes necesarios:

sudo apt-get install qemu-kvm libvirt-bin bridge-utils virt-manager

Luego necesitamos añadir a nuestro usuario al grupo libvirtd, ya que únicamente los usuarios que pertenecen a este grupo o a root son los habilitados para utilizar KVM. Por ejemplo, para añadir al usuario guille a libvirtd ejecutamos:

sudo adduser guille libvirtd

Una vez hecho eso tenemos que cerrar la sesión y volver a iniciarla, y lo primero que tenemos que hacer al realizar eso es ejecutar el siguiente comando, que nos mostrará la lista de máquinas virtuales. La cual desde luego debiera estar vacía:

virsh -c qemu:///system list

k2

De acuerdo, ya estamos listos para comenzar a crear una máquina virtual en KVM.

Creación de VM’s por línea de comando virt-install:

Escribimos en la consola:

virt-install --connect=qemu:///system --name=Windows10prueba --ram=20148 --vcpus=1 --check-cpu --os-type=windows --hvm --vnc --accelerate --disk=/home/discosKVM/win10.img,size=32,sparse=true --cdrom=/home/administrador/windows10.iso --network=bridge:br0

El significado de los parámetros:

  • name=windows10prueba -> El nombre que le vamos a dar a la VM.
  • ram=20148 -> La RAM que le vamos a asignar (se puede modificar posteriormente).
  • vcpus=1 -> CPU’s virtuales que le vamos a asignar.
  • check-cpu -> Comprueba que el nº de CPU’s asignadas no exceda el del Host y si es así nos avisa.
  • os-type=windows -> Tipo de Sistema Operativo que vamos a instalar (linux o windows). Ayuda a cconfigurar automáticamente muchos parámetros de hardware.
  • hvm -> Que utilice full-virtualization.
  • disk=/home/proyectosbeta/win10.img,size=32, sparse=true -> El disco que vamos a crear, size=32 el tamaño en GB, sparse=true que no reserve todo el espacio y que lo vaya asignando a medida que crece el disco (.img).
  • cdrom=/home/administrador/windows10.iso -> La iso o el cd si está puesto y montado.
  • network=bridge:br0 -> Que utilice como red el dispositivo bridge ‘br0‘ para poder tener la red en el mismo rango que el host.

Virtual Machine Manager

Lo más fácil es utilizar Virtual Machine Manager, la herramienta gráfica que instalamos unos pasos atrás.

k3

Hacemos click en el primer icono de la izquierda (en la barra superior de menú) que es el que nos permite crear máquinas virtuales, e indicamos el nombre que tendrá nuestra máquina virtual, indicando debajo la forma en la cual vamos a utilizarla: mediante una imagen ISO o de CDROM, instalación de red (HTTP, FTP, NFS), Network boot (PXE) o mediante la importación de una imagen ya preexistente.

k4

Hacemos click en ‘Siguiente’ y ahora se nos solicita que ingresemos la ruta hacia la imagen ISO (o hacia la dirección de red, o hacia la imagen para importar, todo dependiendo de lo que hayamos seleccionado en el paso anterior), y una vez que lo hacemos elegimos el tipo de sistema operativo y la versión que le corresponde.

k5

Luego, click en ‘Siguiente’ y ahora lo que indicaremos será la cantidad de memoria y de CPU que tendrá nuestra máquina virtual, atendiendo siempre al hecho de que en cierto modo ello nos será ‘restado’ de nuestro equipo anfitrión, por lo cual siempre es conveniente no superar el 50 por ciento de lo que tengamos disponible.

k6

Para instalaciones completas (no para pruebas de sistemas «live») necesitaremos asignarle un disco virtual. IMPORTANTE: por defecto se crean los discos virtuales en la ruta «/var/lib/libvirt/images»; si quieres cambiar la ubicación debes crear previamente un «grupo de almacenamiento»

k7

NOTAS: Hay distintos formatos que reconoce KVM, como pueden ser, entre otros:

  • qcow y qcow2, formato propio de qemu, un sistema de virtualización por software, del que KVM usa su modelo de dispositivo.
  • vmdk, formato de VMware, otro sistema de virtualización
  • dmg, imágenes de disco de Mac OS
  • raw, que no tiene formato propiamente dicho, si no que tiene los datos como los tendría un disco duro físico.

También es posible usar un disco duro físico. Recomiendousar el formato qcow2. Entre sus características destacan dos:

  • podemos usar el mismo archivo para distintas máquinas, y cuando una escriba se crea un archivo con la escritura que solo verá esa máquina.
  • no ocupa el tamaño del disco duro definido, si no solo el espacio del disco ocupado, y según se van escribiendo archivos, aumenta su tamaño.

k10

Luego de un click en siguiente somos llevados al paso en el cual debemos configurar la red, y aquí por defecto siempre se utiliza una configuración NAT que nos permite ‘salida’ a la red pero que no nos mostrará al equipo invitado como uno más en nuestra red local. Desde luego, podemos modificar esto si tenemos necesidades diferentes (por ejemplo, si estamos ejecutando servidores virtuales).

k8

Cuando ya tenemos todo listo hacemos click en ‘Finish’ y podremos comenzar a instalar el sistema operativo como lo haríamos en un equipo común y corriente.

k9

NOTA: Es posible modificar el hardware de la máquina virtual utilizando el icono (i) «Mostrar detalles del hardware virtual»:

k11

Otra forma de crear máquinas virtuales: Aqemu

Lo primero que necesitamos es instalarlo mediante

sudo apt-get install aqemu

A diferencia del gestor anterior en esta ocasión se instala TODO el soporte de arquitecturas que es capaz de emular qemu (aparte de las x86): arm,  mips, ppc y sparc.

La primera vez que ejecutamos AQEMU nos presentará en pantalla un asistente de configuración, cuyo primer paso es elegir el idioma del interfaz (desgraciadamente no tenemos el Español como opción). En el segundo paso se nos pregunta por el directorio en el que residirán las máquinas virtuales (podemos dejar el valor por defecto a menos que se trate de un sistema de ficheros remoto o removible), si queremos utilizar el modo “Gestor de dispositivos” (recomiendo su activación) y queremos experimentar con un visor VNC empotrado en la ventana principal de AQEMU (aquí recomiendo que no, es demasiado inestable aún).

El siguiente paso nos pregunta por los “emuladores” que tenemos instalados. Pulsamos en “Search” y AQEMU buscará (y encontrará) las herramientas de KVM y QEMU. Si estamos de acuerdo con el resultado, continuamos con el siguiente paso en el que se va a configurar QEMU. Pues bien, lo mejor es dejarlo todo en sus valores por defecto y finalizar el asistente, con lo que se nos presentará la venta principal de AQEMU. Si queremos ejecutar de nuevo el asistente, tenemos la opción en el menú “File”, al igual que podemos cambiar la configuración directamente a través de las opciones “General Settings” y “Advanced Settings”.

aq1

Ahora es cuestión de utilizar el asistente de creación de máquinas virtuales (segundo icono por la izquierda en la barra de herramientas) para generar la primera. Cuando se nos pregunte qué emulador vamos a utilizar, probaremos primero con KVM. Si hay problemas de compatibilidad, entonces probamos de nuevo con QEMU.

aqemu2

Conclusión

Ya podremos probar diferentes máquinas virtuales y sistemas operativos, y aquí nuevamente decimos lo mismo que muchas veces: en la libertad de elección tenemos a uno de los puntos fuertes de Linux. Hay quienes preferirán Virtualbox, XEN o VMware, y la realidad es que el rendimiento en favor de uno u otro dependerá de varios factores así que lo mejor que podemos hacer es probar.

Artículo original en ubunlog.com