🐧
linux-virtualization-tools
  • Virtualização com ferramentas Open Source
    • KVM
      • Exemplo de uso da API do KVM
    • QEMU
Powered by GitBook
On this page
  • Processadores suportados
  • Verificando se o KVM está instalado
  • Gerenciadores KVM
  • Guest mode
  • Operações de I/O e vCPUs
  • Referências
  1. Virtualização com ferramentas Open Source

KVM

Kernel-based Virtual Machine (KVM)

PreviousVirtualização com ferramentas Open SourceNextExemplo de uso da API do KVM

Last updated 1 year ago

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.

Processadores suportados

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.

Verificando se o KVM está instalado

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:

$ grep -E 'vmx|svm' /proc/cpuinfo

Caso seu processador tenha suporte as extensões de virtualização mas a flag não está aparecendo no /proc/cpuinfo, ative o suporte a virtualização na BIOS.

Caso esteja usando um processador de arquitetura ARM (aarch64), verifique a versão da arquitetura em uso com:

$ lscpu | grep "Model name"

As extensões de virtualização foram adicionadas a partir da versão Cortex-A15 (ARMv7A). Se a saída do comando lscpu for algo superior a Cortex-A15 (i.e. Cortex-A53), então o KVM poderá ser usado neste equipamento.

Com os seguintes comandos é possível verificar se o KVM está instalado no ambiente:

$ ls -l /dev/kvm
$ kvm-ok
$ lsmod | grep kvm
$ grep CONFIG_KVM /boot/config-$(uname -r)
$ ls -l /lib/modules/$(uname -r)/kernel/arch/x86/kvm/kvm* # somente em arch Intel

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:

$ modinfo kvm
$ modinfo kvm_intel
$ modinfo kvm_amd

Gerenciadores KVM

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.

Guest mode

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.

Operações de I/O e vCPUs

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.

Referências

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.

As instruções de uma VM são processadas em um modo especial que o KVM adiciona ao kernel: o guest mode.

VENOM
Nitro Hypervisor
https://linux-kvm.org/page/Main_Page
https://www.linuxjournal.com/article/10251
http://www.linux-kongress.org/2010/slides/KVM-Architecture-LK2010.pdf
Nitro System
Exemplos de tecnologias que usam KVM.
Checando se o KVM está instalado no ambiente.
Estrutura genérica de código em C que provisiona uma VM se comunicando com a API do KVM via /dev/kvm usando a chamada de sistema ioctl(), e tratando os diferentes eventos de "VM Exits" em uma estrutura switch-case.
Cada vCPU é na prática uma thread do Linux.
Exemplo de uma VM QEMU com 1 vCPU (3 threads: uma é a thread main, outra é uma thread dedicada para tratamento de I/O, e outra thread representa a vCPU da VM). Se a VM tivesse 2 vCPUs teria 4 threads. Se tivesse 3 vCPUs, 5 threads. 4 vCPUs, 6 threads. E assim por diante. No fim, o processamento das vCPUs da VM irá contar com a ajuda do scheduler do Linux.