Traducción(es): English - Español - 한국어 - Norsk - Русский

(!) ?Discusión


Kernel Based Virtual Machine (KVM)

Introducción

KVM es una solución de virtualización completa para Linux en hardware x86 (incluyendo hardware de 64-bits) que contienen las extensiones de virtualización Intel VT o AMD-V. Se compone de un módulo del kernel que puede ser cargado, kvm.ko, para proveer toda la infraestructura de virtualización base y un módulo específico del procesador, kvm-intel.ko o kvm-amd.ko.

En Debian, Xen es la alternativa a KVM. (?VirtualBox no está en Debian main (Buster) y tampoco en Buster-Backports, 794466).

Instalación

Se puede hacer una instalación mínima con solo QEMU y KVM, pero la mayoría de los usuarios querrán también libvirt para configurar y gestionar convenientemente las máquinas virtuales (libvirt-daemon-system - libvirt, virt-manager - una GUI para libvirt). Para Debian/stretch, jessie-backports, y posteriores:

# apt install qemu-kvm libvirt-clients libvirt-daemon-system

Para jessie y anteriores:

# apt-get install qemu-kvm libvirt-bin

El demonio libvirt-bin se iniciará automáticamente en tiempo de arranque y cargará los módulos kvm apropiados, kvm-amd o kvm-intel, los cuales se incluyen con el paquete del núcleo de Linux de Debian. Si pretendes crear VMs desde línea de órdenes (CLI), instala virtinst.

Para poder gestionar máquinas virtuales como usuario normal, ese usuario necesita ser añadido a ciertos grupos. Para Debian/stretch, jessie-backports, y posteriores:

# adduser <elUsuario> libvirt
# adduser <elUsuario> libvirt-qemu

Para jessie y anteriores:

# adduser <elUsuario> kvm
# adduser <elUsuario> libvirt

Debería ser capaz de listar tus dominios ("domain" es una máquina virtual gestionada por libvirt):

# virsh list --all

Conectar a libvirt como root o usuario normal

Por defecto, si virsh se ejecuta como un usuario normal, se conectará a libvirt usando qemu:///<cadena URI de sesión>. Esta URI permite a virsh gestionar solamente el conjunto de VMs que pertenezcan a ese usuario. Para gestionar el conjunto de VMs del sistema (p. ej: VMs que pertenezcan al root) virsh debe ejecutarse como root o con la URI qemu:///system :

$ virsh --connect qemu:///system list --all

Para no especificar la opción --connect para cada órden, se puede establecer la cadena de la URI en la variable de entorno LIBVIRT_DEFAULT_URI:

$ export LIBVIRT_DEFAULT_URI='qemu:///system'

Crear una nueva invitada

El modo más fácil de crear y gestionar VMs invitadas es usar la aplicación de GUI llamada Gestor de Máquinas Virtuales o Virtual Machine Manager virt-manager.

Como alternativa, puedes crear una VM invitada vía linea de órdenes. Debajo hay un ejemplo para crear una invitada de Squeeze con el nombre squeeze-amd64:

virt-install --virt-type kvm --name squeeze-amd64 --memory 512 --cdrom ~/iso/Debian/cdimage.debian.org_mirror_cdimage_archive_6.0.10_live_amd64_iso_hybrid_debian_live_6.0.10_amd64_gnome_desktop.iso --disk size=4 --os-variant debiansqueeze

Puesto que la invitada aun no tiene conexión de red, necesitarás utilizar la GUI de virt-viewer para completar la instalación.

Puedes evitar sacar a la ISO usando la opción de ubicación --location. Para obtener una consola de texto par ala instalación también puedes proveer argumentos extra con --extra-args "console=ttyS0":

virt-install --virt-type kvm --name squeeze-amd64 \
--location http://deb.debian.org/debian/dists/stable/main/installer-amd64/ \
--extra-args "console=ttyS0" -v --os-variant debiansqueeze \
--disk size=4 --memory 512

Para una instalación completamente automática mira en preseed o debootstrap.

Configurando una red puente

Entre VMs invitadas

Por defecto, QEMU usa macvtap en modo VEPA para proveer acceso a red con NAT o acceso puenteado con otra invitada. Esta configuración permitirá a las invitadas acceder a Internet (si es que hay alguna conexión a internet en la maquina que los alberga), pero no permitirá a dicha albergue ni a otras máquinas en la red LAN de dicha albergue ver ni acceder a las invitadas.

Si estamos trabajando con Lenny, el paquete Debian es 'kvm', pero bajo Squeeze, será 'qemu-kvm'. Refierase al archivo README.Debian.gz en el paquete qemu-kvm para una explicación del cambio de nombre.

Entre albergue de VMs y VMs invitadas

Red por defecto Libvirt

Si utilizas libvirt para gestionar tus VMs, libvirt proporciona una red puenteada NAT llamada "default" que permite a la albergue comunicarse con las invitadas. Esta red está disponible solamente para los dominios de sistema (Esto es, las VMs creadas por root o que usen la URI de conexión qemu:///system ). Las VMs que usan esta red acaban en 192.168.122.1/24 y se le s proporciona DHCP vía dnsmasq. Esta red no se inicia automáticamente. Para arrancarla usa:

 virsh --connect=qemu:///system net-start default

Para hacer que la red por defecto arranque automáticamente usa:

 virsh --connect=qemu:///system net-autostart default

Para que las cosas funcionen de este modo necesitas tener instalados estos paquetes recomendados dnsmasq-base, bridge-utils and iptables.

Puenteo manual

Para permitir comunicaciones entre albergue de VMs y VMs invitadas, puedes establecer un puente macvlan sobre una interfaz simple similar a la de aquí. Después de la configuración, puedes establecer usando la interfaz dummy0 (macvtap) en modo puente como la configuración de la red en la configuración de VMs invitadas.

modprobe dummy
ip link add dummy0 type dummy
ip link add link dummy0 macvlan0 type macvlan mode bridge
ifconfig dummy0 up
ifconfig macvlan0 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0 up

Entre albergue de VMs, VMs invitadas y el mundo

Para permitir comunicaciones entre la albergue, invitadas y el mundo exterior, puedes ?configurar un puente y como se describe en la página de QEMU.

Por ejemplo, puedes modificar el fichero de la configuración de la red /etc/network/interfaces para establecer una interfaz de ethernet eth0 para una interfaz de puente br0 similar a la de abajo. Tras la configuración, puedes utilizar la interfaz Bridge Interface br0 como la configuración de conexión de red en VMs invitadas.

auto lo0
iface lo inet loopback

# La interfaz de red primaria
auto eth0

#Asegúrate de que no tenemos direcciones en nuestro dispositivo inicial
iface eth0 inet manual
iface eth0 inet6 manual

#Establece el puente y dale una ip estática
auto br0
iface 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

#permite autoconfiguración para ipv6
iface br0 inet6 auto
        accept_ra 1

Una vez correctamente configurada, deberías ser capaz de usar el puente en nuevos despliegues de VMs con:

virt-install --network bridge=br0 [...]

Gestionar VMs desde la línea de órdenes (CLI)

Puedes usar la orden virsh(1) para iniciar y parar máquinas virtuales. Las VMs se pueden generar usando virtinst. Para mayor detalle mira la página de libvirt. Las VMs se pueden controlar usando la orden kvm de modo similar a ?QEMU. Debajo hay algunas órdenes frecuentemente usadas:

Arrancar una VM invitada configurada "VMGUEST":

# virsh start VMGUEST

Notificar a la VM invitada "VMGUEST" que se apague grácilmente:

# virsh shutdown VMGUEST

Forzar a la VM invitada "VMGUEST" a que se apague como sea, en caso de que esté colgada, p.ej: el apagado grácil no funciona:

# virsh destroy VMGUEST

Gestionar VMs invitadas con una GUI

Por otro lado, si quieres usar una interfaz gráfica de usuario GUI para gestionar las VMs, puedes usar el Gestor de Máquinas Virtuales virt-manager.

Gestión de VMs invitadas automática al inicio y paro de la albergue de VMs

El comportamiento de las invitadas al iniciarse o apagarse la albergue se configura en el fichero /etc/default/libvirt-guests.

Este fichero especifica si las invitadas deberían apagarse o suspenderse, si deberían ser reiniciadas al arrancar la albergue, etc.

El primer parámetro define donde encontrar las invitadas en funcionamiento. Por ejemplo:

# URIs para comprobar invitadas en ejecución
# ejemplo: URIS='default xen:/// vbox+tcp://host/system lxc:///'
URIS=qemu:///system

Afinación de desempeño

Abajo hay opciones que pueden mejorar el desempeño de las VMs invitadas.

CPU

E/S de disco

E/S de disco es normalmente el cuello de botella de desempeño debido a sus características. A diiferencia de la CPU y la RAM, la albergue de VMs puede que no reserve un hardware de almacenamiento dedicado para una VM. Peor aún, el disco es el componente mas lento de todos. Hay dos tipos de cuellos de botella: rendimiento y tiempo de acceso. Un disco moderno puede desempeñar con un rendimiento de 100MB/s el cuel es suficiente para la mayoría de los sistemas. Mientras que ese disco moderno tan solo provee unas 60 transacciones por segundo (tps).

Un modo de mejorar la latencia de E/S es usar un pequeño pero rápido dispositivo de estado solido (SSD) como cahce para discos rotatorios tradicionales mayores. La pagina del manual de LVM lvmcache(7) describe como configurarlo así.

Para la albergue de VMs, puedes comporbar diferentes parámetros de E/S de disco para obtener los mejores tps para tu disco. Abajo hay un ejemplo de afinación de disco y benchmarking usando fio:

para VMs invitadas tipo Windows, puede que desees cambiar entre el lento pero multi-plataforma controlador IDE ya-incluido de Windows o el rápido controlador KVM pero específico VirtIO driver. Como resultado, el método de instalación para VMs invitadas tipo windows porporcionado abajo es un poco complicado mientras que te proporciona un modo de instalar ambos controladores y usar uno para tus necesidades. Bajo virt-manager:

E/S de red

Usando virt-manager:

Memoria

Migrar invitadas a un albergue Debian

Migrar invitadas desde RHEL/CentOS 5.x

Hay unos detalles menores en los ficheros XML de configuración de invitadas (/etc/libvirt/qemu/*.xml que necesitas modificar:

En otras palabras, las secciones relevantes deberían parecense a esto:

  <os>
    <type arch='x86_64' machine='pc'>hvm</type>

  --- recortado ---

  <devices>
    <emulator>/usr/bin/kvm</emulator>

Si tenías configurada una red puenteada en el albergue CentOS, por favor mira el ?artículo wiki sobre cómo hacer que funcione en Debian.

Solución de problemas

No hay puente de red disponible

virt-manager usa una red virtualpara sus invitadas, por defecto esta encaminada a 192.168.122.0/24 y tu deberías ver esto al escribir ip route como root.

Si esta ruta no esta presente en la tabla de enrutamiento del kernel entonces las invitadas fallaran al conectar y no serás capaz de completar la creacioin de invitadas.

Arreglarlo es sencillo, abre virt-manager y ve a editar "Edit" -> detalles de invitada "Host details" -> pestaña de redes virtuales "Virtual networks". Desde ahi puedes crear una red virtual propia o puedes intentar arreglar la que hay por defecto. Normalmente el problema consiste en que no se ha iniciado la red por defecto.

no se puede crear un puente 'virbr0': Existe el fichero:

Para resolver este problema puedes eliminart la virbr0 ejecutando esto:

brctl delbr virbr0

Abre virt-manager y vea a editar "Edit" -> detalles del Albergue "Host details" -> redes virtuales "Virtual networks" arranca la red por defecto.

Puedes comprobrar tu estado de red

virsh net-list --all

Opcionalmente, puedes usar una red puente BridgeNetworkConnections

La invitada Windows se cuelga frecuentemente o hace BSOD

Algunos invitadas Windows usando cuertas CPU ultimo modelo de N-hilos pueden colgarse con asiduidad o dar BSOD, eso es un fallo conocido de kernel mientras no se arregle en Jessie (TBC en Stretch). La solucion que verás abajo se puede aplicar añadiendo una sección <hyperv>...</hyperv> en la configuración de la invitada vía la orden virsh edit GUESTNAME:

<domain ...>
  ...
  <features>
    ...
    <hyperv>
      <relaxed state='on'/>
    </hyperv>
  </features>
  ...

Véase tambien

Puedes encontrar un ejemplo par aprobar. No puedes hacerlo remotamente.

Enlaces externos

Porfavor, añadid enlaces a documentaciones externas. Esto no es un lugar para enlaces a productos no libres comerciales.


CategorySystemAdministration