«`html

¿Cómo usar la virtualización KVM? Guía completa

La virtualización KVM (Kernel-based Virtual Machine) es una potente tecnología de virtualización integrada directamente en el kernel de Linux. Permite crear y ejecutar múltiples máquinas virtuales (VM) en un solo servidor físico, lo que aumenta significativamente la eficiencia del uso de recursos y reduce los costos. Esta guía, escrita por un administrador de sistemas experimentado, lo guiará a través de todos los pasos de configuración y uso de KVM, desde la instalación hasta la optimización del rendimiento. Revisaremos en detalle la instalación de los paquetes necesarios, la creación y configuración de máquinas virtuales, su gestión, así como la resolución de problemas comunes. Ya sea que sea nuevo en la virtualización o un usuario experimentado, esta guía le proporcionará todos los conocimientos y habilidades prácticas necesarios para usar KVM con éxito.

Contenido

Instalamos KVM y los paquetes necesarios

¿Cómo usar la virtualización KVM? - Instalando paquetes de KVM en Ubuntu/Debian/CentOS/RHEL. Muestra comandos del administrador de paquetes para cada sistema operativo.
El primer paso es instalar los paquetes necesarios de KVM. El proceso de instalación difiere ligeramente según la distribución de Linux que se utilice. Veamos ejemplos para Ubuntu/Debian y CentOS/RHEL.

Instalación en Ubuntu/Debian Para instalar KVM y las herramientas relacionadas en Ubuntu o Debian, ejecute los siguientes comandos en la terminal:

sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst
* qemu-kvm: El paquete principal para la emulación de KVM. * libvirt-daemon-system: El demonio libvirtd, que gestiona las máquinas virtuales. * libvirt-clients: Herramientas de cliente para gestionar libvirtd. * bridge-utils: Utilidades para crear puentes de red. * virtinst: Herramientas para crear máquinas virtuales desde la línea de comandos.
VPS хостинг

Виртуальные серверы с гарантированными ресурсами

Выбрать VPS

Después de la instalación, es necesario comprobar si la virtualización es compatible con su procesador. Ejecute el siguiente comando:

egrep -c '(vmx|svm)' /proc/cpuinfo
Si la salida del comando es mayor que 0, significa que la virtualización es compatible.

A continuación, agregue su usuario al grupo libvirt para obtener acceso a la gestión de máquinas virtuales sin usar sudo:

sudo usermod -a -G libvirt $USER
newgrp libvirt
Ahora compruebe el estado del servicio libvirtd:

systemctl status libvirtd
Debería ver que el servicio está en ejecución y activo. Si no, inícielo:

sudo systemctl start libvirtd
sudo systemctl enable libvirtd
Instalación en CentOS/RHEL Para instalar KVM en CentOS o RHEL, ejecute los siguientes comandos:

sudo yum install -y qemu-kvm libvirt virt-install bridge-utils
* qemu-kvm: El paquete principal para la emulación de KVM. * libvirt: El paquete que contiene el demonio libvirtd y las herramientas de cliente. * virt-install: Herramientas para crear máquinas virtuales desde la línea de comandos. * bridge-utils: Utilidades para crear puentes de red.

La comprobación de la compatibilidad de la virtualización en el procesador es similar a Ubuntu/Debian:

egrep -c '(vmx|svm)' /proc/cpuinfo
Agregue su usuario al grupo libvirt:

sudo usermod -a -G libvirt $USER
newgrp libvirt
Compruebe el estado del servicio libvirtd:

sudo systemctl status libvirtd
Si el servicio no está en ejecución, inícielo y actívelo:

sudo systemctl start libvirtd
sudo systemctl enable libvirtd
**Consejo:** Asegúrese de que la virtualización esté habilitada en la BIOS de su servidor (Intel VT-x o AMD-V). Sin esto, KVM no podrá funcionar.

**Advertencia:** Una configuración incorrecta de los puentes de red puede provocar la pérdida de la conexión de red en el sistema host. ¡Tenga cuidado al configurar la red!

La virtualización permite utilizar eficientemente los recursos informáticos, reduciendo la necesidad de servidores físicos y simplificando la gestión de la infraestructura.

Dmitri Ivanov, arquitecto de sistemas
Ahora que KVM está instalado y configurado, pasemos a crear la primera máquina virtual.

Creamos la primera máquina virtual

¿Cómo usar la virtualización KVM? - Captura de pantalla de la GUI de virt-manager o la creación de una VM en la línea de comandos.
Hay varias formas de crear una máquina virtual KVM: mediante una interfaz gráfica (virt-manager) o desde la línea de comandos (virt-install). Consideremos ambas opciones.

Creación de VM con virt-manager Virt-manager es una herramienta gráfica para gestionar máquinas virtuales. Si aún no está instalado, instálelo:

sudo apt install -y virt-manager   # Ubuntu/Debian
sudo yum install -y virt-manager   # CentOS/RHEL
Ejecute virt-manager:

virt-manager
En la ventana principal, haga clic en el botón «Crear nueva máquina virtual». Siga las instrucciones del asistente. Tendrá que especificar:

  • El nombre de la máquina virtual.
  • El método de instalación del sistema operativo (imagen ISO, instalación de red, etc.).
  • La cantidad de memoria RAM asignada y el número de procesadores virtuales.
  • El tamaño del disco de la máquina virtual.
  • La configuración de red.
**Ejemplo:** Creación de una máquina virtual Ubuntu 20.04 a partir de una imagen ISO.

Creación de VM con virt-install Virt-install es una utilidad de línea de comandos para crear máquinas virtuales. Proporciona más flexibilidad y posibilidades de automatización.

**Ejemplo:** Creación de una máquina virtual CentOS 7 a partir de una imagen ISO:

virt-install \
--name=centos7-vm \
--ram=2048 \
--vcpus=2 \
--os-variant=centos7.0 \
--cdrom=/path/to/CentOS-7-x86_64-DVD-2009.iso \
--disk path=/var/lib/libvirt/images/centos7-vm.img,size=20 \
--network bridge=virbr0,model=virtio \
--graphics vnc,listen=0.0.0.0 --noautoconsole
Analicemos los parámetros del comando:

  • --name: El nombre de la máquina virtual (centos7-vm).
  • --ram: La cantidad de memoria RAM asignada en MB (2048).
  • --vcpus: El número de procesadores virtuales (2).
  • --os-variant: La variante del sistema operativo (centos7.0). Especifique la variante más adecuada para su sistema operativo. La lista de variantes disponibles se puede obtener con el comando osinfo-query os.
  • --cdrom: La ruta a la imagen ISO del disco de instalación (/path/to/CentOS-7-x86_64-DVD-2009.iso). Reemplácelo con su ruta.
  • --disk: Los parámetros del disco de la máquina virtual. path es la ruta al archivo de imagen del disco (/var/lib/libvirt/images/centos7-vm.img), size es el tamaño del disco en GB (20).
  • --network: La configuración de red. bridge=virbr0 es la conexión al puente de red virbr0 (predeterminado), model=virtio es el uso del controlador virtio para la tarjeta de red (proporciona un mejor rendimiento).
  • --graphics: La configuración de la interfaz gráfica. vnc,listen=0.0.0.0 es el uso de VNC para conectarse a la máquina virtual. listen=0.0.0.0 significa que el servidor VNC escuchará en todas las direcciones IP. --noautoconsole desactiva la conexión automática a la consola.
Después de ejecutar el comando, comenzará el proceso de instalación del sistema operativo. Puede conectarse a la máquina virtual a través de un cliente VNC, especificando la dirección IP del sistema host y el puerto VNC (el puerto predeterminado es 5900). Si utiliza un firewall, asegúrese de que el puerto VNC esté abierto.

sudo firewall-cmd --permanent --add-port=5900/tcp
sudo firewall-cmd --reload
**Consejo:** Utilice controladores virtio para discos y tarjetas de red en máquinas virtuales. Proporcionan un rendimiento significativamente mejor en comparación con los controladores emulados.

**Advertencia:** Asignar demasiados recursos a una máquina virtual puede provocar una disminución del rendimiento del sistema host.

La planificación adecuada de los recursos es la clave para una virtualización exitosa. Tenga en cuenta las necesidades tanto del sistema host como de las máquinas virtuales.

Elena Smirnova, ingeniera de DevOps
Ahora que ha creado una máquina virtual, pasemos a gestionarla.

Gestión de máquinas virtuales

La gestión de máquinas virtuales KVM se realiza con la utilidad virsh (command-line interface for libvirt). Proporciona una amplia gama de comandos para realizar diversas operaciones.

Comandos básicos de virsh * **Lista de máquinas virtuales:**

virsh list --all
Este comando muestra una lista de todas las máquinas virtuales, incluidas las que están en ejecución y las que están apagadas.

* **Inicio de una máquina virtual:**

virsh start centos7-vm
Reemplace centos7-vm con el nombre de su máquina virtual.

* **Apagado de una máquina virtual:**

virsh shutdown centos7-vm
Este comando envía una señal de apagado ACPI a la máquina virtual, lo que le permite finalizar correctamente el trabajo.

* **Apagado forzado de una máquina virtual:**

virsh destroy centos7-vm
Este comando finaliza inmediatamente el trabajo de la máquina virtual, lo que puede provocar la pérdida de datos. Úselo solo en casos extremos.

* **Reinicio de una máquina virtual:**

virsh reboot centos7-vm
* **Conexión a la consola de una máquina virtual:**

virsh console centos7-vm
Este comando le permite conectarse a la consola de texto de la máquina virtual. Para salir de la consola, presione Ctrl+].

* **Obtención de información sobre una máquina virtual:**

virsh dominfo centos7-vm
Este comando muestra información detallada sobre la máquina virtual, incluido el nombre, la ID, el estado, el uso de CPU y memoria.

* **Edición de la configuración de una máquina virtual:**

virsh edit centos7-vm
Este comando abre el archivo de configuración de la máquina virtual en un editor de texto. Cambiar la configuración puede afectar el funcionamiento de la máquina virtual, así que tenga cuidado.

**Ejemplo de un archivo de configuración de una máquina virtual (centos7-vm.xml):**

<domain type='kvm' id='1'>
  <name>centos7-vm</name>
  <uuid>9690f123-58c4-4b1e-b917-7b76474930a4</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.6.0'>hvm</type>
    <boot dev='cdrom'/>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <vmport state='off'/>
  </features>
  <cpu mode='host-model' check='partial'>
    <model fallback='allow'/>
  </cpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/centos7-vm.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/path/to/CentOS-7-x86_64-DVD-2009.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <interface type='bridge'>
      <mac address='52:54:00:7f:b8:e9'/>
      <source bridge='virbr0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <sound model='ich6'/>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
</domain>
Reemplace /path/to/CentOS-7-x86_64-DVD-2009.iso con la ruta actual a su imagen ISO.

**Consejo:** Cree copias de seguridad de los archivos de configuración de las máquinas virtuales antes de realizar cambios.

**Advertencia:** Una configuración incorrecta de la máquina virtual puede provocar que no funcione.

La automatización de las tareas de gestión de máquinas virtuales puede reducir significativamente los costes administrativos y aumentar la fiabilidad de la infraestructura.

Documentación de Red Hat KVM
Ahora consideremos la configuración de red para las máquinas virtuales.

Redes y conexión a la VM

La configuración de red es un aspecto importante de la virtualización. KVM admite varias opciones de configuración de red, incluidos los puentes de red (bridged networking) y NAT (Network Address Translation).

Puente de red (Bridged Networking) Un puente de red permite que una máquina virtual se conecte directamente a la red física. La máquina virtual obtiene una dirección IP de la misma subred que el sistema host.

De forma predeterminada, libvirt crea un puente de red virbr0 con NAT. Para usar un puente de red, es necesario crear una interfaz de puente en el sistema host y asignarle la dirección IP de la interfaz física.

**Ejemplo de configuración de un puente de red en Ubuntu/Debian:**

Suponga que tiene una interfaz de red enp0s3 con la dirección IP 192.168.1.100. Cree el archivo /etc/network/interfaces.d/br0.cfg:

auto br0
iface br0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    bridge_ports enp0s3
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0
Analicemos los parámetros:

  • auto br0: Habilita la interfaz br0 al iniciar el sistema.
  • iface br0 inet static: Especifica que la interfaz br0 utiliza una dirección IP estática.
  • address: La dirección IP de la interfaz br0 (192.168.1.100).
  • netmask: La máscara de subred (255.255.255.0).
  • gateway: La dirección IP de la puerta de enlace (192.168.1.1).
  • bridge_ports enp0s3: Especifica que la interfaz enp0s3 es miembro del puente br0.
  • bridge_stp off: Desactiva el protocolo STP (Spanning Tree Protocol).
  • bridge_fd 0: Establece el tiempo de reenvío (forward delay) en 0 segundos.
  • bridge_maxwait 0: Establece el tiempo máximo de espera antes de activar el puente en 0 segundos.
Luego edite el archivo /etc/network/interfaces, comentando o eliminando la configuración de la interfaz enp0s3:

#auto enp0s3
#iface enp0s3 inet static
#    address 192.168.1.100
#    netmask 255.255.255.0
#    gateway 192.168.1.1
Reinicie las interfaces de red:

sudo ifdown enp0s3
sudo ifup br0
Ahora las máquinas virtuales conectadas al puente br0 recibirán direcciones IP de la misma subred que el sistema host.

**Ejemplo de configuración de un puente de red en CentOS/RHEL:**

Cree el archivo /etc/sysconfig/network-scripts/ifcfg-br0:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
Edite el archivo /etc/sysconfig/network-scripts/ifcfg-enp0s3 (reemplace enp0s3 con el nombre de su interfaz física):

DEVICE=enp0s3
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
BRIDGE=br0
Reinicie el servicio de red:

sudo systemctl restart network
NAT (Network Address Translation) NAT permite que las máquinas virtuales accedan a Internet a través de la dirección IP del sistema host. Las máquinas virtuales reciben direcciones IP de una subred privada creada por libvirt (predeterminado 192.168.122.0/24).

Para usar NAT, es suficiente conectar la máquina virtual al puente de red virbr0 (predeterminado). Libvirt configura automáticamente NAT y el enrutamiento.

**Comprobación de la conexión de red:**

Dentro de la máquina virtual, ejecute el comando:

ping 8.8.8.8
Si el ping tiene éxito, significa que la máquina virtual tiene acceso a Internet.

**Consejo:** Utilice DNSmasq para asignar automáticamente direcciones IP a las máquinas virtuales en la red NAT.

**Advertencia:** Una configuración incorrecta del enrutamiento puede provocar que las máquinas virtuales no estén disponibles desde el exterior.

La configuración correcta de la red es la clave para un funcionamiento estable y seguro de la infraestructura virtual.

Documentación de Ubuntu KVM
Ahora pasemos a la optimización del rendimiento de KVM.

Optimización del rendimiento de KVM

La optimización del rendimiento de KVM es un paso importante para obtener el máximo rendimiento de la virtualización. Hay varias formas de mejorar el rendimiento de las máquinas virtuales.

Uso de controladores VirtIO VirtIO es un conjunto de controladores de virtualización diseñados para mejorar el rendimiento de las máquinas virtuales. Proporcionan una conexión directa entre la máquina virtual y el sistema host, minimizando los gastos generales de la emulación.

Asegúrese de que al crear una máquina virtual, utilice controladores VirtIO para discos y tarjetas de red. En la mayoría de las distribuciones de Linux, los controladores VirtIO se instalan de forma predeterminada. Si no es así, instálelos manualmente:

sudo apt install -y virtio-blk virtio-net  # Ubuntu/Debian
sudo yum install -y virtio-win            # CentOS/RHEL (para Windows VM)
Asignación de recursos de CPU y memoria La asignación correcta de recursos de CPU y memoria juega un papel importante en el rendimiento de las máquinas virtuales. Asigne suficientes recursos para cada máquina virtual, pero no se exceda para no reducir el rendimiento del sistema host.

* **CPU:** Asigne a cada máquina virtual tantos procesadores virtuales como necesite para realizar tareas. Comience con una pequeña cantidad y auméntela si es necesario. * **Memoria:** Asigne a cada máquina virtual suficiente memoria RAM para que pueda funcionar sin usar swap. Evite asignar demasiada memoria, ya que esto puede provocar una disminución del rendimiento del sistema host.

Puede cambiar la cantidad de recursos de CPU y memoria asignados con el comando virsh edit o en la interfaz gráfica de