Introducción
Virsh es una potente interfaz de línea de comandos usada para gestionar la API libvirt; esta API gestiona un módulo del kernel de Linux llamado KVM (Kernel-based Virtual Machine), que es un hipervisor open source de tipo 1 encargado de gestionar máquinas virtuales, y a su lado trabaja el emulador y virtualizador QEMU (Quick Emulator), encargado de ejecutar máquinas virtuales y emular diferentes arquitecturas de hardware.
Instalación
A continuación, vamos a instalar los componentes necesarios para poder comenzar a virtualizar.
Los componentes son:
- KVM: Hypervisor
- QEMU: Emulación y virtualización
- Libvirt: API para KVM
- Virsh: Interfaz de línea de comandos para gestionar libvirt
Para instalarlo, ejecutaremos la siguiente instrucción:
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients
Otra opción es instalar Virt-Manager, que es un programa de interfaz gráfica usado para gestionar la API libvirt, y al instalarlo, instala automáticamente todos los componentes que hemos mencionado anteriormente.
Para instalarlo, ejecutaremos la siguiente instrucción:
sudo apt update
sudo apt install virt-manager
Primeros pasos
Ya tenemos todo lo que necesitamos para comenzar a crear nuestros escenarios virtualizados, ahora vamos a ver como comenzar a usar estas herramientas.
Tipos de conexiones a libvirt
Para gestionar las maquinas virtuales, libvirt ofrece tres tipos de coneciones a QEMU/KVM.
-
Conexión local sin privilegios: Mediante esta conexión, los usarios no privilegiados pueden crear y gestionar sus proias maquinas virtuales, pero no tienen acceso a funciones de administrador como crear redes, pools...
- La URL para esta conexión es
qemu:///session
- La URL para esta conexión es
-
Conexión local privilegiada: Esta conexión es usada por los administradores para gestionar todas mas maquinas y caracteristicas de QEMU/KVM. Es la conexión mas usada en entornos de producción.
- La URL para esta conexión es
qemu:///system
- La URL para esta conexión es
-
Conexión remota: A traves de este metodo podemos conectarnos de manera remota a QEMU/KVM en equipos remotos. Esto es util para entornos donde el servidor de virtualización esta centralizado. El protocolo mas usado para esta conexión es mediante SSH pero se pueden usar otros.
- La URL para esta conexión es
qemu+ssh://<usuario>@<maquina_remota>/system
- La URL para esta conexión es
Para usar estas conexiones hay que especificarla en cada instrucción con virsh.
Por ejemplo, vamos a listar las maqinas virtuales activas en nuestro usuario sin privilegios:
virsh -c qemu:///session list
Si no indicamos la conexión, virsh usara qemu:///session por defecto, a menos que ejecutemos virsh con sudo, en ese caso usara qemu:///system
Gestion de pools de almacenamiento
Para gestionar el almacenamiento, virsh trabaja con pools, que son directorios que virsh interpreta como contenedores lógicos en los que guarda los discos de las máquinas (.qcow2), las ISOs... En definitiva, todos los archivos de las máquinas virtuales.
Por lo tanto, antes de comenzar a crear maquinas virtuales, podemos elejir donde queremos que se alamacenen estos archivos, aunque si no lo hacemos, virsh creara un pool por defecto llamado default en el directorio /var/lib/libvirt/images
Para crear un pool ejecutaremos:
virsh pool-define-as <nombre_pool> dir --target <directorio_pool>
Si el directorio indicado no esta creado, ejecutaremos lo sguiente:
virsh pool-build <nombre_pool>
Esta instrucción creara el directorio del pool.
Ya hemos creado el pool, ahora tenemos que iniciarlo:
virsh pool-start <nombre_pool>
Con este comando inicamos el pool hasta el proximo reinico, si queremos que cuando la maquina se reinicie, se inicie el pool automaticamente, ejecutaremos la siguiente instrucción:
virsh pool-autostart <nombre_pool>
Hecho esto, ahora podemos listar los pools y ver información sobre ellos:
virsh pool-list
virsh pool-info <nombre_pool>
Si queremos eliminarlo, en primer lugar lo pararemos:
virsh pool-destroy <nombre_pool>
Luego, si queremos, podemos eliminar su directorio:
virsh pool-delete <nombre_pool>
Y por ultimo lo eliminaremos:
virsh pool-undefine <nombre_pool>
Gestion de redes de QEMU/KVM
Las redes en en libvirt, son el metodo por el cual las maquinas virtuales se conectan entre si y con internet. Libvirt interpreta las redes como switches virtuales a los que se conectan las maquinas, esto lo hace mediante Linux Bridge.
Podemos diferenciar 4 tipos de redes:
- NAT: Es una red a la que se conecta el host, y este proporciona servicio de DHCP, DNS y nating, por lo que las maquinas conectadas a esta red, podran obtener IP de forma dinamica y acceder a internet.
- Asilada (Isolated): A esta red tamtien se conecta el host, pero en este caso no actua como servidor NAT, da servicio de DNS y DHCP pero las maquinas no pueden acceder a internet a traves del host.
- Muy asilada (Very Isolated): Esta red es solo para las maquinas virtuales que se conecten a ella, el host no tiene acceso.
- Puente (Bridge): La red bridge es una nueva interfaz de red que se crea en el host, esta se asocia a una interfaz existente, que permite que las maquinas que se conecten a ella tomen la configuración de la red del host. La red puente es la unica que no gestiona libvirt.
Para crear estas redes, excepto la red puente que veremos mas adelante, tenemos que definir su configuración en un fichero XML en el directorio /usr/share/libvirt/networks/