Eu tenho lido sobre KVM
e Qemu
por algum tempo. A partir de agora eu tenho uma compreensão clara do que eles fazem.
O KVM oferece suporte à 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 esses dois se coordenam. Curti
- Quem gerencia o compartilhamento de RAM e/ou memória?
- Quem agenda as operações de E/S?
Qemu :
QEmu é um software completo e autônomo próprio. Você o usa para emular máquinas, é muito flexível e portátil. Principalmente ele funciona por um 'recompilador' especial que transforma o código binário escrito para um determinado processador em outro (digamos, para executar o código MIPS em um PPC mac, ou ARM em um PC x86).
Para emular mais do que apenas o processador, o Qemu inclui uma longa lista de emuladores de periféricos: disco, rede, VGA, PCI, USB, portas seriais/paralelas, etc.
KQemu :
No caso específico em que a fonte e o destino são a mesma arquitetura (como o caso comum de x86 em x86), ainda é necessário analisar o código para remover quaisquer 'instruções privilegiadas' e substituí-las por alternâncias de contexto. Para torná-lo o mais eficiente possível no Linux x86, existe um módulo do kernel chamado KQemu que trata disso.
Sendo um módulo do kernel, o KQemu é capaz de executar a maior parte do código inalterado, substituindo apenas as instruções ring0 de nível mais baixo. Nesse caso, o userspace Qemu ainda aloca toda a RAM para a máquina emulada e carrega o código. A diferença é que ao invés de recompilar o código, ele chama o KQemu para escanear/corrigir/executá-lo. Toda a emulação de hardware periférico é feita no Qemu.
Isso é muito mais rápido do que o Qemu simples porque a maior parte do código permanece inalterada, mas ainda precisa transformar o código ring0 (a maior parte do código no kernel da VM), portanto, o desempenho ainda sofre.
KVM :
KVM é um par de coisas: primeiro é um módulo de kernel Linux - agora incluído na linha principal - que muda o processador para um novo estado 'convidado'. O estado convidado tem seu próprio conjunto de estados de anel, mas as instruções ring0 privilegiadas retornam ao código do hipervisor. Como é um novo modo de execução do processador, o código não precisa ser modificado de forma alguma.
Além da comutação de estado do processador, o módulo do kernel também lida com algumas partes de baixo nível da emulação, como os registradores MMU (usados para lidar com a VM) e algumas partes do hardware emulado PCI.
Em segundo lugar, o KVM é um fork do executável Qemu. Ambas as equipes trabalham ativamente para manter as diferenças no mínimo, e há avanços para reduzi-las. Eventualmente, o objetivo é que o Qemu funcione em qualquer lugar e, se um módulo de kernel KVM estiver disponível, ele poderá ser usado automaticamente. Mas no futuro próximo, a equipe do Qemu se concentra na emulação de hardware e na portabilidade, 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, ele gera uma thread (isso é importante). O encadeamento chama o módulo do kernel KVM para alternar para o modo convidado e prossegue para executar o código da VM. Em uma instrução privilegiada, ele volta para o módulo do kernel KVM, que, se necessário, sinaliza ao thread Qemu para lidar com a maior parte da emulação de hardware.
Uma das coisas boas dessa arquitetura é que o código convidado é emulado em um thread posix que você pode gerenciar com 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 KVM para iniciar a execução. A simultaneidade — se você tiver núcleos reais suficientes — ou agendamento — se não for — é gerenciada pelo agendador normal do Linux, mantendo o código pequeno e as surpresas limitadas.
Ao trabalhar em conjunto, 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 CPU e hardware.
Qemu é um processador que emula software de virtualização com suporte para muitos dispositivos virtuais (como HDD, RAM, som, ethernet, USB, VGA, etc.)
KVM é um módulo do kernel que permite passar por núcleos de CPU via host-passthrough sem virtualizá-los. Também permite passar por dispositivos PCI via módulo de kernel vfio-pci .
Todas essas funcionalidades de passagem são possíveis via IOMMU (unidade de mapeamento de memória de saída de entrada), que mapeia endereços DMA reais para endereços virtualizados, de modo que o acesso direto se torna possível e traz desempenho bare-metal (nativo). O IOMMU é um mecanismo que é parte software no kernel e parte hardware nos chipsets, caracterizado como VT-D (vmx) AMD-VI (svm). SR-IOV é um recurso de chipset que permite dividir um dispositivo PCI em vários dispositivos virtuais sem queda de desempenho por meio de acesso IO direto paralelizado.
Libvirt é uma biblioteca, permitindo que você use python e outras linguagens de programação para configurar máquinas virtuais. Virsh é um kit de ferramentas que funciona no terminal para monitorar e definir as configurações da máquina virtual. Virt-manager é um player VMware como GUI como uma alternativa ao virsh e usa libvirt.
Qemu-img é uma ferramenta cli que cria, converte, captura imagens de disco. O Qemu-nbd também é uma ferramenta CLI que permite acesso bruto de E/S ao disco virtual através da rede via nbd. Virtio é o driver de acesso iommu e o nome do método para discos, NICs (ethernet) e vídeo. Virgil é OpenGL que suporta virtio VGA. Redhat e Fedora tem imagens de CD ROM ISO do driver virtio para Windows e Linux em seus sites.
O OVMF é um firmware de máquina virtual aberto que fornece imagem de inicialização UEFI para máquinas virtuais qemu. Spice é um cliente VNC muito rápido para máquinas virtuais qemu.
Você pode começar a mexer inserindo-os no terminal do Ubuntu ou em qualquer Debian:
A experiência traz clareza sobre as funções dessas terminologias semiconceituais ao introduzir a realização da resposta à pergunta "O que não seria possível sem X ?".