La virtualización, es una herramienta indispensable hoy en día. Esta presente en la manera de concebir la arquitectura de un sistema moderno donde los diferentes servicios, están divididos dentro de diferentes máquinas virtuales en un servidor físico. Con esto ganamos la posibilidad de aislamiento entre diferentes servidores y el aprovechamiento total de recursos de un servidor.

Para mí, la opción de virtualización más apropiada es KVM, una herramienta de software libre disponible para sistemas linux x86 que realiza virtualización completa, siendo capaz de virtualizar cualquier componente hardware.

KVM, es un sistema de virtualización que normalmente va a acompañado de libvirt, esta, es una API de virtualización que uniforma cualquier sistema de virtualización y para KVM resulta casi esencial para aumentar la facilidad de su uso.

Instalación:

Vamos a instalar KVM y libvirt para posteriormente empezar a detallar comandos y definiciones de almacenamiento y red.

Mi instalación se hará en Ubuntu 18.04:

apt install qemu-kvm libvirt0 libvirt-clients libvirt-bin \ bridge-utils -y

Como parte de la instalación también se creará un bridge en nuestro sistema, esto se hará en /etc/network/interfaces:

nano /etc/network/interfaces

Aquí pondremos la siguiente configuración:

auto lo iface lo inet loopback auto br0 iface br0 inet dhcp bridge_ports enp3s0

Y reiniciamos el servicio de red:

systemctl restart networking

Almacenamiento:

Lo primero que nos permite es tener el disco duro de las máquinas virtuales en ficheros qcow2 o en volúmenes lógicos (lvm). Para esto debemos de crear un pool de volúmenes para que se puedan crear.

Los pool se crean mediante ficheros XML y debemos de indicarle el tipo, el dispositivo y el path del grupo de volúmenes previamente creado:

<pool type="logical"> <name>lvm</name> <source> <device path="/dev/sda1"/> </source> <target> <path>/dev/mapper/lvm</path> </target> </pool>

Lo definimos:

virsh pool-define lvm.xml

Marcamos que arranque automáticamente al iniciar el sistema:

virsh pool-autostart lvm

Y arrancamos el pool:

virsh pool-start lvm

Creamos un volumen:

virsh vol-create-as --pool lvm --format xfs --capacity 10G --name MV1

Esto nos habrá creado un volumen de 10G en el grupo de volúmenes lvm.

Otra opción que tenemos para crear un disco para nuestras máquinas virtuales sería la de un fichero qcow2:

qemu-img create -f qcow2 disco-deb.qcow2 10G

Redes:

Las redes también son definidas mediante fichero XML aquí voy a poner un ejemplo de una red nat y otra para utilizar nuestra interfaz br0:

<network> <name>red_nat</name> <forward mode="nat"/> <ip address="10.0.0.1" netmask="255.255.255.0"> <dhcp> <range start="10.0.0.1" end="10.0.0.50"/> </dhcp> </ip> </network>

Una red nat que tendrá un servidor dhcp que asignará ip desde la 1 hasta la 50.

<network> <name>bridge</name> <forward mode="bridge"/> <bridge name="br0"/> </network>

Y aquí la red bridge que será nuestra interfaz br0.

Las definimos:

virsh net-define red_nat.xml virsh net-autostart red_nat virsh net-start red_nat

Listamos las redes que tenemos:

virsh net-list

Máquinas virtuales:

Una vez tengamos las redes definidas y los dispositivos de almacenamiento creados, vamos a crear máquinas virtuales, para esto necesitaremos el siguiente comando:

virt-install --connect qemu:///system --name debian1 \ --memory 1024 --disk path=/dev/lvm/MV1 \ --vcpus=1 -c /home/manu/Descargas/debian-9.1.0-amd64-netinst.iso \ --vnc --os-type linux --os-variant=debian9 --network network=bridge \ --noautoconsole --hvm --keymap es

Con esto tendremos una máquina virtual con el disco en un volumen lógico y nuestro bridge.

Si queremos utilizar nuestro disco qcow2 y nuestra red_nat:

virt-install --connect qemu:///system --name debian1 \ --memory 1024 --disk path=/home/manu/qcow2/disco-deb.qcow2 \ --vcpus=1 -c /home/manu/Descargas/debian-9.1.0-amd64-netinst.iso \ --vnc --os-type linux --os-variant=debian9 --network network=red_nat \ --noautoconsole --hvm --keymap es

Bien, ahora, necesitamos instalar el sistema en el disco, ya sea el lvm o qcow2, debemos de tener una consola donde vayamos guiando la instalación, para ello tenemos virt-manager que es un gestor gráfico de máquinas virtuales:

apt install virt-manager

Si os aparece el siguiente fallo:

Unable to connect to libvirt qemu:///system

Ábrelo desde una terminal como usuario root.

# virt-manager

Una vez que tengamos en un fichero qcow2 un sistema operativo instalado, podemos reutilizar ese disco para otras VM. Normalmente, se suele crear un qcow2 como base y de ahí se van creando copias de este:

Lo primero que vamos a hacer es redimensionar el disco después de la instalación:

qemu-img convert -O qcow2 -c disco-deb.qcow2 min-deb.qcow2

Y ahora hace un aprovisionamiento del disco comprimido:

qemu-img create -b min-deb.qcow2 -f qcow2 debian1.qcow2

Y creamos una máquina con este disco:

virt-install --connect qemu:///system --name debian2 \ --memory 1024 --disk path=/home/manu/qcow2/debian1.qcow2 \ --vcpus=1 --boot hd --vnc --os-type linux --os-variant=debian9 \ --network network=bride --noautoconsole --hvm --keymap es

Una vez esté la máquina creada debemos de conectarnos mediante ssh, para ello debemos de saber la ip de nuestra máquina, para ello vamos usar:

virsh net-dhcp-leases [network]

Comandos:

Vamos a ver otros comandos que nos pueden venir bien en la operativa diaria de nuestra máquinas virtuales:

Redimensión de volumen:

virsh vol-resize --pool lvm --capacity 20G --vol MV1

Asociar volumen:

virsh attach-disk [VM] [disk path] [virtual_name fe: "vda"]

Desasociar volumen:

virsh detach-disk [VM] [disk path]

Iniciar máquina:

virsh start [VM]

Parar una máquina:

virsh shutdown [VM]

Eliminar una máquina:

virsh destroy [VM]

Listar máquinas:

virsh list

Editar una máquina virtual:

virsh edit [VM]

Aumentar memoria RAM:

Para incrementar la memoria RAM en caliente, debemos de tener menos cantidad del máximo permitido. Para aumentar ese máximo tenemos que parar la máquina virtual, editarla y aumentar el siguiente límite:

<memory unit='KiB'>2097152</memory>

Y una vez arranquemos de nuevo ejecutar el siguiente comando:

virsh setmem [VM] --size [number]G --live

Creo que dejo por aquí una guía bastante decente de como empezar en la virtualización con KVM, también unos cuantos de comandos útiles para el manejo de las máquinas virtuales.

Hay bastantes comandos que no aparecen aquí, yo he reflejado los que suelo utilizar más en mi operativa diaria, cualquier aporte o sugerencia será bien recibido.