Diferença entre KVM e QEMU

138

Eu tenho lido sobre KVMe Qemupor algum tempo. A partir de agora, tenho uma compreensão clara do que eles fazem.

O KVM suporta a virtualização de hardware para fornecer desempenho quase nativo aos sistemas operacionais convidados. Por outro lado, o QEmu emula o sistema operacional de destino.

O que estou confuso é em que nível essas duas coordenadas. Gostar

  1. Quem gerencia o compartilhamento de RAM e / ou memória?
  2. Quem agenda as operações de E / S?
Abhishek Gupta
fonte

Respostas:

194

Qemu :

QEmu é um software completo e independente por si só. Você o usa para emular máquinas, é muito flexível e portátil. Principalmente, funciona por um 'recompilador' especial que transforma o código binário escrito para um determinado processador em outro (por exemplo, para executar o código MIPS em um Mac PPC ou o ARM em um PC x86).

Para emular mais do que apenas o processador, o Qemu inclui uma longa lista de emuladores periféricos: disco, rede, VGA, PCI, USB, portas seriais / paralelas, etc.

KQemu :

No caso específico em que a origem e o destino são a mesma arquitetura (como o caso comum de x86 em x86), ele ainda precisa analisar o código para remover quaisquer 'instruções privilegiadas' e substituí-las por opções de contexto. Para torná-lo o mais eficiente possível no Linux x86, existe um módulo do kernel chamado KQemu que lida com isso.

Sendo um módulo do kernel, o KQemu é capaz de executar a maioria dos códigos inalterados, substituindo apenas as instruções de anel0 de nível mais baixo. Nesse caso, o espaço do usuário Qemu ainda aloca toda a RAM da máquina emulada e carrega o código. A diferença é que, em vez de recompilar o código, ele chama o KQemu para fazer a varredura / correção / execução. Toda a emulação de hardware periférico é feita no Qemu.

Isso é muito mais rápido que o Qemu comum, porque a maioria dos códigos não é alterada, mas ainda precisa transformar o código ring0 (a maior parte do código no kernel da VM), portanto o desempenho ainda sofre.

KVM :

O KVM é um par de coisas: primeiro, é um módulo do kernel Linux - agora incluído na linha principal - que muda o processador para um novo estado de 'convidado'. O estado convidado possui seu próprio conjunto de estados de toque, mas as instruções privilegiadas de ring0 retornam ao código do hypervisor. Como é um novo modo de execução do processador, o código não precisa ser modificado de forma alguma.

Além da alternância do estado do processador, o módulo do kernel também lida com algumas partes de baixo nível da emulação, como os registros MMU (usados ​​para lidar com a VM) e algumas partes do hardware emulado PCI.

Segundo, o KVM é uma bifurcação do executável do Qemu. Ambas as equipes trabalham ativamente para manter as diferenças no mínimo, e há avanços na redução. Eventualmente, o objetivo é que o Qemu funcione em qualquer lugar e, se um módulo de kernel do KVM estiver disponível, ele poderá ser usado automaticamente. Mas, no futuro próximo, a equipe do Qemu se concentra na emulação e portabilidade de hardware, enquanto o pessoal do KVM se concentra no módulo do kernel (às vezes movendo pequenas partes da emulação para lá, se melhorar o desempenho) e na interface com o restante do código do espaço do usuário.

O executável kvm-qemu funciona como o Qemu normal: aloca RAM, carrega o código e, em vez de recompilá-lo ou chamar o KQemu, gera um encadeamento (isso é importante). O encadeamento chama o módulo do kernel do KVM para alternar para o modo convidado e continua a executar o código da VM. Em uma instrução privilegiada, ele retorna ao módulo do kernel do KVM, que, se necessário, sinaliza o thread do Qemu para lidar com a maior parte da emulação de hardware.

Uma das coisas boas dessa arquitetura é que o código de convidado é emulado em um encadeamento posix que você pode gerenciar com as ferramentas normais do Linux. Se você deseja uma VM com 2 ou 4 núcleos, o kvm-qemu cria 2 ou 4 threads, cada um deles chama o módulo do kernel do KVM para iniciar a execução. A concorrência - se você tiver núcleos reais suficientes - ou agendamento - se não - é gerenciada pelo agendador normal do Linux, mantendo o código pequeno e as surpresas limitadas.

Javier
fonte
3
E para aqueles que, como eu, não têm CPU com suporte a VT, más notícias (bem, se isso poderia ser chamado de "notícias") - o KQEMU não é mais suportado no Ubuntu . O KVM não funciona com a CPU sem esse suporte.
Hi-Angel
100

Ao trabalhar juntos, o KVM arbitra o acesso à CPU e à memória, e o QEMU emula os recursos de hardware (disco rígido, vídeo, USB, etc.). Ao trabalhar sozinho, o QEMU emula a CPU e o hardware.

Ignacio Vazquez-Abrams
fonte
9
A resposta de @ Javier é detalhada e deve ser a aceita, é claro, mas sua resposta conseguiu me fornecer em poucas frases exatamente o que eu precisava saber, então +1 e obrigado.
Bill The Ape
-2

O QEMU é mais lento e o KVM está lá para ajudar o QEMU a alcançar uma velocidade de hardware muito rápida para fornecer o melhor desempenho para o sistema. QEMU é hypervisor / emulador.

meisam
fonte