Diferencia entre KVM y QEMU

138

He estado leyendo sobre KVMy Qemupor 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 se coordinan estos dos. Me gusta

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

Respuestas:

194

Qemu :

QEmu es un software completo y autónomo propio. Lo usas para emular máquinas, es muy flexible y portátil. Principalmente funciona mediante 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 una Mac PPC 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 donde 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 Linux x86, hay un módulo de kernel llamado KQemu que maneja esto.

Al ser un módulo de núcleo, KQemu puede ejecutar la mayoría de los códigos sin cambios, reemplazando solo las instrucciones de solo nivel0 de nivel más bajo. En ese caso, el espacio de usuario Qemu todavía 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 ha cambiado, pero aún tiene que transformar el código ring0 (la mayoría del código en el núcleo de la VM), por lo que el rendimiento aún se ve afectado.

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 llamada, pero las instrucciones privilegiadas de llamada0 recurren al código del hipervisor. Como se trata de un nuevo modo de ejecución del procesador, el código no tiene que modificarse de ninguna manera.

Además del cambio de 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 PCI.

En segundo lugar, KVM es una bifurcación del ejecutable Qemu. Ambos equipos trabajan activamente para mantener las diferencias al mínimo, y hay avances para reducirlo. Finalmente, el objetivo es que Qemu debería funcionar en cualquier lugar, y si un módulo de kernel KVM está disponible, podría usarse automáticamente. Pero en el futuro previsible, el equipo de Qemu se enfoca en la emulación de hardware y la portabilidad, 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) e interactúa con el resto del código del espacio de usuario.

El ejecutable kvm-qemu funciona como Qemu normal: asigna RAM, carga el código y, en lugar de volver a compilarlo o llamar a KQemu, genera un hilo (esto es importante). El subproceso llama al módulo del kernel KVM para cambiar al modo de invitado y procede a ejecutar el código VM. En una instrucción privilegiada, vuelve 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 posix que puede administrar con herramientas normales de Linux. Si desea una VM 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 la programación, si no, es administrada por el programador normal de Linux, manteniendo el código pequeño y las sorpresas limitadas.

Javier
fuente
3
Y para aquellos que, como yo, no tienen CPU con soporte VT, malas noticias (bueno, si eso podría llamarse «noticias») : KQEMU ya no es compatible con Ubuntu . KVM no funciona con CPU sin ese soporte.
Hola Ángel,
100

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 trabaja solo, QEMU emula tanto la CPU como el hardware.

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

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 hipervisor / emulador.

meisam
fuente