KVM
Kernel-based Virtual Machine (KVM)
Last updated
Kernel-based Virtual Machine (KVM)
Last updated
O KVM é um recurso de virtualização padrão do Linux desde o kernel 2.6.20 (2007), fazendo o linux atuar como um VMM tipo 1. Ele reaproveita os recursos do kernel (como o scheduler, gerenciador de memória, stack de rede, e filesystem). Cada máquina virtual é tratada como um processo regular, permitindo o gerenciamento de VMs por ferramentas de gerência de processos tradicionais (como os comandos ps
e kill
).
Ele é usado pelo Google Compute Platform no provisionamento de instâncias do Compute Engine. Também é usado pela AWS no provisionamento de instâncias no EC2 que usam o . Além de ser a base de soluções de virtualização como o Red Hat Virtualization, Proxmox, e Kata Containers.
O KVM é dependente das extensões de virtualização do processador para funcionar. Ele suporta as seguintes arquiteturas:
Intel - a partir da microarquitetura Vanderpool.
AMD - a partir da microarquitetura Pacifica.
ARM - a partir do ARMv7A e ARMv8A.
PowerPC.
S390.
Futuramente em RISC-V.
Caso esteja usando um processador de arquitetura Intel (x86, x86_64), você pode checar se as extensões de virtualização estão habilitadas se tiver alguma ocorrência de vmx
(Intel) ou svm
(AMD) nas flags do seu processador:
Caso esteja usando um processador de arquitetura ARM (aarch64), verifique a versão da arquitetura em uso com:
Com os seguintes comandos é possível verificar se o KVM está instalado no ambiente:
Ele é implementado como um módulo do kernel: o kvm.ko
. E dependendo do processador o KVM pode carregar o kvm_intel.ko
ou o kvm_amd.ko
. Estes módulos suportam parâmetros que podem ser vistos com:
Sozinho o KVM não é nada. Ele precisa de uma aplicação no espaço de usuário gerenciando-o e tratando as operações de I/O. A API do KVM é disponibilizada através de ioctls() sobre o arquivo /dev/kvm
e com a ajuda de memory mappeds.
Todo processo linux pode ser executado em dois contextos: user mode ou kernel mode. O KVM adiciona um terceiro modo: o guest mode.
Como pode ser visto na imagem acima, toda a memória da VM (composta por rotinas em kernel mode e em user mode do SO virtualizado) roda em uma área de memória especial do processo que está representando a VM (um processo do QEMU, por exemplo).
As instruções presentes nessa área de memória são tratadas pelo kernel (em parceria com o KVM) em um modo isolado chamado guest mode (ou modo convidado). As instruções em guest mode são processadas pelo processador usando as extensões de virtualização. E as operações de I/O (e outros eventos que geram VM Exits) são interceptadas pelo driver do KVM e repassadas para o processo que está gerenciando a VM.
Cada core de uma VM é representada por uma vCPU (virtual CPU). Cada vCPU de uma VM é vista como uma thread associada ao processo que a criou (responsável pelas chamadas ioctls e mapeamentos de memória).
Toda operação de I/O gerada por uma vCPU é interceptada pelo KVM e repassada para o processo responsável pela sua criação, cabendo a este processo tratar corretamente estas operações e responder ao KVM.
O principal gerenciador KVM open source largamente usado é o QEMU. Mas soluções proprietárias podem ser usadas, como o da Google, e o da AWS.