Conocer las diferentes tecnologías y herramientas de virtualización tanto para procesamiento, comunicación y almacenamiento.
Diseñar, construir y analizar las prestaciones de un centro de proceso de datos virtual.
Documentar y mantener una plataforma virtual.
Realizar tareas de administración de infraestructuras virtuales.
El objetivo de las plataformas de virtualización es, eventualmente, crear y gestionar máquinas virtual completas que funcione de forma aislada del resto del sistema y que permita trabajar con sistemas virtualizados de forma flexible, escalable y adaptada a cualquier objetivo. Eventualmente, el objetivo de este este tema es aprender a crear infraestructura como servicio tal como vimos en el primer tema. Para ello necesitamos configurar una serie de infraestructuras virtuales, especialmente almacenamiento.
Los programas que permiten crear infraestructuras virtuales completas se denominan hipervisores. Un hipervisor permite manejar las diferentes infraestructuras desde línea de órdenes o mediante un programa, y a su vez se habla de dos tipos de hipervisores: los de tipo I o bare metal que se ejecutan directamente sobre el hardware (es decir, el sistema arranca con ellos) y los de tipo II o alojados, que se ejecutan dentro de un sistema operativo tradicional como un módulo del núcleo o simplemente un programa. En muchos casos la diferencia no está clara, porque hay hipervisores que son distribuciones de un sistema operativo con módulos determinados y por lo tanto de Tipo II (si consideramos el módulo) o de Tipo I (si consideramos el sistema operativo completo), y en todo caso la distinción es más académica que funcional; en la práctica, en la mayoría de los casos nos vamos a encontrar con hipervisores alojados que se ejecutan desde un sistema operativo.
Para apoyar la virtualización, casi todos los procesadores actuales y especialmente los de las líneas más populares basadas en la arquitectura x86 tienen una serie de instrucciones que permiten usarla de manera segura y eficiente. Esta arquitectura tiene dos ramas: la Intel y la AMD, cada uno de los cuales tiene un conjunto de instrucciones diferentes para llevarla a cabo. Aunque la mayoría de los procesadores lo incluyen, los portátiles de gama baja y algunos ordenadores de sobremesa antiguos no la incluyen, por lo que habrá que comprobar si nuestro procesador lo hace. Si no lo hiciera, se habla de paravirtualización en la que los hipervisores tienen que interpretar cada imagen del sistema operativo que alojan (llamado invitado) y convertirla en instrucciones del que aloja (llamado anfitrión o host). La mayor parte de los hipervisores, como Xen o KVM incluyen también la capacidad de paravirtualizar ciertos sistemas operativos en caso de que los anfitriones no tengan soporte; por ejemplo, KVM se ha asociado con QEMU que lo usa en caso de que el procesador tenga soporte.
A continuación veremos el uso básico de estos sistemas de virtualización basándonos, sobre todo, en uno de ellos KVM.
Crear una máquina virtual requiere seguir un proceso similar a la construcción e instalación del sistema operativo de un ordenador por primera vez: hay que montar los discos, conectar una unidad externa donde tengamos los discos de instalación, y a partir de ahí simplemente llevar a cabo la instalación a mano con la única diferencia que nuestro sistema invitado estará ejecutándose como un proceso (que crea una serie de procesos aislados) dentro de nuestro sistema anfitrión y que lo veremos en una ventana del mismo.
Vamos a usar en estos ejemplos KVM, por ser un sistema fácil de usar, pero el proceso en otros hipervisores, incluyendo los sistemas gráficos, será similar.
Instalar los paquetes necesarios para usar KVM. Se pueden seguir estas instrucciones. Ya lo hicimos en el primer tema, pero volver a comprobar si nuestro sistema está preparado para ejecutarlo o hay que conformarse con la paravirtualización.
A continuación hay que crear un disco duro virtual en formato QCOW2 como hemos visto anteriormente y descargar una distribución de algún sistema operativo, por ejemplo Debian.
Dado que KVM es un módulo del kernel, puede que no esté cargado por defecto. Dependiendo del procesador que usemos, lo cargamos con
sudo modprobe kvm-amd
o
sudo modprobe kvm-intel
Con los ficheros de almacenamiento virtual y una ISO para poder arrancar el sistema ya podemos arrancar KVM para instalarlo usando, por ejemplo
qemu-system-x86_64 -hda /media/Backup/Isos/discovirtual.img -cdrom ~/tmp/debian-7.3.0-i386-netinst.iso
La opción -hda
indica el fichero en el que se va a alojar el sistema
operativo instalado y -cdrom
recibe el camino a la ISO en la que
está el sistema que se va a instalar, en este caso la versión
netinst
que contiene un sistema operativo mínimo que se instala en su
mayor parte desde la red. El disco duro creado debe tener espacio
suficiente para alojar al sistema operativo, pero puede ser, como en
este caso, un fichero disperso que se irá llenando según se vaya
ocupando. Este almacenamiento virtual puede estar en cualquier lugar
del sistema operativo, incluyendo tarjetas o pendrives; la diferencia,
principalmente, será la velocidad paro para pruebas se puede usar
cualquier dispositivo.
Si se ha cortado la instalación o ha habido algún problema el comando anterior tratará de arrancar de todas formas del disco duro. Se puede cortar la máquina virtual simplemente cerrando la ventana y tratar de arrancar de nuevo empezando por el CD virtual usando
qemu-system-x86_64 -hda otro-disco.img -cdrom picaros-diego-b.iso
-boot once=d
con -boot
se le indica el orden de arranque; once
indica que solo
va a ser así esta vez y d
, como antiguamente, es el CD
Crear varias máquinas virtuales con algún sistema operativo libre tal como Linux o BSD. Si se quieren distribuciones que ocupen poco espacio con el objetivo principalmente de hacer pruebas se puede usar CoreOS (que sirve como soporte para Docker) GALPon Minino, hecha en Galicia para el mundo, Damn Small Linux, SliTaz (que cabe en 35 megas) y ttylinux (basado en línea de órdenes solo).
Hacer un ejercicio equivalente usando otro hipervisor como Xen, VirtualBox o Parallels.
En esta guía se explica cómo trabajar con KVM usando VMM, o virtual machine manager, una herramienta gráfica que trabaja sobre KVM
La máquina virtual, una vez instalada, se puede arrancar directamente desde el fichero en el que la hemos instalado, usando una orden tal como esta
qemu-system-x86_64 -boot order=c -drive file=/media/Backup/Isos/discovirtual.img,if=virtio
En este caso no necesitamos pegarle el CD, sino que le indicamos en
qué orden tienen que arrancar (usando el DD, en este caso) y mediante
-drive
le indicamos que use virtio
, una paravirtualización de la
entrada/salida que permite acceso mucho más rápido al disco; esto se
lo indicamos mediante la segunda opción if
al argumento.
Crear un benchmark de velocidad de entrada salida y comprobar la diferencia entre usar paravirtualización y arrancar la máquina virtual simplemente con
qemu-system-x86_64 -hda /media/Backup/Isos/discovirtual.img
Cuando se tienen varias máquinas funcionando no hace falta que se abran ventanas para cada una de ellas, pero el problema es interaccionar con las mismas. Lo podemos hacer de diferentes formas, pero una de ellas es arrancarlas dentro de un servidor VNC con una orden como esta
qemu-system-x86_64 -hda /media/Backup/Isos/discovirtual.img -vnc :1
Con esto podemos conectar a la máquina virtual usando algún
cliente de VNC tal como vinagre
. Hay
múltiples opciones más en
la línea de órdenes, que nos permiten establecer los tipos de CPU,
todo tipo de periféricos, tamaño de memoria (son 128 megas por
omisión) o nombre del invitado.
Crear una máquina virtual Linux con 512 megas de RAM y entorno gráfico
LXDE a la que se pueda acceder mediante VNC y ssh
.
Una máquina virtual es, desde el punto de vista del administrador, algo parecido a una máquina real: se arranca con el disco de instalación y a partir de ahí se instala manualmente. Sin embargo, se puede intentar también crear automáticamente un disco duro con al menos parte de las herramientas necesarias y arrancar a partir de ahí. A este tipo de actividad se le llama provisionar y hay muchas herramientas útiles para ello, pero esencialmente todas hacen lo mismo: crear un dispositivo virtual de almacenamiento e instalar paquetes en él sin necesidad de arrancar la máquina virtual. Este almacenamiento, posteriormente, se puede agregar luego a la máquina virtual que se desee o bien usarse para arrancar una máquina virtual desde él. La ventaja que tiene este tipo de programas es que permite automatizar la creación de máquinas virtuales y hacerlo masivamente. La desventaja es que, a priori, es específico del sistema operativo, aunque veremos más adelante formas de hacerlo independiente.
Hay diferentes herramientas que se pueden usar para este tipo de
provisionamiento; Cobbler es una de
ellas. Cobbler
permite trabajar no solo con almacenamiento virtual, sino también con
cualquier dispositivo conectado por red que se pueda acceder desde
fuera con diferentes protocolos. Sin embargo, esta herramienta es un
poco más avanzada y, para el propósito de este artículo, vamos a usar
ubuntu-vm-builder
(que se llamaba previamente python-vm-builder
), una herramienta
escrita en Python que permite, desde la línea de órdenes, crear una
imagen virtual con las características que le
demos. ubuntu-vm-builder
necesita tener un hipervisor funcionando;
puede trabajar con Xen, VMWare, kvm y vmserver. Solo trabaja con una
distribución: Ubuntu (jolines, que se llama ubuntu-vm-builder
, ¿qué
te esperabas?).
Por otro lado, también puede usar virt-manager
para gestionar las máquinas
virtuales creadas, así que habrá que instalar una serie de utilidades
para echarlo a andar:
sudo ubuntu-vm-builder kvm virt-manager
Con eso ya podemos crear una imagen para usar
sudo vmbuilder kvm ubuntu --suite precise --flavour server
-o --dest /un/directorio/vacío --hostname paraiv --domain paraiv
Esta orden crea, usando el hipervisor kvm, una instalación de Ubuntu
Precise Pangolin, o sea, 12.04. La versión más moderna que tienen es
la 12.04, así que no sé yo el futuro que tiene esta herramienta, que
en todo caso se puede usar para hacer una serie de pruebas. Por otro
lado, con flavour
se indica el sabor, que puede ser para distros
modernas (aunque no demasiado) o virtual
o la versión server que
es la que elegimos aquí. La siguiente opción -o
sobreescribe el
contenido de la imagen si existiera y el resto asigna tanto un nombre
externo que podamos usar nosotros desde virt-manager
(domain
)
aunque ahora mismo hay un bug que impide usarlo correctamente, como un
hombre interno para el propio ordenador.
Esta orden creará, tras una buena cantidad de minutos, un fichero de nombre ignoto (algo así como
tmpGAPl8O.qcow2
) en el que habrá una distribución Ubuntu instalada
con un solo usuario, ubuntu
con la misma clave. Como no se le ha
indicado ninguna personalización, tendrá el teclado en inglés y la
hora que le parezca bien. Una vez construido podemos arrancarlo con
sudo qemu-system-x86_64 -drive file=/directorio/donde/este/tmpGAPl8O.qcow2,if=none,id=drive-ide0-0-0,format=qcow2
y trabajar con ella, o directamente con
sudo qemu-system-x86_64 -hda /que/me/dir/tmpGAPl8O.qcow2
que carga el sistema del disco duro virtual creado.
Instalar una máquina virtual con Linux Mint para el hipervisor que tengas instalado.
Como la máquina creada anteriormente necesita más trabajo todavía que una máquina instalada desde una ISO (por aquello de que necesita instalar idioma, usuarios y demás), en realidad ubuntu-vm-builder permite configurar el tamaño del disco, la IP, qué mirror se va a usar para descargar los paquetes, usuarios, claves y también qué paquetes se van a instalar, al menos en el caso de los más comunes. En todo caso, este programa permite crear configuraciones de forma fácil y reproducible usando una sola orden.
Aparentemente, los errores señalados arriba están siendo solucionados pero no se encuentran en las últimas versiones disponibles en los repositorios.
En el siguiente tema pondremos en práctica todos los conceptos aprendidos en este tema y el tema relacionado con el almacenamiento para crear configuraciones que sean fácilmente gestionables y adaptables a un fin determinado. Antes, habrá que hacer y entregar el último hito.
Si lo que necesitas es un sistema ligero de virtualización, puedes mirar cómo virtualizar con contenedores.