viernes, 12 de febrero de 2021

KVM – Virtualización usando el núcleo (kernel) de Linux

KVM está estrechamente relacionado con el software de emulación QEMU. Este último suele ofrecer funciones de virtualización de hardware, mientras que Linux KVM se encarga de gestionar la asignación de recursos a los sistemas invitados. Por eso, es habitual toparse también con el término KVM/QEMU. Puesto que KVM es un componente esencial de Linux, no puede integrarse en dispositivos Windows. Sin embargo, Windows sí puede ejecutarse mediante la solución de virtualización, al igual que la mayoría de sistemas Unix, como Linux, Solaris y BSD. KVM está incluido por defecto en la mayoría de distribuciones Linux, pero debe ser activado primero.




Una máquina virtual o VM es un concepto clásico de informática aplicado a la virtualización de hardware que se utiliza para simular sistemas de computación, normalmente en un contexto de pruebas de software. Existen numerosas herramientas de software que permiten el funcionamiento de varios sistemas huéspedes en un sistema host común,

Virtualización de hardware

Con el término virtualización de hardware se hace referencia a tecnologías que ponen a disposición componentes de hardware a través de un software con independencia de su soporte físico. El ejemplo clásico de la virtualización de hardware es la máquina virtual (MV).

Una máquina virtual es un ordenador virtual que se comporta como uno físico, tanto en lo que respecta al hardware como al sistema operativo. Las máquinas virtuales funcionan como sistemas alojados virtuales en uno o varios sistemas físicos llamados equipos anfitriones o host.En la virtualización de hardware es un hipervisor el que crea la capa de abstracción entre la base física y el sistema virtual

KVM – Virtualización en el núcleo de Linux

En el contexto empresarial y cuando se usan servidores profesionales, la virtualización ya es imprescindible. Gracias a esta tecnología, pueden ejecutarse varios sistemas operativos invitados en un mismo ordenador físico, lo cual tiene muchas ventajas.

KVM (Kernel-based Virtual Machine) es un modulo de virtualización para el núcleo de Linux, que le permite a este hacer las veces de un hipervisor, permitiendo así virtualizar sistemas operativos variados como Linux, BSD, Solaris, Windows, Haiku, MacOS, entre muchos otros.

Inicialmente creado para correr sobre arquitectura x86, ha sido portado para correr sobre arquitecturas adicionales como ARM, AI-64, PowerPC, etc.

En la actualidad se consolida como una de las opciones de virtualización más destacadas del mercado, compitiendo fuertemente con alternativas como Xen o VirtualBox. (KVM vs VirtualBox)

¿Qué es la KVM de Linux?

La llamada Kernel-based Virtual Machine (KVM) fue presentada por la compañía Qumranet en el año 2000 y a principios de 2007 ya había sido incluida en el kernel de Linux 2.6.20. El año siguiente, RedHat, distribuidor de Linux, adquirió Qumranet. Para poder seguir desarrollando esta tecnología, RedHat fundó, junto con IBM, el proyecto Open Virtualization Alliance (OVA), en el que participaron empresas como Suse, Intel y HP.

KVM está estrechamente relacionado con el software de emulación QEMU. Este último suele ofrecer funciones de virtualización de hardware, mientras que Linux KVM se encarga de gestionar la asignación de recursos a los sistemas invitados. Por eso, es habitual toparse también con el término KVM/QEMU. Puesto que KVM es un componente esencial de Linux, no puede integrarse en dispositivos Windows. Sin embargo, Windows sí puede ejecutarse mediante la solución de virtualización, al igual que la mayoría de sistemas Unix, como Linux, Solaris y BSD. KVM está incluido por defecto en la mayoría de distribuciones Linux, pero debe ser activado primero.



El funcionamiento de Linux KVM al detalle

Para entender cómo funciona esta máquina virtual, es necesario conocer en primer lugar las virtualización. La virtualización es la ejecución de uno o varios sistemas operativos completos (sistemas invitados) en un mismo dispositivo anfitrión (host). El ordenador anfitrión requiere entonces servicios de hardware adicionales: estos pueden, o bien emularse mediante software, o bien estar ubicados en otros dispositivos físicos y ser controlados mediante un hipervisor, es decir, una capa de gestión y traducción entre el hardware real y el virtual. Según el tipo de virtualización, puede ser necesario traducir los requerimientos para el hardware real o puede bastar con la asignación de las acciones necesarias como, por ejemplo, un cálculo en el procesador.

Existen los siguientes tipos de virtualización:

  • Virtualización completa: el hardware es emulado en su totalidad mediante software. De este modo, no es necesaria la interacción con el hardware real, lo cual permite prescindir de los drivers correspondientes. En comparación con el resto, es la variante más lenta.
  • Paravirtualización: el sistema invitado interactúa directamente con el hipervisor y necesita para ello drivers especializados.
  • Paravirtualización asistida por hardware: la asistencia mediante hardware está integrada ya en el procesador, con lo que aumenta la eficiencia y se reduce el esfuerzo de adaptación que han de hacer los sistemas invitados. Los procesadores modernos de Intel (Intel-VT-x) y AMD (AMD-V) ofrecen esta función, aunque quizá necesite activarse en BIOS/UEFI.

Además, existen dos tipos de hipervisores:

  • Tipo 1 (bare metal): el hipervisor se ejecuta directamente en el hardware utilizado, sin estar integrado en un sistema operativo.
  • Tipo 2 (hosted): el hipervisor está integrado en el sistema operativo anfitrión y se activa desde él.

Linux KVM pertenece al segundo tipo de supervisores y utiliza la paravirtualización asistida por hardware. Lo que lo hace especial, sin embargo, es que está integrado directamente en el kernel

¿Qué componentes forman la Kernel-based Virtual Machine?

La KVM en su conjunto está formada por varios elementos:


  •  (libvirt-daemon-system  - libvirt)
  • virt-manager - una GUI para libvirt)
  • Extensión del kernel: contiene la extensión propiamente dicha, kernel.ko. Se trata de la capa de traducción entre el hardware real y el virtual. Además, incluye los módulos kvm-amd y kvm-intel, adaptados a las características de los procesadores.
  • Libvirt: es la interfaz de programación (API) para comunicarse con las máquinas virtuales, que a través de ella pueden ser controladas y gestionadas. Libvirt ofrece, además, herramientas como una línea de comandos denominada virsh y la interfaz gráfica Virtual Machine Manager.
  • QEMU: se trata, principalmente, de un programa autónomo para emular ordenadores y gestionar máquinas virtuales. Linux KVM utiliza esta función para emular hardware y mejora así la velocidad mediante paravirtualización. Muchas distribuciones incluyen ambos componentes en un mismo paquete de instalación.
  • Kvmtool: una alternativa a QEMU que requiere menos recursos, pero que aún no ha podido desbancar a su contrincante.
  • VirtIO drivers: drivers especiales para sistemas invitados que se ajustan a los requerimientos del hipervisor y hacen posible la paravirtualización.

¿Qué es QEMU?  (Quick EMUlator)

QEMU es un emulador de máquinas y virtualizador genérico open source. Cuando se usa como emulador de máquinas, QEMU puede ejecutar sistemas operativos y programas compilados para una arquitectura (por ejemplo un sistema ARM) en una máquina diferente (por ejemplo una PC). Al utilizar traducción dinámica, alcanza muy buen rendimiento.

Cuando se utiliza como virtualizador, QEMU alcanza casi la performance nativa ya que ejecuta el código guest directamente en el CPU host. QEMU soporta virtualización cuando se ejecuta bajo el hipervisor Xen o a través del módulo del kernel KVM en Linux. Cuando se usa con KVM, QEMU puede virtualizar sistemas guest x86, PowerPC y S390, entre otros.

QEMU aprovecha KVM cuando ejecuta una arquitectura guest que coincide con la arquitectura host. Por ejemplo, cuando se utiliza qemu-system-x86 sobre un procesador x86 compatible, se aprovecha la aceleración de KVM (beneficiando tanto al sistema guest como al host), ya que el código guest se ejecuta directamente en el host (sin traducción).

Anteriormente, KVM mantenía su propio fork de QEMU llamado «qemu-kvm» para soportar virtualización por hardware en arquitecturas x86. Actualmente está deprecated ya que QEMU ha incorporado la funcionalidad necesaria (ver http://wiki.qemu.org/KVM).

¿Qué es libvirt?

libvirt (The virtualization API) es un conjunto de herramientas para interactuar con las capacidades de virtualización de las versiones recientes de Linux (y otros sistemas operativos), liberado bajo la licencia «GNU Lesser General Public License».

libvirt soporta un gran conjunto de tecnologías entre las que se destacan:

  • KVM/QEMU
  • Xen (en Linux y Solaris)
  • LXC
  • OpenVZ
  • El kernel paravirtualizado User Mode Linux
  • VirtualBox
  • VMware ESX y GSX
  • VMware Workstation y Player
  • Microsoft Hyper-V
  • IBM PowerVM
  • El hipervisor Parallels
  • Redes virtuales usando bridging, NAT, VEPA y VN-LINK
  • Almacenamiento en discos IDE/SCSI/USB, FibreChannel, LVM, iSCSI y NFS

libvirt permite administrar hosts de forma remota utilizando cifrado TLS y certificados x509; autenticación con Kerberos y SASL; control de acceso local mediante PolicyKit; Zeroconf utilizando Avahi; administración de máquinas virtuales, redes y almacenamiento; y una API cliente portable para Linux, Solaris y Windows.

Instalando KVM

Para dar inicio con el proceso, lo primero que debemos hacer es verificar que nuestro procesador soporta las instrucciones necesarias para virtualizar con KVM. Para hacer esto ejecutamos el siguiente comando:

egrep -c '(svm|vmx)' /proc/cpuinfo


Si al ejecutar el anterior comando obtenemos un resultado igual o superior a 1, quiere decir que nuestro CPU es capaz de soportar las instrucciones y tecnología necesaria para virtualizar.

 

lscpu | grep Virtualization
Virtualization:                     VT-x

 

o aparecerá AMD-V si tenemos un procesador AMD


Dado lo anterior procedemos a instalar los paquetes necesarios por medio del siguiente comando:

sudo apt-get install qemu-kvm libvirt-bin bridge-utils virt-manager

 

 Fedora / Rocky Linux:

$ sudo dnf install qemu-kvm libvirt virt-install virt-manager virt-viewer \
    edk2-ovmf swtpm qemu-img guestfs-tools libosinfo tuned


Ubuntu / Debian Linux:

$ sudo apt install qemu-system-x86 libvirt-daemon-system virtinst \
    virt-manager virt-viewer ovmf swtpm qemu-utils guestfs-tools \
    libosinfo-bin tuned


Arch Linux:

$ sudo pacman -S qemu-base libvirt virt-install virt-manager virt-viewer \
    edk2-ovmf swtpm qemu-img guestfs-tools libosinfo

$ yay -S tuned

Descripción de los paquetes:

  • qemu-kvm/qemu-system-x86/qemu-base: A user-level KVM emulator that facilitates communication between hosts and VMs.
  •  libvirt/libvirt-daemon-system: A daemon that manages virtual machines and the hypervisor as well as handles library calls.
  • virt-install/virtinst: A command-line tool for creating guest virtual machines.
  • virt-manager: A graphical tool for creating and managing guest virtual machines.
  • virt-viewer: A graphical console for connecting to a running virtual machine.
  • edk2-ovmf/ovmf: Enables UEFI support for Virtual Machines.
  • swtpm: A TPM emulator for Virtual Machines.
  •  qemu-img/qemu-utils: Provides tools to create, convert, modify, and snapshot offline disk images.
  • guestfs-tools: Provides a set of extended command-line tools for managing virtual machines.
  • libosinfo/libosinfo-bin: A library for managing OS information for virtualization.
  • tuned: A system tuning service for Linux.

Instalar drivers VirtIO para usar máquinas Windows


Los controladores VirtIO son controladores para-virtualizados para huéspedes KVM. Desafortunadamente, Microsoft no proporciona controladores VirtIO. Si desea crear una máquina virtual Microsoft Windows, necesita descargar la imagen virtio-win.iso, que contiene los controladores VirtIO para el sistema operativo Windows.

Fedora / Rocky Linux:


$ sudo wget https://fedorapeople.org/groups/virt/virtio-win/virtio-win.repo \
    -O /etc/yum.repos.d/virtio-win.repo


Por defecto, sólo se puede instalar la versión estable. Si desea el paquete más reciente, debe habilitarlo en el repositorio. Abra el archivo /etc/yum.repos.d/virtio-win.repo y cambie enabled=0 por enabled=1 en la sección [virtio-win-latest].

$ sudo vim /etc/yum.repos.d/virtio-win.repo
...
[virtio-win-latest]
name=Latest virtio-win builds
baseurl=https://fedorapeople.org/groups/virt/virtio-win/repo/latest
enabled=1
skip_if_unavailable=1
gpgcheck=0
...


Ahora ya se puede instalar el paquete virtio-win.

$ sudo dnf install virtio-win


El archivo virtio-win.iso se guardará en el directorio /usr/share/virtio-win/

Ubuntu / Debian / Arch Linux:

Para las distribuciones Linux que no están basadas en Red Hat, puede descargar directamente la última versión de virtio-win.iso.
 

$ wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso

Cuando creas una VM Windows, deberás adjuntar esta imagen ISO a un CD-ROM. Incluye todos los controladores VirtIO necesarios para la instalación del sistema operativo Windows.

Habilitar Modular libvirt Daemon


Hay dos tipos de demonios libvirt: monolíticos y modulares. El tipo de dæmon que utilice afecta a la granularidad con la que puede configurar los controladores de virtualización individuales.

El dæmon monolítico tradicional de libvirt, libvirtd, gestiona una amplia gama de controladores de virtualización a través de la configuración centralizada del hipervisor. Sin embargo, esto puede resultar en un uso ineficiente de los recursos del sistema.

En cambio, el nuevo libvirt modular proporciona un demonio específico para cada controlador de virtualización. Como resultado, los demonios modulares de libvirt ofrecen más flexibilidad a la hora de ajustar la gestión de recursos de libvirt.

Mientras que la mayoría de las distribuciones de Linux han empezado a ofrecer una opción modular, en el momento de escribir esto, Ubuntu y Debian siguen ofreciendo sólo un demonio monolítico.

Fedora / Rocky / Arch Linux:

$ for drv in qemu interface network nodedev nwfilter secret storage; do \
    sudo systemctl enable virt${drv}d.service; \
    sudo systemctl enable virt${drv}d{,-ro,-admin}.socket; \
  done


Ubuntu / Debian Linux:

$ sudo systemctl enable libvirtd.service


Se recomienda reiniciar para que el KVM pueda arrancar correctamente.

$ sudo reboot

Una vez instalados los paquetes podemos verificar que el proceso de instalación ha sido exitoso de la siguiente manera:

sudo kvm-ok


Si el proceso se ha efectuado de manera correcta, deberíamos obtener la siguiente salida:

INFO: /dev/kvm exists KVM acceleration can be used

Con el comando:

 virt-host-validate

 

Si aparece el mensaje:

QEMU: Checking for device assignment IOMMU support : WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)
Es que tu procesador Intel sólo admite la función VT-x (vmx) y no VT-d.

VT-d se utiliza para implementar una función conocida como PCIe Pass-through. VT-d permite que las máquinas virtuales tengan acceso directo a dispositivos de E/S específicos, como tarjetas gráficas, adaptadores de red y controladores de almacenamiento.

 Ejemplo resultado:

  QEMU: Checking for hardware virtualization : PASS
  QEMU: Checking if device /dev/kvm exists : PASS
  QEMU: Checking if device /dev/kvm is accessible : PASS
  QEMU: Checking if device /dev/vhost-net exists : PASS
  QEMU: Checking if device /dev/net/tun exists : PASS
  QEMU: Checking for cgroup 'cpu' controller support : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support: PASS
  QEMU: Checking for cgroup 'cpuset' controller support : PASS
  QEMU: Checking for cgroup 'memory' controller support : PASS
  QEMU: Checking for cgroup 'devices' controller support : PASS
  QEMU: Checking for cgroup 'blkio' controller support: PASS
  QEMU: Checking for device assignment IOMMU support : PASS
  QEMU: Checking if IOMMU is enabled by kernel : WARN (IOMMU appears to be disabled in kernel. Add intel_iommu=on to kernel cmdline arguments)
  QEMU: Checking for secure guest support : WARN (Unknown if this platform has Secure Guest support)

 Debemos editar el fichero de GRUB

/etc/default/grub

Y añadir el flag para procesadores intel intel_iommu=on


GRUB_CMDLINE_LINUX=“rhgb quiet intel_iommu=on”


Para procesadores AMD

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on"

Fedora / Rocky Linux:


$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg


 
Ubuntu / Debian:


$ sudo update-grub


Arch Linux:


$ sudo grub-mkconfig -o /boot/grub/grub.cfg

O añadirlo mediante:

 

 sudo grubby --update-kernel=ALL --args=“intel_iommu=on”

Y reiniciar mediante el comando

reboot
Para quitarlo:


sudo grubby --update-kernel=ALL --remove-args=“intel_iommu”

Para verificar


En una CPU Intel verifica que VT-d está habilitado:

$ dmesg | grep -i -e DMAR -e IOMMU


En una CPU AMD-Vi:


$ dmesg | grep -i -e AMD-Vi


En lo personal, recomiendo en este punto reiniciar el sistema para asegurar que todos los demonios y subsistemas estén corriendo adecuadamente.

 

Optimizar el host con TuneD


TuneD es un servicio de ajuste de sistemas para Linux. Ofrece una serie de perfiles de ajuste preconfigurados, cada uno optimizado para unas características de carga de trabajo únicas, como las necesidades de trabajo intensivo de la CPU, la capacidad de respuesta de rendimiento de almacenamiento/red o la reducción del consumo de energía.

Habilitar e iniciar el servicio TuneD.

$ sudo systemctl enable --now tuned


Averiguar qué perfil de TuneD está activo actualmente.

$ tuned-adm active
Current active profile: balanced


Listar todos los perfiles TuneD disponibles en tu sistema

$ tuned-adm list
Available profiles:
- accelerator-performance     - Throughput performance based tuning with disabled higher latency STOP states
- aws                         - Optimize for aws ec2 instances
- balanced                    - General non-specialized tuned profile
- desktop                     - Optimize for the desktop use-case
- hpc-compute                 - Optimize for HPC compute workloads
- intel-sst                   - Configure for Intel Speed Select Base Frequency
- latency-performance         - Optimize for deterministic performance at the cost of increased power consumption
- network-latency             - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput          - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- optimize-serial-console     - Optimize for serial console use.
- powersave                   - Optimize for low power consumption
- throughput-performance      - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest               - Optimize for running inside a virtual guest
- virtual-host                - Optimize for running KVM guests
Current active profile: throughput-performance


Voy a establecer el perfil a virtual-host. Esto optimiza el host para ejecutar invitados KVM.

$ sudo tuned-adm profile virtual-host


Comprueba que el perfil TuneD se ha actualizado y que el host virtual está activo.

$ tuned-adm active
Current active profile: virtual-host


Asegúrate que no hay errores.

$ sudo tuned-adm verify
Verfication succeeded, current system settings match the preset profile.
See TuneD log file ('/var/log/tuned/tuned.log') for details.

Dar al usuario permisos para todo el sistema


Libvirt proporciona dos métodos para conectarse al hipervisor qemu-kvm local.

qemu:///session


Conectarse como usuario normal a una instancia por usuario de forma local. Este es el modo por defecto cuando se ejecuta una máquina virtual como usuario normal. Esto permite a los usuarios gestionar únicamente sus propias máquinas virtuales.

$ virsh uri
qemu:///session

qemu:///system


Conectarse a una instancia del sistema como usuario root localmente. Cuando se ejecuta como root, tiene acceso completo a todos los recursos del host. Este es también el método recomendado para conectarse al hipervisor local.

$ sudo virsh uri
qemu:///system


Por lo tanto, si deseas conectartee a una instancia del sistema como un usuario normal con acceso completo a todos los recursos del host, haz lo siguiente.

    Nota: Para los usuarios de Ubuntu, los permisos de todo el sistema están habilitados por defecto. Puede omitir esta sección y pasar a la siguiente.

Añade el usuario normal al grupo libvirt.

$ sudo usermod -aG libvirt $USER


Defina la variable de entorno LIBVIRT_DEFAULT_URI en el archivo local .bashrc del usuario.

$ echo "export LIBVIRT_DEFAULT_URI='qemu:///system'" >> ~/.bashrc
$ source ~/.bashrc


Comprueba de nuevo como usuario normal a qué instancia está conectado.

$ virsh uri
qemu:///system


Ahora puedes utilizar la herramienta de línea de comandos virsh y el Administrador de máquinas virtuales (virt-manager) sin sudo.

A continuación podemos crear usuario con los permisos necesarios para poder instalar y manipular maquinas virtuales en nuestro sistema. Para lograrlo simplemente ejecutamos el siguiente comando:

sudo adduser [nombre de usuario] libvirt

Añadir nuestro usuario actual:

  sudo usermod -aG libvirt $USER

Después debes añade tu usuario a los grupos kvm y libvirtd:

adduser `id -un` kvm

adduser `id -un` libvirtd

Ahora estamos listos para verificar la instalación, para hacerlo simplemente ejecutamos lo siguiente:

virsh -c qemu:///system list


Una excelente y completísima Guía Oficial de RedHat:



 

Configurar una Red Puente (Network Bridge)


Todas las máquinas virtuales del host están conectadas por defecto a la misma red virtual de tipo NAT, denominada 'default'.

$ sudo virsh net-list --all
 Name      State    Autostart   Persistent
--------------------------------------------
 default   active   yes         yes

 

Nota: Si utilizas Debian, el estado de red por defecto será inactivo y el arranque automático estará desactivado. Para activarla, ejecute el comando sudo virsh net-start default seguido de sudo virsh net-autostart default.

A las máquinas virtuales que utilicen esta red 'por defecto' se les asignará una dirección IP en el espacio de direcciones 192.168.124.0/24, con el SO anfitrión accesible en 192.168.124.1.

$ sudo virsh net-dumpxml default | xmllint --xpath '//ip' -
<ip address="192.168.124.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.124.2" end="192.168.124.254"/>
    </dhcp>
</ip>


Las máquinas virtuales que utilicen esta red por defecto sólo tendrán acceso a la red saliente. Las máquinas virtuales tendrán acceso completo a los servicios de red, pero los dispositivos fuera del host no podrán comunicarse con las máquinas virtuales dentro del host. Por ejemplo, la máquina virtual puede navegar por la web pero no puede alojar un servidor web accesible desde el exterior.

Si desea que las máquinas virtuales sean directamente visibles en la misma red física que el host y visibles para dispositivos externos, debe utilizar un puente de red.

Un puente de red es un dispositivo de capa de enlace que conecta dos redes de área local en una sola red. En este caso, se utiliza un puente de software dentro de un host Linux para simular un puente de hardware. Como resultado, todas las demás máquinas físicas en la misma red física del host pueden detectar y acceder a las máquinas virtuales. La máquina virtual, por ejemplo, puede navegar por la web, y también será capaz de alojar un servidor web accesible al mundo exterior.


    Importante:

  •     Lamentablemente, no se puede configurar un puente de red cuando se utiliza Wi-Fi.
  •     Debido al estándar IEEE 802.11, que especifica el uso de tramas de 3 direcciones en Wi-Fi para el uso eficiente del tiempo de aire, no se puede configurar un puente sobre redes Wi-Fi que funcionen en modo Ad-Hoc o Infraestructura.



En primer lugar, busca el nombre de la interfaz que quieres añadir al puente. En mi caso, es enp2s0.

$ sudo nmcli device status
DEVICE             TYPE      STATE                   CONNECTION         
enp2s0             ethernet  connected               Wired connection 1
lo                 loopback  connected (externally)  lo                 
virbr0             bridge    connected (externally)  virbr0


Crea una interfaz puente. La llamaré bridge0, pero puedes llamarla como quieras.

$ sudo nmcli connection add type bridge con-name bridge0 ifname bridge0


Asigna la interfaz al puente. Voy a llamar a esta conexión 'Conexión puente 1', pero puedes llamarla como quieras.

$ sudo nmcli connection add type ethernet slave-type bridge \
    con-name 'Bridge connection 1' ifname enp2s0 master bridge0


El siguiente paso es opcional. Si desea configurar una dirección IP estática, utilice los siguientes comandos; de lo contrario, omita este paso. Cambie la dirección IP y otros detalles para que coincidan con su configuración.

$ sudo nmcli connection modify bridge0 ipv4.addresses '192.168.1.7/24'
$ sudo nmcli connection modify bridge0 ipv4.gateway '192.168.1.1'
$ sudo nmcli connection modify bridge0 ipv4.dns '8.8.8.8,8.8.4.4'
$ sudo nmcli connection modify bridge0 ipv4.dns-search 'elhacker.net'
$ sudo nmcli connection modify bridge0 ipv4.method manual


Activar la conexión.

$ sudo nmcli connection up bridge0


Habilita el parámetro connection.autoconnect-slaves de la conexión puente.

$ sudo nmcli connection modify bridge0 connection.autoconnect-slaves 1


Reactiva el puente.

$ sudo nmcli connection up bridge0


Verifica la conexión. Si obtiene su dirección IP del DHCP, puede tardar unos segundos en arrendar una nueva. Ten paciencia.

$ sudo nmcli device status
DEVICE             TYPE      STATE                   CONNECTION          
bridge0            bridge    connected               bridge0             
lo                 loopback  connected (externally)  lo                  
virbr0             bridge    connected (externally)  virbr0              
enp2s0             ethernet  connected               Bridge connection 1

$ ip -brief addr show dev bridge0
bridge0          UP             192.168.1.7/24 fe80::a345:fb7b:cb67:c778/64


Ya puedes empezar a utilizar un puente de red al crear máquinas virtuales.

Sin embargo, se recomienda que también configure una red de puente virtual en KVM para que las máquinas virtuales puedan utilizar esta interfaz de puente por nombre.

Crea un archivo XML llamado nwbridge.xml y rellénalo con la siguiente información. Llamaré a mi puente de red host nwbridge, pero puedes llamarlo como quieras.

$ vim nwbridge.xml
<network>
  <name>nwbridge</name>
  <forward mode='bridge'/>
  <bridge name='bridge0'/>
</network>


Define nwbridge como una red virtual persistente.

$ sudo virsh net-define nwbridge.xml


Activa el nwbridge y configúralo para que se inicie automáticamente al arrancar.

$ sudo virsh net-start nwbridge
$ sudo virsh net-autostart nwbridge


Ahora puedes eliminar con seguridad el archivo nwbridge.xml. Ya no es necesario.

$ rm nwbridge.xml


Por último, compruebe que el puente de red virtual nwbridge está en funcionamiento.

$ sudo virsh net-list --all
 Name       State    Autostart   Persistent
---------------------------------------------
 default    active   yes         yes
 nwbridge   active   yes         yes


Se ha creado un puente de red. Ahora puede empezar a utilizar el puente de red nwbridge en sus máquinas virtuales. Las máquinas virtuales obtendrán sus direcciones IP del mismo pool que su máquina anfitriona.

Si alguna vez deseas eliminar este puente de red y devolverlo a su estado anterior, ejecuta los siguientes comandos.

$ sudo virsh net-destroy nwbridge
$ sudo virsh net-undefine nwbridge

$ sudo nmcli connection up 'Wired connection 1'
$ sudo nmcli connection down bridge0
$ sudo nmcli connection del bridge0
$ sudo nmcli connection del 'Bridge connection 1'

Establecer ACL en el directorio de imágenes


Por defecto, las imágenes de disco de las máquinas virtuales se almacenan en el directorio /var/lib/libvirt/images. Sólo el usuario root tiene acceso a este directorio.

$ ls /var/lib/libvirt/images/
ls: cannot open directory '/var/lib/libvirt/images/': Permission denied


Como usuario normal, es posible que desee acceder a este directorio sin tener que escribir sudo cada vez. Por lo tanto, establecer la ACL para este directorio es la mejor manera de acceder a él sin cambiar los permisos por defecto.

En primer lugar, elimina recursivamente cualquier permiso ACL existente en el directorio.

$ sudo setfacl -R -b /var/lib/libvirt/images


Concede permiso de usuario normal al directorio de forma recursiva.

$ sudo setfacl -R -m u:$USER:rwX /var/lib/libvirt/images


La "X" mayúscula de arriba indica que "ejecutar" sólo debe aplicarse a las carpetas hijas y no a los archivos hijos.

Todos los directorios y archivos existentes (si los hubiera) en /var/lib/libvirt/images/ tienen ahora permisos. Sin embargo, los nuevos directorios y archivos creados dentro de este directorio no tendrán permisos especiales. Para evitar esto, necesitamos habilitar los permisos especiales 'por defecto'. Los 'acls por defecto' sólo se pueden aplicar a los directorios y no a los archivos.

$ sudo setfacl -m d:u:$USER:rwx /var/lib/libvirt/images


Ahora revisa sus nuevos permisos ACL en el directorio.

$ getfacl /var/lib/libvirt/images
getfacl: Removing leading '/' from absolute path names
# file: var/lib/libvirt/images
# owner: root
# group: root
user::rwx
user:madhu:rwx
group::--x
mask::rwx
other::--x
default:user::rwx
default:user:madhu:rwx
default:group::--x
default:mask::rwx
default:other::--x


Intenta acceder de nuevo al directorio /var/lib/libvirt/images como usuario normal.

$ touch /var/lib/libvirt/images/test_file

$ ls -l /var/lib/libvirt/images/
total 0
-rw-rw----+ 1 madhu madhu 0 Feb 12 21:34 test_file

Ahora ya tienes acceso completo al directorio /var/lib/libvirt/images


Convertir OVA (VirtualBox) a KVM

Pasar de VDI a IMG
VboxManage clonehd “path/vdi_file.vdi” “absolutepath/filename.img” -format raw
De IMG a qcow2

qemu-img convert -f raw -O qcow2 “absolutepath/filename_of_existing_img_file.img” “absolutepath/filename.qcow2”

Alternativas a la KVM de Linux

En el ámbito del software de código abierto y con funciones similares, XEN es la alternativa más importante. Se trata de una herramienta de virtualización que también está estrechamente relacionada con Linux, pero no se integra en el kernel.

Por su parte, en el mercado comercial, el consolidado fabricante VMWare ofrece alternativas de paravirtualización con sus servidores ESXi y de virtualización completa con su workstation. Para los usuarios particulares, además, VMWare Player es gratuito.

Virtualbox es otra alternativa de virtualización completa que puede utilizarse en todos los sistemas operativos habituales.

Microsoft también tiene una herramienta de paravirtualización para Windows: el sistema Hyper-V, que funciona de manera similar a la KVM de Linux. Dispone de un servidor Hyper-V de Windows dedicado y funciona de forma integrada en los sistemas operativos del servidor. Hiper-V también está incluido en las versiones Windows 10 Professional y Enterprise.

Fuentes:
https://www.ionos.es/digitalguide/servidores/know-how/que-es-kvm/

https://sysguides.com/install-kvm-on-linux/

No hay comentarios:

Publicar un comentario