# Introducción

Con el término virtualización nos referiremos a las distintas técnicas para simular por software una máquina física (p.ej, un servidor con su CPU, memoria, bus,...).
Debido al constante aumento de la velocidad de los procesadores a mediados de los años 90 se hizo evidente que en gran cantidad de ocasiones, la potencia del hardware estaba siendo infrautilizada por el software. Así, no es anormal comprobar como el tiempo de utilización de CPU en un servidor dedicado a correo o servicios web tan apenas supera de media el 1% de uso. Incluso en aplicaciones más pesadas como bases de datos la utilización media puede no suponer más de un 20%. Con contadas excepciones (programas 3D CAD/CAM o juegos) la mayor parte de las aplicaciones no utilizan más que un pequeño tanto por cien de la potencia disponible en la CPU. Con la llegada de las arquitecturas multi-core (varios procesadores integrados en un único chip) el problema aumenta ya que muchas aplicaciones no están diseñadas para ejecutarse simultáneamente de forma paralela en varios procesadores. Es decir, que aun cuando el software esté consumiendo el 100% de tiempo de un procesador, los demás procesadores estarán parados a la espera de alguna tarea pendiente.
La virtualización permite reutilizar (parte de) la potencia disponible en las modernas CPUs permitiendo que aplicaciones que se ejecutaban de forma independiente en distintas máquinas físicas continuen ejecutándose de forma independiente en distintas máquinas virtuales dentro de una misma máquina física sin que disminuya de forma apreciable el rendimiento y ahorrando gran cantidad de costes de mantenimiento.
De forma muy resumida e imprecisa pero pedagógica la virtualización funciona del siguiente modo. Ejecutamos un programa 'virtualizador' dentro de la máquina física. Este 'virtualizador' simula una segunda máquina dentro de nuestro sistema. Desde el punto de vista de nuestro sistema operativo este virtualizador no es mas que una aplicación más. Por otro lado si ahora dentro del virtualizador arrancamos un programa, p.ej, un CD de instalación, dicho programa creerá que se está ejecutando dentro del entorno virtual creado y no tendrá constancia alguna del hardware real sobre el que corre. Así, al acceder al disco duro no verá el disco duro real, sino un disco duro virtual creado por el virtualizador y que probablemente corresponda a un fichero dentro del sistema de ficheros de nuestra máquina física. Lo mismo ocurrirá con la memoria RAM o la conexión de red.
Existen gran cantidad de aplicaciones capaces de crear un virtualizador como VM-Ware, Virtuozzo, VirtualBox, KVM, Xen, etc... Cada una de ellas tiene sus ventajas e inconvenientes.
De momento empezaremos hablando de KVM (Kernel Virtual Machine) ya que está soportado oficialmente por el kernel de linux y se encuentra disponible en la mayoría de las distribuciones modernas del sistema operativo. Se explicará como instalar un configurar una máquina virtual. Los ejemplos utilizan la distribución Mandriva aunque son aplicables con cambios menores a cualquier otra distribución.

# KVM: Instalación y configuración

Antes de nada es conveniente comprobar que la CPU tiene soporte hardware para virtualización. Si no es así, se puede continuar con la instalación pero el rendimiento final será muy inferior al esperado. También hay que resaltar que las CPUs antiguas (anteriores al 2007 aproximadamente) aun teniendo soporte hardware para virtualización tenían un rendimiento bastante pobre. Para comprobar si la CPU tiene soporte hardware para virtualización:
A continuación instalamos de repositorio el software necesario:
(virt-manager en realidad sólo hace falta instalarlo en los clientes que vayan a acceder al sistema, normalmente a través de una conexión remota VNC).
Iniciamos el demonio libvirt:
Para comprobar que el demonio se ha ejecutado correctamente:
El siguiente paso (y el más complicado) es reconfigurar la red. Generalemente, tendremos una tarjeta ethernet asociada a una IP. Sin embargo ahora queremos que la tarjeta ethernet sea compartida de forma transparente tanto por nuestro sistema operativo original como por las máquinas virtuales ejecutandose bajo el mismo. La solución es crear un interfaz virtual "puente". La tarjeta física ethernet y las tarjetas virtuales irán asociadas a dicho puente. Para ello instalamos primero el software bridge-utils:
Creamos/editamos el fichero /etc/sysconfig/network-scripts/ifcfg-br0 (tomar como referencia /etc/sysconfig/network-scripts/ifcfg-eth0):
A su vez modificamos la configuración de eth0 ya que IPADDR y otros parámetros (BOOTPROTO, DNS1, GATEWAY, NETMASK) deben ser eliminados/comentados. Además hay que añadir la opción BRIDGE=br0 para indicar que se enlace al bridge0:
Una vez hechos los cambios reiniciamos la red:
Ahora al mostrar la configuración de red mediante ifconfig debemos ver algo similar a:
A continuación instalamos un sistema huesped (similar a si instalásemos un sistema operativo en una máquina física):
Insertamos el CDROM de instalación en nuestra máquina y a continuación:
Importante: Si ejecutamos varias máquinas virtuales en paralelo (caso habitual) es importante no olvidar poner una MAC diferente para cada máquina. En caso contrario obtendremos errores aleatoreos de red.
La máquina virtual arrancará y empezará a instalar desde /dev/cdrom. Como hemos indicado la opción --vnc no veremos nada en pantalla. Debemos conectar primero mediante un cliente VNC a nuestra máquina virtual:
El puerto 5900 puede variar si existe más de una máquina virtual en funcionamiento (empieza en 5900 y vá creciendo). El comando :
nos indicará el puerto correcto. El número anterior hay que sumarlo a 5900 de forma que el comando correcto quedará como:
(Podemos también utilizar el gestor de máquinas virtuales en lugar de vncviewer accediento al menú Aplicaciones -> Herramientas -> Gestor de Máquinas virtuales)
Una vez conectados por vnc podemos continuar la instalación del sistema en nuestro CDROM como lo haríamos habitualmente.

## Utilidades

virsh (virtual shell) permite controlar el proceso kvm, pausándolo, realizando un backup del disco duro virtual,etc.... Para ello:
Ejs:

# Resolución de problemas
## Problemas con la MAC de la tarjeta ethernet

Suele ser bastante habitual utilizar una imágen como plantilla para nuevas máquinas virtuales. En este caso al arrancar una nueva máquina virtual basada en la plantilla con una nueva MAC virtual el sistema udev detecta que eth0 ya está asignado a la MAC utilizada para crear la plantilla y entonces asociará la nueva MAC al dispositivo eth1. Esto puede generar molestias en sistemas en producción. La solución es editar el fichero correspondiente en /etc/udev/rules.d/ y eliminar la línea correspondiente a la antigua MAC. El fichero en concreto puede variar en cada distribución pero basta con hacer algo similar a:
En el siguiente reinicio de la máquina virtual se asignará la MAC a eth0.

## Controlando los recursos de la máquina virtual

El sistema operativo físico el que esta fuera de la vmware ve cada máquina virtual como un proceso más. Podemos controlar la prioridad de cada máquina virtual mediante los comandos habituales renice e ionice. Por ejemplo una máquina virtual dedicada a correo puede ser ejecutada con mínima prioridad (nice 19, ionice idle).