quot; border: 0px hidden"»>
Traducción(es): English – Español – 한국어 – Norsk – Русский |
quot; text-align: right; border: ¡0px hidden"»>
Discusión |
La máquina virtual del kernel, o KVM, es una solución de virtualización completa para Linux en hardware x86 (64 bits incluidos) y ARM que contiene extensiones de virtualización (Intel VT o AMD-V). Consiste en un módulo del kernel cargable, kvm.ko, que proporciona el núcleo de la infraestructura de virtualización y un módulo específico del procesador, kvm-intel.ko o kvm-amd.ko.
En Debian, Xen es una alternativa a KVM. (VirtualBox no está en Debian main ni en Debian Buster y no estará en Debian Buster-Backports, 794466).
Instalación
Es posible instalar sólo QEMU y KVM para una configuración muy mínima, pero la mayoría de los usuarios también querrán libvirt para una configuración y gestión conveniente de las máquinas virtuales (libvirt-daemon-system – libvirt, virt-manager – una GUI para libvirt). Típicamente un usuario debería instalar:
# apt-get install qemu-system libvirt-clients libvirt-daemon-system
Cuando se instala en un servidor, se puede añadir la opción apt –no-install-recommends, para evitar la instalación de paquetes gráficos extraños:
# apt-get install --no-install-recommends qemu-system libvirt-clients libvirt-daemon-system
El demonio libvirt-bin se iniciará automáticamente en el momento del arranque y cargará los módulos KVM apropiados, kvm-amd o kvm-intel, que se envían con el paquete Debian del núcleo de Linux. Si pretende crear máquinas virtuales (VM) desde la línea de comandos, instale virtinst.
Para poder gestionar las máquinas virtuales como un usuario normal, ese usuario necesita ser añadido al grupo libvirt:
# adduser <youruser> libvirt
Entonces debería poder listar sus dominios, es decir, las máquinas virtuales gestionadas por libvirt:
# virsh list --all
Máquinas virtuales específicas del usuario y de todo el sistema
Por defecto, si virsh se ejecuta como un usuario normal se conectará a libvirt usando qemu:///session URI string. Este URI permite a virsh gestionar sólo el conjunto de VMs que pertenecen a este usuario en particular. Para gestionar el conjunto de VMs del sistema (es decir, las VMs que pertenecen a root) virsh debe ejecutarse como root o con qemu:///system URI:
$ virsh --connect qemu:///system list --all
Para evitar tener que usar el flag –connect en cada comando, se puede establecer la cadena URI en la variable de entorno LIBVIRT_DEFAULT_URI:
$ export LIBVIRT_DEFAULT_URI='qemu:///system'
Crear un nuevo huésped
La forma más sencilla de crear y gestionar un huésped VM es utilizando una aplicación GUI. Como por ejemplo:
-
AQEMU aqemu.
-
Gestor de máquinas virtuales virt-manager.
Alternativamente, puede crear un invitado VM a través de la línea de comandos utilizando virtinst. A continuación se muestra un ejemplo que muestra la creación de un huésped Buster con el nombre buster-amd64:
virt-install --virt-type kvm --name buster-amd64 \--cdrom ~/iso/Debian/debian-10.0.0-amd64-netinst.iso \--os-variant debian10 \--disk size=10 --memory 1000
Dado que el huésped no tiene todavía conexión de red, tendrás que usar la GUI virt-viewer para completar la instalación.
Puedes evitar tener que descargar la ISO utilizando la opción –location:
virt-install --virt-type kvm --name buster-amd64 \--location http://deb.debian.org/debian/dists/buster/main/installer-amd64/ \--os-variant debian10 \--disk size=10 --memory 1000
Para usar una consola de texto para la instalación puedes decirle a virt-install que use un puerto serie en lugar de la consola gráfica:
virt-install --virt-type kvm --name buster-amd64 \--location http://deb.debian.org/debian/dists/buster/main/installer-amd64/ \--os-variant debian10 \--disk size=10 --memory 1000 \--graphics none \--console pty,target_type=serial \--extra-args "console=ttyS0"
Para una instalación totalmente automatizada mira en preseed o debootstrap.
Configuración de la red de puentes
Entre los invitados de la VM
Por defecto, QEMU utiliza macvtap en modo VEPA para proporcionar acceso a Internet por NAT o acceso en puente con otros invitados. Esta configuración permite a los invitados acceder a Internet (si hay una conexión a Internet en el host), pero no permitirá que el host u otras máquinas en la LAN del host vean y accedan a los invitados.
Entre el host de la VM y los invitados
Red por defecto de libvirt
Si utiliza libvirt para gestionar sus VMs, libvirt proporciona una red puente NATed llamada «por defecto» que permite al host comunicarse con los invitados. Esta red sólo está disponible para los dominios del sistema (es decir, las máquinas virtuales creadas por el usuario root o utilizando el URI de conexión qemu:///system). Las VMs que utilizan esta red terminan en 192.168.122.1/24 y se les proporciona DHCP a través de dnsmasq. Esta red no se inicia automáticamente. Para iniciarla utiliza:
virsh --connect=qemu:///system net-start default
Para que la red por defecto se inicie automáticamente usa:
virsh --connect=qemu:///system net-autostart default
Para que las cosas funcionen de esta manera necesitas tener instalados los paquetes recomendados dnsmasq-base, bridge-utils e iptables.
Acceder a los huéspedes con sus nombres de host
Después de que la red por defecto esté configurada, puedes configurar el servidor DNS dnsmasq de libvirt, para que puedas acceder a los huéspedes usando sus nombres de host. Esto es útil cuando tienes varios huéspedes y quieres acceder a ellos usando nombres de host simples, como vm1.libvirt en lugar de memorizar sus direcciones IP.
Primero, configure la red por defecto de libvirt. Ejecuta virsh –connect=qemu:///system net-edit default y añade a la configuración la siguiente línea (por ejemplo, después de la etiqueta mac):
<domain name='libvirt' localOnly='yes'/>
libvirt es el nombre del dominio para los invitados. Puede establecerlo a otra cosa, pero asegúrese de no establecerlo a local, porque puede entrar en conflicto con mDNS. Establecer hlocalOnly=’yes’ es importante para asegurarse de que las peticiones a ese dominio nunca se reenvían hacia arriba (para evitar bucles de peticiones).
La configuración de red resultante debería ser algo así:
<network connections='1'> <name>default</name> <uuid>66b33e64-713f-4323-b406-bc636c054af5</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:af:9f:2a'/> <domain name='libvirt' localOnly='yes'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip></network>
Ahora configure los invitados de la VM con sus nombres. Por ejemplo, si quieres nombrar a un invitado ‘vm1’, entra en él y ejecuta:
sudo hostnamectl set-hostname vm1.libvirt
A continuación, configura el NetworkManager del host, para que utilice el servidor DNS de libvirt y resuelva correctamente los nombres de los huéspedes. En primer lugar, indique a NetworkManager que inicie su propia versión de dnsmasq creando un archivo de configuración /etc/NetworkManager/conf.d/libvirt_dns.conf con el siguiente contenido:
dns=dnsmasq
En segundo lugar, indicar al dnsmasq del host que para todas las peticiones DNS relativas al dominio de libvirt se debe consultar la instancia dnsmasq de libvirt. Esto puede hacerse creando un archivo de configuración /etc/NetworkManager/dnsmasq.d/libvirt_dns.conf con el siguiente contenido:
server=/libvirt/192.168.122.1
libvirt aquí es el nombre de dominio que estableció en la configuración de la red por defecto de libvirt. Nota, la dirección IP debe corresponder a la dirección de red por defecto de libvirt. Vea la etiqueta ip en la configuración de la red anterior.
Ahora, reinicia el NetworkManager del host con
sudo systemctl restart NetworkManager
A partir de ahora se puede acceder a los huéspedes usando sus nombres de host, como ssh vm1.libvirt.
Puente manual
Para habilitar las comunicaciones entre el host de la VM y los invitados de la VM, puedes configurar un puente macvlan sobre una interfaz ficticia similar a la de abajo. Después de la configuración, puede establecer usando la interfaz dummy0 (macvtap) en modo puente como la configuración de red en la configuración de los invitados VM.
modprobe dummyip link add dummy0 type dummyip link add link dummy0 macvlan0 type macvlan mode bridgeifconfig dummy0 upifconfig macvlan0 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0 up
Entre el host de la VM, los invitados y el mundo
Para permitir las comunicaciones entre el host, los invitados y el mundo exterior, puede configurar un puente y como se describe en la página de QEMU.
Por ejemplo, puede modificar el archivo de configuración de red /etc/network/interfaces para configurar la interfaz ethernet eth0 a una interfaz de puente br0 similar a la de abajo. Después de la configuración, puede establecer usando la interfaz de puente br0 como la conexión de red en la configuración de invitados VM.
auto loiface lo inet loopback# The primary network interfaceauto eth0#make sure we don't get addresses on our raw deviceiface eth0 inet manualiface eth0 inet6 manual#set up bridge and give it a static ipauto br0iface br0 inet static address 192.168.1.2 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0 dns-nameservers 8.8.8.8#allow autoconf for ipv6iface br0 inet6 auto accept_ra 1
Una vez que esté correctamente configurado, debería ser capaz de utilizar el puente en los nuevos despliegues de VM con:
virt-install --network bridge=br0
Gestión de VMs desde la línea de comandos
Puedes utilizar el comando virsh(1) para iniciar y detener máquinas virtuales. Las VMs pueden ser generadas usando virtinst. Para más detalles vea la página de libvirt. Las máquinas virtuales también pueden ser controladas usando el comando kvm de manera similar a QEMU. A continuación se muestran algunos comandos de uso frecuente:
Iniciar un invitado VM configurado «VMGUEST»:
# virsh start VMGUEST
Notificar al invitado VM «VMGUEST» para que se apague con gracia:
# virsh shutdown VMGUEST
Forzar al invitado VM «VMGUEST» a que se apague en caso de que se cuelgue, es decir, que el graceful shutdown no haya funcionado:
# virsh destroy VMGUEST
Gestión de huéspedes VM con una GUI
Por otro lado, si quieres utilizar una UI gráfica para gestionar las VMs, elige uno de los dos paquetes siguientes:
-
AQEMU aqemu.
-
Administrador de máquinas virtuales virt-manager.
Gestión automática de invitados en el apagado/arranque del host
El comportamiento de los invitados en el apagado/arranque del host se configura en /etc/default/libvirt-guests.
Este archivo especifica si los invitados deben ser apagados o suspendidos, si deben ser reiniciados al iniciar el host, etc.
El primer parámetro define dónde encontrar los huéspedes en ejecución. Por ejemplo:
# URIs to check for running guests# example: URIS='default xen:/// vbox+tcp://host/system lxc:///'URIS=qemu:///system
Ajuste del rendimiento
A continuación se muestran algunas opciones que pueden mejorar el rendimiento de los invitados de la VM.
CPU
- Asignar núcleo de CPU virtual a núcleo de CPU físico dedicado
- Editar la configuración de la VM guest, suponga que el nombre del invitado VM es «VMGUEST» que tiene 4 núcleos de CPU virtuales
# virsh edit VMGUEST
Añadir los siguientes códigos después de la línea «<vcpu …»
<cputune> <vcpupin vcpu='0' cpuset='0'/> <vcpupin vcpu='1' cpuset='4'/> <vcpupin vcpu='2' cpuset='1'/> <vcpupin vcpu='3' cpuset='5'/></cputune>
donde vcpu es el id de núcleo de cpu virtual; cpuset es el id de núcleo de CPU físico asignado. Ajuste el número de líneas de vcpupin para reflejar el recuento de vcpu y cpuset para reflejar la asignación real del núcleo de la cpu física. En general, la mitad más alta del núcleo físico de la CPU son los núcleos de hyperthreading que no pueden proporcionar un rendimiento completo del núcleo mientras que tienen el beneficio de aumentar la tasa de éxito de la caché de memoria. Una regla general para establecer cpuset es:
Para la tercera vcpu y superior, puede que necesite determinar qué núcleo físico de la cpu comparte la caché de memoria más a la primera vcpu como se describe aquí y asignarlo al número de cpuset para aumentar la tasa de éxito de la caché de memoria.
Salida del disco
La salida del disco suele ser un cuello de botella de rendimiento debido a sus características. A diferencia de la CPU y la RAM, un host de VM puede no asignar un hardware de almacenamiento dedicado para una VM. Y lo que es peor, el disco es el componente más lento entre ellos. Hay dos tipos de cuello de botella en el disco: el rendimiento y el tiempo de acceso. Un disco duro moderno puede proporcionar un rendimiento de 100 MB/s, que es suficiente para la mayoría de los sistemas, mientras que sólo puede proporcionar unas 60 transacciones por segundo (tps).
Una forma de mejorar la latencia de E/S del disco es utilizar una pequeña pero rápida unidad de estado sólido (SSD) como caché para discos giratorios tradicionales más grandes pero más lentos. La página del manual de LVM lvmcache(7) describe cómo configurar esto.
Para el Host de la VM, puede hacer un benchmark de diferentes parámetros de E/S del disco para obtener los mejores tps para su disco. A continuación se muestra un ejemplo de ajuste de disco y de benchmarking utilizando fio:
-
# echo mq-deadline > /sys/block/sda/queue/scheduler# echo 1 > /proc/sys/vm/dirty_background_ratio# echo 50 > /proc/sys/vm/dirty_ratio# echo 500 > /proc/sys/vm/dirty_expire_centisecs# /sbin/blockdev --setra 256 /dev/sda# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=/opt/fio.tmp --bs=4k --iodepth=64 --size=8G --readwrite=randrw --rwmixread=75 --runtime=60
Para los huéspedes de la VM de Windows, es posible que desee cambiar entre el controlador IDE incorporado de Windows, lento pero multiplataforma, y el controlador VirtIO, rápido pero específico de KVM. Como resultado, el método de instalación para huéspedes de Windows VM proporcionado a continuación es un poco complicado porque proporciona una manera de instalar ambos controladores y utilizar uno para sus necesidades. Bajo virt-manager:
- Controlador nativo para huéspedes VM de Windows
- Cree un nuevo huésped VM con la siguiente configuración:
- IDE el almacenamiento para el contenedor del SO Windows, asuma con el nombre de archivo WINDOWS.qcow2
- IDE el CDROM, adjunte la ISO del SO Windows al CDROM
- Inicie el huésped VM e instale el SO Windows como de costumbre
- Apague el huésped VM
- Reconfigure el huésped VM con la siguiente configuración:
- Añadir un almacenamiento VirtIO / VirtIO SCSI ficticio con un tamaño de 100MB, por ejemplo DUMMY.qcow2
-
Attach VirtIO driver CD ISO al IDE CDROM
- Reinicie la VM guest
- Instale el VirtIO driver desde el IDE CDROM cuando Windows pida un nuevo hardware driver
- .
- Para VM guest de Windows 10 y superior
- Ejecutar «cmd» como Administrador y ejecutar el siguiente comando
> bcdedit /set {current} safeboot minimal
- Ejecutar «cmd» como Administrador y ejecutar el siguiente comando
- Apagar VM guest
- Reconfigurar VM guest con la siguiente configuración:
- Eliminar el almacenamiento IDE para el SO Windows, NO eliminar WINDOWS.qcow2
- Eliminar el almacenamiento VirtIO para el almacenamiento ficticio, puede eliminar DUMMY.qcow2
- Eliminar el almacenamiento IDE para el CD ROM
- Añadir un nuevo almacenamiento VirtIO / VirtIO SCSI y adjuntar WINDOWS.qcow2 a él
- Reiniciar la VM huésped
- Para VM huésped de Windows 10 y superior
- Entrar en el modo seguro de Windows 10. VM guest y ejecuta el siguiente comando
> bcdedit /deletevalue {current} safeboot
- Reinicia el VM guest
- Entrar en el modo seguro de Windows 10. VM guest y ejecuta el siguiente comando
- Controlador nativo para Linux. Huéspedes de VM
- Seleccione el almacenamiento VirtIO / VirtIO SCSI para los contenedores de almacenamiento
- Reinicie el huésped de VM
- Almacenamiento VirtIO / VirtIO SCSI
- El almacenamiento VirtIO SCSI proporciona características más ricas que el almacenamiento VirtIO cuando el huésped de VM está conectado con almacenamiento múltiple. El rendimiento es el mismo si el invitado de la VM solo estuviera conectado con un único almacenamiento.
- Caché de disco
- Seleccione «Ninguno» para el modo de caché de disco, «Nativo» para el modo IO, «Unmap» para el modo de descarte y el método de detección de ceros.
- Dedicar hilos de E/S
- Especificar el hilo de E/S puede reducir el síntoma de bloqueo durante la E/S del disco significativamente. 1 hilo de E/S es suficiente para la mayoría de los casos:
- Editar la configuración de la VM guest, asumir que el nombre de la VM guest es «VMGUEST»
# virsh edit VMGUEST
-
Después de la primera línea «<dominio …>», añadir la línea «iothreads»:
<iothreads>1</iothreads>
Después de la línea de la controladora de disco, por ejemplo, para la controladora Virtio-SCSI, después de la línea «<controladora type=’scsi’ …>», añade la línea «driver»:
<driver iothread='1'/>
- Cree un nuevo huésped VM con la siguiente configuración:
Red I/O
Usando virt-manager:
- Controlador nativo para huéspedes de VM de Windows
- Seleccione VirtIO para el adaptador de red
-
Attaché la ISO del CD del controlador VirtIO al CDROM IDE
- Reinicie el huésped de la VM, Windows encontró un nuevo hardware de adaptador de red, instale el controlador VirtIO desde el CDROM IDE
- Controlador nativo para huéspedes VM Linux
- Seleccione VirtIO para el adaptador de red.
- Reiniciar el invitado VM
- Soporte de memoria de página enorme
- Calcular los recuentos de página enorme requeridos. Cada página enorme es de 2MB de tamaño, como resultado podemos usar la siguiente fórmula para el cálculo.
Huge Page Counts = Total VM Guest Memory In MB / 2
Por ejemplo, 4 huéspedes VM, cada huésped VM usando 1024MB, entonces el recuento de páginas enormes = 4 x 1024 / 2 = 2048. Tenga en cuenta que el sistema puede ser colgado si la memoria adquirida es más que la del sistema disponible.
- Configure el soporte de memoria HugePages utilizando el siguiente comando. Dado que la memoria enorme podría no asignarse si está demasiado fragmentada, es mejor añadir el código a /etc/rc.local
echo 2048 > /proc/sys/vm/nr_hugepagesmkdir -p /mnt/hugetlbfsmount -t hugetlbfs hugetlbfs /mnt/hugetlbfsmkdir -p /mnt/hugetlbfs/libvirt/binsystemctl restart libvirtd
- Reinicie el sistema para habilitar el soporte de memoria de páginas enormes. Verifique el soporte de memoria de página enorme mediante el siguiente comando.
# cat /proc/meminfo | grep HugePages_HugePages_Total: 2048HugePages_Free: 2048HugePages_Rsvd: 0HugePages_Surp: 0
- Edita la configuración de la VM guest, asume que el nombre de la VM guest es «VMGUEST»
# virsh edit VMGUEST
-
Agrega los siguientes códigos después de la línea «<currentMemory …»
<memoryBacking> <hugepages/></memoryBacking>
- Inicie el huésped VM «VMGUEST» y verifique que está utilizando una memoria de página enorme mediante el siguiente comando.
# virsh start VMGUEST# cat /proc/meminfo | grep HugePages_HugePages_Total: 2048HugePages_Free: 1536HugePages_Rsvd: 0HugePages_Surp: 0
Huge Page Counts = Total VM Guest Memory In MB / 2
- Calcular los recuentos de página enorme requeridos. Cada página enorme es de 2MB de tamaño, como resultado podemos usar la siguiente fórmula para el cálculo.
-
La variable de máquina en la sección <os> debería decir pc, no rhel5.4.0 o similar
-
La entrada del emulador debe apuntar a /usr/bin/kvm, no a /usr/libexec/qemu-kvm
Memoria
Migrando huéspedes a un host Debian
Migrando huéspedes desde RHEL/CentOS 5.x
Hay algunas cosas menores en los archivos de configuración XML de los huéspedes (/etc/libvirt/qemu/*.xml que debe modificar:
En otras palabras, las secciones relevantes deberían ser algo así:
<os> <type arch='x86_64' machine='pc'>hvm</type> --- snip --- <devices> <emulator>/usr/bin/kvm</emulator>
Si había configurado una red puente en el host CentOS, consulte este artículo de la wiki sobre cómo hacerla funcionar en Debian.
Solución de problemas
No hay puente de red disponible
virt-manager utiliza una red virtual para sus huéspedes, por defecto está enrutada a 192.168.122.0/24 y debería verlo escribiendo ip route como root.
Si esta ruta no está presente en la tabla de enrutamiento del kernel entonces los invitados fallarán al conectarse y no podrá completar la creación de un invitado.
Arreglar esto es sencillo, abra el virt-manager y vaya a «Edit» -> «Host details» -> «Virtual networks» tab. Desde ahí puedes crear una red virtual propia o intentar arreglar la que viene por defecto. Normalmente el problema existe cuando la red por defecto no se inicia.
No se puede crear el puente ‘virbr0’: El archivo existe:
Para solucionar este problema puedes eliminar el virbr0 ejecutando:
brctl delbr virbr0
Abrir virt-manager e ir a «Editar» -> «Detalles del host» -> «Redes virtuales» iniciar la red por defecto.
Puede comprobar el estado de la red
virsh net-list --all
Opcionalmente, puede utilizar la red puente BridgeNetworkConnections
Algunos huéspedes de Windows se cuelgan con frecuencia o sufren BSOD
Algunos huéspedes de Windows que utilicen alguna CPU de gama alta de N vías pueden encontrarse con cuelgues frecuentes o BSOD, esto es un error conocido del kernel mientras que desafortunadamente no se soluciona en Jessie (TBC en Stretch). La siguiente solución se puede aplicar añadiendo una sección <hyperv></hyperv> en la configuración del huésped mediante el comando virsh edit GUESTNAME:
<domain ...> ... <features> ... <hyperv> <relaxed state='on'/> </hyperv> </features> ...
Ver también
-
libvirt
-
QEMU
-
https://www.linux-kvm.org/ – Página principal de la máquina virtual basada en el núcleo;
-
https://www.linux-kvm.org/page/HOWTO – Howto’s
-
#kvm – IRC channel
-
https://web.archive.org/web/20080103004709/http://kvm.qumranet.com/kvmwiki/Debian – KVM en Debian Sid (antiguo wiki de KVM)
Puedes encontrar un ejemplo para hacer pruebas. No se puede hacer de forma remota.
Por favor, añade enlaces a documentación externa. Este no es un lugar para enlaces a productos comerciales no libres.
CategoríaAdministración del sistema | CategoríaVirtualización | CategoríaSoftware