Pregunta Diferencia entre KVM y QEMU


He estado leyendo sobre KVM y Qemu durante algún tiempo. A partir de ahora tengo una clara comprensión de lo que hacen.

KVM admite la virtualización de hardware para proporcionar un rendimiento casi nativo a los sistemas operativos invitados. Por otro lado QEmu emula el sistema operativo de destino.

Lo que estoy confundido es a qué nivel están estas dos coordenadas. Me gusta

  1. ¿Quién gestiona el intercambio de memoria RAM y / o memoria?
  2. ¿Quién programa las operaciones de E / S?

111
2017-12-03 08:42


origen




Respuestas:


Qemu:

QEmu es un software completo y autónomo propio. Lo usas para emular máquinas, es muy flexible y portátil. Principalmente funciona con un 'recompilador' especial que transforma el código binario escrito para un procesador dado en otro (por ejemplo, para ejecutar el código MIPS en un PPC mac o ARM en una PC x86).

Para emular más que solo el procesador, Qemu incluye una larga lista de emuladores periféricos: disco, red, VGA, PCI, USB, puertos serie / paralelo, etc.

KQemu:

En el caso específico en el que tanto el origen como el destino son la misma arquitectura (como el caso común de x86 en x86), todavía tiene que analizar el código para eliminar cualquier "instrucción privilegiada" y reemplazarla con cambios de contexto. Para hacerlo lo más eficiente posible en x86 Linux, hay un módulo del kernel llamado KQemu que maneja esto.

Al ser un módulo del kernel, KQemu puede ejecutar la mayoría de los códigos sin cambios, reemplazando solo las instrucciones de ring0 solo en el nivel más bajo. En ese caso, el espacio de usuario Qemu aún asigna toda la RAM para la máquina emulada y carga el código. La diferencia es que en lugar de volver a compilar el código, llama a KQemu para escanearlo / parcharlo / ejecutarlo. Toda la emulación de hardware periférico se realiza en Qemu.

Esto es mucho más rápido que Qemu simple porque la mayoría del código no se modifica, pero aún tiene que transformar el código ring0 (la mayoría del código en el kernel de la máquina virtual), por lo que el rendimiento sigue sufriendo.

KVM:

KVM es un par de cosas: primero es un módulo de kernel de Linux, ahora incluido en la línea principal, que cambia el procesador a un nuevo estado "invitado". El estado invitado tiene su propio conjunto de estados de timbre, pero las instrucciones privilegiadas de ring0 recurren al código del hipervisor. Dado que es un nuevo modo de ejecución de procesador, el código no tiene que ser modificado de ninguna manera.

Además de la conmutación del estado del procesador, el módulo del kernel también maneja algunas partes de bajo nivel de la emulación, como los registros MMU (utilizados para manejar VM) y algunas partes del hardware emulado de PCI.

Segundo, KVM es una bifurcación del ejecutable Qemu. Ambos equipos trabajan activamente para mantener las diferencias al mínimo, y hay avances en su reducción. Eventualmente, el objetivo es que Qemu funcione en cualquier lugar, y si un módulo de kernel KVM está disponible, podría usarse automáticamente. Pero para el futuro previsible, el equipo de Qemu se enfoca en la emulación y portabilidad del hardware, mientras que la gente de KVM se enfoca en el módulo del kernel (a veces mueve pequeñas partes de la emulación allí, si mejora el rendimiento), y se interconecta con el resto del código de espacio de usuario.

El ejecutable kvm-qemu funciona como un Qemu normal: asigna RAM, carga el código y, en lugar de recompilarlo, o llamar a KQemu, genera un hilo (esto es importante). El hilo llama al módulo del kernel KVM para cambiar al modo invitado y continúa ejecutando el código de la máquina virtual. En una instrucción privilegiada, regresa al módulo del kernel KVM, que, si es necesario, señala al hilo Qemu para manejar la mayor parte de la emulación de hardware.

Una de las cosas buenas de esta arquitectura es que el código de invitado se emula en un subproceso de posix que puede administrar con las herramientas normales de Linux. Si desea una máquina virtual con 2 o 4 núcleos, kvm-qemu crea 2 o 4 subprocesos, cada uno de ellos llama al módulo del kernel KVM para comenzar a ejecutarse. La concurrencia, si tiene suficientes núcleos reales, o programación, si no, es administrada por el programador de Linux normal, manteniendo el código pequeño y las sorpresas limitadas.


153
2017-12-03 14:40



Y para aquellos que, como yo, no tienen CPU con soporte VT, malas noticias (bueno, si eso pudiera llamarse «noticias») - El KQEMU ya no es compatible con Ubuntu. KVM no funciona con CPU sin ese soporte. - Hi-Angel


Cuando trabajan juntos, KVM arbitra el acceso a la CPU y la memoria, y QEMU emula los recursos de hardware (disco duro, video, USB, etc.). Cuando se trabaja solo, QEMU emula tanto la CPU como el hardware.


76
2017-12-03 08:46



La respuesta de @Javier es detallada y debería ser la aceptada, por supuesto, pero su respuesta logró darme en unas pocas frases exactamente lo que necesitaba saber, así que +1 y gracias. - Bill The Ape


QEMU es más lento y KVM está ahí para ayudar a QEMU a lograr una velocidad de hardware muy rápida para proporcionar el mejor rendimiento para el sistema. QEMU es un hipervisor / emulador.


-1
2017-11-14 10:58