Esta guía paso a paso explica qué es KVM y cómo instalar y configurar KVM en el sistema operativo CentOS 8 Linux.
Esta guía se prueba oficialmente en la edición de servidor mínimo de CentOS 8. Sin embargo, también debería funcionar en RHEL 8 y sus clones como AlmaLinux 8 y Rocky Linux 8.
¿Qué es KVM?
KVM , abreviatura de K V basado en ernel M virtual achine, es un módulo de kernel de FreeBSD y Linux que permite que el kernel actúe como un hipervisor.
A partir de la versión 2.6.20 del kernel, KVM se fusiona con la línea principal del kernel de Linux.
Con KVM, puede configurar fácilmente un entorno de virtualización en una máquina Linux e implementar una amplia gama de sistemas operativos invitados, incluidos Linux, Windows, BSD, Mac OS y muchos.
Ahora veamos cómo instalar y configurar KVM en CentOS 8 Linux.
Requisitos
Antes de instalar KVM, primero asegúrese de que su sistema sea compatible con la virtualización de hardware. Hemos documentado algunas formas diferentes de identificar si un sistema Linux es compatible con la virtualización en la siguiente guía.
- Cómo averiguar si una CPU es compatible con la tecnología de virtualización (VT)
Si su sistema es compatible con la virtualización de hardware, continúe con los siguientes pasos.
1. Instalar y configurar KVM en el servidor CentOS 8
A los efectos de esta guía, usaré el siguiente sistema:
servidor de virtualización KVM:
- SO – Servidor mínimo CentOS 8 (sin GUI)
- Dirección IP :192.168.225.53/24
Aunque se probó en CentOS 8, esta guía también debería funcionar bien en RHEL 8.
1.1. Instalar KVM en CentOS 8
root
usuario. Si ha iniciado sesión como usuario normal, agregue sudo
delante de todos los comandos que se dan a continuación.
Instale Kvm y todas las dependencias requeridas para configurar un entorno de virtualización en su servidor CentOS 8 usando el comando como root
usuario:
# dnf install qemu-kvm libvirt virt-install
Aquí,
- emu-kvm - Metapaquete QEMU para compatibilidad con KVM (es decir, virtualización completa de QEMU en hardware x86),
- libvirt - programas para la biblioteca libvirt,
- instalación virtual - programas para crear y clonar máquinas virtuales.
Una vez que KVM esté instalado, habilite e inicie libvertd
servicio (si aún no se ha iniciado):
# systemctl enable libvirtd
# systemctl start libvirtd
También puede combinar ambos comandos y ejecutarlos como una sola línea como se muestra a continuación:
# systemctl enable --now libvirtd
Verifique el estado del servicio libvirtd con el comando:
# systemctl status libvirtd
Salida de muestra:
● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enable> Active: active (running) since Wed 2020-07-15 14:27:32 IST; 5s ago Docs: man:libvirtd(8) https://libvirt.org Main PID: 1097 (libvirtd) Tasks: 17 (limit: 32768) Memory: 57.0M CGroup: /system.slice/libvirtd.service └─1097 /usr/sbin/libvirtd Jul 15 14:27:28 centos8.ostechnix.lan systemd[1]: Starting Virtualization daemon... Jul 15 14:27:32 centos8.ostechnix.lan systemd[1]: Started Virtualization daemon.
¡El servicio libvertd está funcionando!
Verifique si los módulos KVM están cargados:
# lsmod | grep kvm
Salida de muestra:
kvm_intel 294912 0 kvm 786432 1 kvm_intel irqbypass 16384 1 kvm
¡Estupendo! Los módulos KVM están cargados. Vamos a crear un puente de red ahora.
1.2. Configure la red puente con KVM en CentOS
Una red en puente comparte la interfaz de red real de la computadora host con otras máquinas virtuales para conectarse a la red externa. Por lo tanto, cada VM puede vincularse directamente a cualquier IPv4
disponible o IPv6
direcciones, como una computadora física.
De forma predeterminada, KVM configura un puente virtual privado, de modo que todas las máquinas virtuales puedan comunicarse entre sí, dentro de la computadora host.
Proporciona su propia subred y DHCP para configurar la red del huésped y utiliza NAT para acceder a la red del host.
Eche un vistazo a la dirección IP de las interfaces virtuales predeterminadas de KVM usando ip
comando:
# ip a
Salida de muestra:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff inet 192.168.225.52/24 brd 192.168.225.255 scope global dynamic noprefixroute enp0s3 valid_lft 42217sec preferred_lft 42217sec inet6 2409:4072:918:98cf:ad3b:b969:8ec8:f9c7/64 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::b404:4d52:8bee:18bf/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff 5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
Como puede ver, la red predeterminada de KVM virbr0
usa 192.168.122.1/24
Dirección IP. Todas las VM usarán una dirección IP en el 192.168.122.0/24
Se podrá acceder al rango de IP y al sistema operativo host en 192.168.122.1
.
Debería poder acceder al sistema operativo host (en 192.168.122.1
) desde dentro del sistema operativo invitado y use scp
para copiar archivos de un lado a otro.
Está bien si solo accede a las máquinas virtuales internas desde el propio host. Sin embargo, no puede acceder a las máquinas virtuales desde otros sistemas remotos en la red.
Porque usan un rango de IP diferente, es decir, 192.168.225.0/24
en mi caso. Para acceder a las máquinas virtuales desde otros hosts remotos, debemos configurar un puente público que se ejecute en la red del host y use cualquier servidor DHCP externo que esté en la red del host.
Para poner esto en términos simples, vamos a hacer que todas las máquinas virtuales usen la misma serie de IP que usa el sistema host.
Antes de configurar una red pública en puente, debemos deshabilitar Netfilter por razones de rendimiento y seguridad . Actualmente, Netfilter está habilitado en los puentes de forma predeterminada.
Para deshabilitar netfilter, cree un archivo llamado /etc/sysctl.d/bridge.conf
:
# vi /etc/sysctl.d/bridge.conf
Agregue las siguientes líneas:
net.bridge.bridge-nf-call-ip6tables=0 net.bridge.bridge-nf-call-iptables=0 net.bridge.bridge-nf-call-arptables=0
Guarde y cierre el archivo.
Luego crea otro archivo llamado /etc/udev/rules.d/99-bridge.rules
:
# vi /etc/udev/rules.d/99-bridge.rules
Agregue la siguiente línea:
ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/sbin/sysctl -p /etc/sysctl.d/bridge.conf"
Esto establecerá las banderas necesarias para deshabilitar netfilter en puentes en el lugar apropiado en el inicio del sistema. Guarde y cierre el archivo. Reinicia tu sistema para que surtan efecto estos cambios.
A continuación, debemos deshabilitar la red predeterminada que KVM instaló por sí mismo.
Encuentre el nombre de las interfaces de red predeterminadas de KVM usando el comando "ip link":
# ip link
Salida de muestra:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff 5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff 6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000 link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
Como puede ver en el resultado anterior, las entradas virbr0
y virbr0-nic
son las redes KVM.
Quitemos la red KVM predeterminada con el comando:
# virsh net-destroy default
Salida de muestra:
Network default destroyed
Anule la definición de la red predeterminada con el comando:
# virsh net-undefine default
Salida de muestra:
Network default has been undefined
Si los comandos anteriores no funcionan por algún motivo, puede usar estos comandos para deshabilitar y anular la definición de la red predeterminada de KVM:
# ip link delete virbr0 type bridge
# ip link delete virbr0-nic
Ahora ejecuta ip link
nuevamente para verificar si el virbr0
y virbr0-nic
las interfaces en realidad se eliminan:
# ip link
Salida de muestra:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff
Bueno, las redes predeterminadas de KVM se han ido.
Ahora, configuremos el puente público KVM para usarlo al crear una nueva VM.
Cree una nueva interfaz puente llamada br0
usando nmcli
comando:
# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0
Establezca la dirección IP para la interfaz del puente:
# nmcli connection modify br0 ipv4.addresses 192.168.225.53/24 ipv4.method manual
Configure la puerta de enlace para la interfaz del puente:
# nmcli connection modify br0 ipv4.gateway 192.168.225.1
Establecer DNS para la interfaz del puente:
# nmcli connection modify br0 ipv4.dns 192.168.225.1
A continuación, debemos quitar una de sus tarjetas de interfaz de red y agregarla como esclava del puente.
Tenga en cuenta que si su servidor solo tiene una NIC y está accediendo al servidor a través de SSH, su conexión finalizará después de quitar la NIC. Le sugiero que realice los siguientes pasos en la consola de su servidor.
Por ejemplo, voy a agregar enp0s8
interfaz como esclavo de la interfaz del puente br0
.
Para eliminar la interfaz de red enp0s8
, ejecuta:
# nmcli connection del enp0s8
Reemplazar enp0s8
con su propia tarjeta de red.
A continuación, agregue el enp0s8
al puente usando el comando:
# nmcli connection add type bridge-slave autoconnect yes con-name enp0s8 ifname enp0s8 master br0
Aquí, la interfaz de red del puente br0
está conectado a la interfaz de red del host enp0s8
. Reemplace los nombres de las interfaces de red anteriores que coincidan con su red.
Reinicie el administrador de red para que se apliquen los cambios:
# systemctl restart NetworkManager
Si es posible, es mejor reiniciar su sistema:
# reboot
Inicie sesión en su servidor y verifique si la dirección IP se ha asignado a la interfaz del puente:
$ ip a
Salida de muestra:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff 5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff inet 192.168.225.53/24 brd 192.168.225.255 scope global noprefixroute br0 valid_lft forever preferred_lft forever inet6 2409:4072:6084:198:df03:d9ed:62eb:df34/64 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::e8c8:e98b:7fef:5874/64 scope link noprefixroute valid_lft forever preferred_lft forever
Como puede ver en el resultado anterior, la interfaz de red en puente br0
tiene asignada la dirección IP 192.168.225.53
y el enp0s8
la entrada ahora tiene master br0
entrada. Significa que enp0s8
pertenece al puente.
También puedes usar bridge
comando para mostrar el estado del puente:
# bridge link show br0 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
Hemos creado con éxito una interfaz de puente y está activa. Tenemos que hacer una última cosa.
Deberíamos configurar KVM para usar esta interfaz de puente como interfaz predeterminada. Para hacerlo, crea un XML
archivo llamado host-bridge.xml
:
# vi host-bridge.xml
Agregue las siguientes líneas:
<network> <name>host-bridge</name> <forward mode="bridge"/> <bridge name="br0"/> </network>
Ejecute los siguientes comandos para iniciar el puente recién creado y convertirlo en el puente predeterminado para las máquinas virtuales:
# virsh net-define host-bridge.xml
# virsh net-start host-bridge
# virsh net-autostart host-bridge
Verifique si el puente está activo y comenzó usando el comando:
# virsh net-list --all
Salida de muestra:
Name State Autostart Persistent ------------------------------------------------ host-bridge active yes yes
¡Felicidades! Hemos instalado y configurado con éxito KVM en el servidor sin cabeza CentOS 8.
2. Cree y administre máquinas invitadas KVM
Podemos crear y administrar máquinas virtuales desde la línea de comandos o utilizando cualquier herramienta de administración de KVM como Cockpit y Virt-manager. Consulte las siguientes guías para obtener más detalles.
- Cómo administrar máquinas virtuales KVM con el programa Virsh
- Administre máquinas virtuales KVM mediante la consola web Cockpit
- Cómo administrar máquinas virtuales KVM con Virt-Manager
3. Habilite el acceso a la consola Virsh para máquinas virtuales
Después de crear los invitados KVM, puedo acceder a ellos a través de SSH, cliente VNC, Virt-viewer, Virt-manager y la consola web Cockpit, etc. Pero no pude acceder a ellos usando virsh console
dominio. Para acceder a los invitados de KVM usando la "consola virsh", consulte la siguiente guía:
- Cómo habilitar el acceso a la consola Virsh para invitados KVM
Otras guías relacionadas con KVM en este blog
- Instalar y configurar KVM en Ubuntu 20.04 servidor sin cabeza
- Instalar y configurar KVM en OpenSUSE Tumbleweed
- Cree una máquina virtual KVM usando la imagen Qcow2 en Linux
- Cómo migrar máquinas virtuales de Virtualbox a máquinas virtuales KVM en Linux
- Habilite la compatibilidad con UEFI para máquinas virtuales KVM en Linux
- Cómo habilitar la virtualización anidada en KVM en Linux
- Muestre las estadísticas de los sistemas de virtualización con Virt-top en Linux
- Cómo encontrar la dirección IP de una máquina virtual KVM
- Cómo cambiar el nombre de la máquina virtual invitada KVM
- Acceda y modifique imágenes de disco de máquina virtual con Libguestfs
- Cree rápidamente imágenes de máquinas virtuales con Virt-builder
- Cómo rescatar máquinas virtuales con Virt-rescue
- Cómo ampliar el tamaño del disco de la máquina virtual KVM en Linux
- Configurar una carpeta compartida entre el host y el invitado de KVM
- Cómo cambiar la ubicación del grupo de almacenamiento predeterminado de KVM Libvirt
- [Resuelto] No se puede acceder al archivo de almacenamiento, Permiso denegado Error en KVM Libvirt
- Cómo exportar e importar máquinas virtuales KVM en Linux
Conclusión
En esta guía, discutimos cómo instalar y configurar KVM en la edición del servidor CentOS 8.
También vimos cómo crear y administrar máquinas virtuales KVM desde la línea de comandos usando virsh
herramienta y usando herramientas GUI llamadas Cockpit y Virt-manager.
Finalmente, vimos cómo habilitar el acceso a la consola virsh para máquinas virtuales KVM.
En esta etapa, debería tener un entorno de virtualización completamente funcional en su servidor CentOS 8.