Ir al contenido principal

Virtualización con KVM



Introducción
NOTA: este artículo fue publicado inicialmente el 17/06/2013. Posteriormente se añadieron apuntes correctivos con respecto a la distribución Ubuntu 20.04.

Desde hace unos años se viene hablando en informática del concepto de Virtualización como forma de ahorrar costes en las empresas aprovechando al máximo los recursos hardware de que dispone. 

La virtualización consiste en una abstracción de los recursos de una computadora, creando una capa intermedia entre el hardware de la máquina física y el sistema operativo de la máquina virtual, dividiendo los recursos entre varios entornos de ejecución.

Entre los distintos distribuidores de software para la virtualización, el líder indiscutible a día de hoy es VMware, qué distribuye una solución propietaria, y muy completa.

Sin embargo, en el mundo del software libre, existe una alternativa muy buena al software de virtualización de VMware. Esta alternativa es KVM.


KVM, siglas de Kernel-based Virtual Machine, es una solución completa de virtualización para GNU/Linux sobre una arquitectura x86. Consiste en un módulo del kernel, kvm.ko, que provee la infraestructura del núcleo de virtualización y de un módulo específico para el procesador, kvm-intel.ko, para procesadores de la familia Intel, y, kvm-amd.ko, para procesadores de la familia AMD.

Usando KVM, se pueden ejecutar múltiples máquinas virtuales que se ejecutan sin modificar las imágenes de GNU/Linux o Windows. Cada máquina virtual tiene su propio hardware virtualizado: una tarjeta de red, disco duro, tarjeta gráfica, etc.

El componente del kernel de KVM está incluído en la línea principal del kernel de Linux desde la versión 2.6.20.

Prerrequisitos
Antes de instalar KVM hay que revisar algunas características de la máquina en la que se va a instalar para comprobar que es posible ejecutarlo en ella.

Revisar que la CPU soporta la virtualización del hardware
Para ejecutar KVM se necesita un procesador que soporte la virtualización del hardware. Intel y AMD han desarrollado extensiones para sus procesadores, llamadas respectivamente Intel-VT-x (nombre en código Vanderpool) y AMD-V (nombre en código Pacífica). 

Para comprobar si tu procesador soporta alguno de ellos, debes revisar la salida de este comando:
egrep -c '(vmx|svm)' /proc/cpuinfo
Si la salida es 0 significa que tu CPU no soporta la virtualización de hardware.

Si la salida es 1 o más significa que si la soporta. Pero aún debes asegurarte que el soporte para la virtualización está habilitado en la BIOS de tu ordenador.

Por defecto, si has arrancado dentro con un kernel XEN no se mostrará la salida con el comando egrep. Para ver si está habilitado o no desde XEN hay que usar este otro comando:
cat /sys/hypervisor/properties/capabilities
Debes buscar hvm en la salida.

Alternativamente, se puede usar este otro comando ejecutado con privilegios de superusuario.
kvm-ok
Que mostrará por la pantalla una salida como esta:
INFO: /dev/kvm exists
KVM acceleration can be used
Si en vez de eso, se muestra:
INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used
Aún puedes ejecutar máquinas virtuales, pero con mucho menor rendimiento que usando las extensiones KVM.

NOTA: El mensaje KVM acceleration can/can NOT be used es engañoso y sólo significa que KVM está disponible, no que está soportado.

Usar un kernel de 64-bit (si es posible)

Ejecutar KVM en un sistema operativo con un kernel de 64-bit en el ordenador anfitrión es recomendable, aunque no imprescindible
  1. Para proveer más de 2GB de memoria RAM para las máquinas virtuales se debe usar un kernel de 64-bit. Con un kernel de 32-bit ese es el límite máximo.
  2. En un sistema operativo anfitrión de 64-bit se pueden alojar máquinas virtuales de 64 o 32-bit. Si el anfitrión es de 32-bit sólo se pueden alojar máquinas virtuales de 32-bit.
Para comprobar si el procesador es de 64-bit hay que revisar la salida de este comando:
egrep -c ' lm ' /proc/cpuinfo
Si la salida es 0 significa que el procesador es de 32-bit.

Si es 1 o mayor, es de 64-bit.

Por último, comprobaremos si el kernel que está corriendo es de 64-bit. Teclearemos este comando:
uname -r
x86_64 indica que se está ejecutando un kernel de 64-bit. Si ve i386, i486, i586 o i686 es que se está ejecutando un kernel de 32-bit.

Instalación
En Ubuntu 12.04
Para realizar la instalación de KVM en Ubuntu se puede optar por elegir durante el proceso de instalación la opción de instalar el Servidor de virtualización (Virt Host) o, si se va a realizar la instalación en un ordenador con el sistema instalado, instalar el meta-paquete ubuntu-virt-server:
$sudo apt-get install ubuntu-virt-server
La instalación de este meta-paquete instala en el sistema, entre otros, los siguientes paquetes:
  • kvm: es la solución de virtualización que se compone de una serie de módulos para el núcleo de Linux. Usa QEMU.
  • libvirt-bin: son unas herramientas para administrar kvm y libvirt.
  • bridge-utils: sirve para poder utilizar la red local como una red virtual.
Una vez terminada la instalación del meta-paquete, se puede comprobar que todo ha salido correctamente utilizando el siguiente comando en la consola:
virsh -c qemu:///system list
Lo que proporcionaría una salida en la terminal como esta:
 Id Nombre               Estado
---------------------------------------
Por último, hay que asegurarse de que el usuario que va a crear y gestionar las máquinas virtuales sea incluido en el grupo libvirtd.
$sudo adduser $USER libvirtd

En Ubuntu 20.04

El paquete  ubuntu-virt-server ya no se encuentra en los repositorios de Ubuntu a partir de la 18.10. Sin embargo, aún podemos instalar el KVM en nuestro sistema. 

Ejecutamos desde una terminal:

$sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils

Administración desde la consola

Para administrar las máquinas virtuales desde la consola se dispone de unas utilidades que se instalan automáticamente junto a los paquetes libvirt-bin y virtinst. Estos paquetes se han instalado si se han seguido los pasos de este artículo, aún así es conveniente instalar un paquete adicional, el virt-viewer:
$sudo apt-get install virt-viewer
NOTA: esto es válido tanto para la 12.04 como para la 20.04

Crear una máquina virtual: para crear una nueva máquina virtual utilizaremos el comando siguiente (por claridad se pone en distintas líneas, pero el comando ha de escribirse en una sóla línea):
$sudo virt-install
--connect qemu:///system
--name=ldap-server
--hvm
--ram 1024
--disk /var/lib/libvirt/images/ldap-server_disk.img,size=40
--network bridge=virbr0
--cdrom=/var/downloads/isos/ubuntu-12.04.1-server-amd64.iso
--vnc
--os-type=linux
--os-variant=ubuntuprecise

En este comando los párametros más relevantes son:
  • connect: conexión a un hipervisor, para KVM se suele poner qemu:///system si se está ejecutando como módulo del kernel.
  • name: nombre para la máquina virtual.
  • hvm: para indicar que utilice toda las características de virtualización. Si quisiéramos utilizar paravirtualización se usaría el parámetro --paravirt.
  • ram: cantidad de memoria RAM asignada a la máquina virtual en MB.
  • disk: ruta donde se almacenará el disco de la máquina virtual y su tamaño en GB:
  • network: conexión de red que utilizará. Si no se especifica utiliza la conexión por defecto y hace NAT. La opción de bridge es sólo para máquinas anfitriones que tienen definida una IP estática.
  • cdrom: imagen ISO que arrancará como si estuviera insertada en un lector de CD-ROM.
  • os-type: tipo de sistema operativo que se va a instalar.
  • os-variant: versión del sistema operativo.

Por supuesto, para una completa descripción de este comando no estaría de más consultar el manual (man virt-install).

Gestión de una máquina virtual: para gestionar máquinas virtuales desde la línea de comandos utilizaremos el comando virsh. Las opciones que se pueden usar con este comando son muchas, aquí sólo mostraré las más básicas, para consultar todas las opciones, como siempre, recomiendo mirar el manual (man virsh) o usar la propia ayuda del comando.
  • Arrancar una máquina virtual: suponiendo que ldap-server es el nombre de la máquina (o dominio como lo llama virsh).
    virsh start ldap-server
  • Marcar el huesped para que se inicie automáticamente: si queremos que el huesped se inicie automáticamente cuando se arranque el anfitrión, debemos especificarlo usando:
    virsh autostart ldap-server
  • Apagar una máquina virtual: para apagar el huésped amablemente.
    virsh shutdown ldap-server
  • Forzar apagado una máquina virtual: hay situaciones en las que el comando anterior no apaga la máquina virtual, entonces sólo nos queda la opción de apagarlo a la fuerza. O sea, el equivalente a quitarle el cable de alimentación.
    virsh destroy ldap-server
  • Ver los dominios registrados en el servidor: podemos listar los dominios (máquinas virtuales) registrados en el servidor.
    virsh list
Con esto terminamos la sección de administración de máquinas virtuales usando la línea de comandos. No está todo de lo que se dispone, pero como ya dije para saber más se debe consultar el manual y/o la ayuda de cada comando.

Administración desde entorno gráfico
Si se dispone de entorno gráfico, la administración de las máquinas virtuales se hace más cómoda e intuitiva que usando los comandos de la consola. Existe una gran variedad de interfaces gráficas o no que nos permiten la administración de nuestras máquinas virtuales, para ver una lista de ellas se puede consultar en la página oficial de KVM.

Por su sencillez y facilidad de uso he optado por usar el Virtual Machine Manager, además de ser desarrollado por el mismo equipo de libvirt y patrocinado por Red Hat. Para instalarlo podemos buscar Gestor de máquinas virtuales en el Centro de Software de Ubuntu, o bien, ejecutar el comando:
$sudo apt-get install virt-manager
Nos instalará el gestor de máquinas virtuales en la sección de herramientas del sistema. Para arrancar el programa picamos sobre el icono:
Al abrir el Gestor de máquinas virtuales se nos muestra una pantalla con la lista de máquinas virtuales que hay creadas en el sistema y el estado en que se encuentra. Tal y como se muestra en la siguiente imagen.


Se pueden realizar las siguientes acciones picando sobre los iconos de la barra de herramientas (o usando la opción del menú correspondiente):
  • Añadir una nueva máquina virtual: en el programa lo llama añadir una nueva conexión, pero viene a ser lo mismo. Para ellos picamos sobre el botón de la barra de herramientas . Esta acción nos abrirá un asistente con el que podemos crear una nueva máquina virtual
  • Abrir una máquina existente: con una de las máquinas ya creadas seleccionadas, si picamos sobre el botón nos abre un cuadro de diálogo en el que se puede acceder a las características de la máquina virtual. Por defecto abre el cuadro de diálogo con la consola de acceso a la máquina virtual, tal como se muestra en esta imagen para una máquina virtual con el CentOS 6.2 instalado.

    Las funcionalidades a las que se puede acceder desde este cuadro de diálogo las explicaré un poco más abajo.
  • Arrancar una máquina virtual: si la máquina virtual que se tiene seleccionada en la lista de máquinas esta apagada (no iniciada), podemos arrancarla picando sobre el icono: .
  • Pausar la máquina virtua: si se desea pausar la ejecución de la máquina virtual, es decir, la máquina sigue en funcinamiento pero se para la ejecución de la misma, debemos dar con el ratón sobre el botón:
  • Parar una máquina virtual: en el caso de que la máquina virtual que hay seleccionada en la lista esté iniciada, podemos pararla picando sobre el botón: . A la derecha del icono podemos desplegar una lista de acciones referentes al modo de apagado de la máquina: reiniciar, apagado, forzar apagado. Elegiremos el que más nos conviene. Sin embargo, en caso de tener que apagar una máquina virtual, en mi opinión, se debe apagar desde la propia máquina para que el apagado sea correcto. Sólo utilizar esta posibilidad de apagado cuando desde la propia máquina virtual no sea posible.
Todas las acciones descritas en el párrafo anterior se pueden realizar desde la pantalla principal del Gestor de máquinas virtuales. Sin embargo, en el cuadro de diálogo de una máquina abierta podemos, además de interactuar con la máquina a través de la consola, acceder a estas otras opciones:
  • Mostrar detalles del hardware: aunque sea virtualizado, cada máquina virtual dispone de su propio hardware: procesadores, memoria, tarjeta de vídeo... Si deseamos ver esos detalles de la máquina, en el cuadro de diálogo de la propia máquina se puede picar sobre el botón , con lo que podremos ver y cambiar el hardware. La imagen de la pantalla de los detalles es como esta:
  • Mostrar la consola: si estamos en la vista de detalles y queremos volver a la vista de la consola picamos sobre el icono:
  • Modo de pantalla completa: para mostrar la máquina ocupando toda la pantalla, en la vista de la consola, picamos sobre el icono . Si estamos en modo de pantalla completa y queremos volver al modo normal, debemos desplazar el ratón hasta la parte superior, lo que hará que nos aparezca un icono sobre el que picaremos para volver al modo normal.
Con estas explicaciones termino el artículo. No están, ni con mucho, explicadas todas las acciones que podemos realizar sobre las máquinas virtuales. Les convido a probar e investigar todo lo que puedan y no se olviden de consultar la documentación cada vez que tengan dudas.

Comentarios

  1. Hola Fernando, estoy empezando a incursionar con virtualización y me decidí por KVM, y este artículo es lo que estaba buscando para comenzar, muchas gracias por compartir tus conocimientos y además tan bien expresado. Un abrazo. Marco.

    ResponderEliminar
  2. Gracias por tu comentario. Como puedes ver este blog era un proyecto que empecé con ilusión y que luego tuve que dejar parado por mis circunstancias personales. Me gusta compartir mis conocimientos sobre Linux, pero me da pena no tener tiempo para hacerlo. Espero que algún día no muy lejano pueda seguir publicando artículos con la regularidad que quería cuando creé el blog.
    De nuevo, muchas gracias por tu comentario.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Gestión de la red usando la línea de comandos (II): rutas persistentes

  Introducción Esta será la segunda entrada de la serie de artículos referentes a la gestión de la red en la línea de comandos de Linux. Concretamente, en esta entrada voy a explicar tres métodos para dejar configuradas rutas persistentes en nuestro Ubuntu. Las pruebas de campo las he hecho en una máquina virtual con Ubuntu Desktop 22.04 instalado. Pero lo explicado es válido para cualquier sabor de Ubuntu, incluido el Ubuntu Server. Ejecutar una tarea programada En Linux en general y, por tanto, también en Ubuntu, existe la posibilidad de programar tareas. Las tareas son ejecutadas por el demonio cron  y tienen que ser definidas usando el comando crontab . Para conocer más sobre el sistema de programación de tareas programadas les recomiendo mirar las páginas del manual: man cron , man crontab , man 5 crontab ... En este último se explica la estructura de un fichero crontab . Lo primero que tenemos que hacer es crear nuestro script que luego se ejecutará en la programación de la tarea

Atom ha muerto, viva Zed

El día 8 de junio de 2022, Microsoft anunció que a partir del día 31 de diciembre de este mismo año dejaría de dar soporte para el editor de código Atom .  ¿En qué nos afecta esto a nosotros? Bueno, pues si me han seguido en artículos anteriores saben que tras una comparativa de varios IDEs había decidido utilizar Atom para los ejemplos que tuviera que hacer en este blog. Sobre todo los artículos que prepararé para ilustrar el uso de Laravel . Amén de los miles de programadores que actualmente usan Atom  en sus proyectos, claro. Pero, ¿qué editor de código abierto podremos utilizar para sustituir a Atom ? En el mismo comunicado, Microsoft explicaba que el abandono del proyecto Atom  se debía a que querían volcar todos sus esfuerzos en el Visual Studio Code y, por supuesto, recomendó a los usuarios de Atom la utilización del mismo como alternativa natural. No quiero entrar en las bondades o defectos del Visual Studio Code  si quieres elegirlo como tu IDE para desarrollo predeterm

Firma digital de documentos usando LibreOffice

  Introducción Una firma digital es un proceso mediante el cual se puede consignar a un documento digital la identidad de una persona. Permitiendo, mediante el uso de certificados avalados por autoridades certificadoras, a cualquier persona verificar que el documento digital verdaderamente pertenece a la persona firmante. Además, también previene que, una vez firmado un documento, éste pueda ser modificado. El proceso de firmado se puede realizar utilizando distinto software, como por ejemplo el Autofirma o desde páginas específicas de Internet, casi siempre implicando el uso de applets de Java . En el presente artículo nos vamos a centrar en explicar como realizar dicho proceso de firma y su verificación utilizando la suite ofimática LibreOffice corriendo sobre Ubuntu . Para las pruebas y el desarrollo de este artículo voy a utilizar el  Ubuntu 20.04.3 LTS y el LibreOffice  6.4.7. Verificación del entorno A diferencia de Windows u OSX , en Linux no existe un almacén de certificad