Introdução


O que é virtualização?

Virtualização é a simulação de um ambiente ou plataforma sobre um nó hóspede. Ao fazer isso, cria-se uma máquina virtual que emula o comportamento de uma máquina real, e sobre a qual um sistema operacional qualquer pode ser instalado. O sistema operacional então passa a funcionar sem conhecimento de que está operando sobre uma camada de software, e não hardware. A máquina que provê a virtualização é chamada de host, e a virtualizada, de guest.

Apesar de a tecnologia de virtualização existir há muito tempo, ela vem ganhando mais atenção na última década, devido à avanços tecnológicos que a tornam uma prática mais útil e eficaz. Por exemplo, a expansão na capacidade de processamento e armazenamento de servidores, permite que a virtualização seja executada em praticamente qualquer hardware disponível. Além disso, permite a melhor utilização de recursos, que seriam, de outra forma, desperdiçados. Por exemplo, a virtualização permite que se economize espaço e energia em Data Centers, pois uma única máquina pode hospedar diversos servidores virtuais que normalmente precisariam de suas próprias máquinas físicas.

Existem dois principais tipos de virtualização: de processos e de sistemas. A virtualização de processos executa uma aplicação, a máquina é criada no início da execução e terminada ao seu fim. Ela serve principalmente para poder executar programas independente da plataforma, como, por exemplo, executar uma aplicação Windows em um ambiente Linux. Já a virtualização de sistemas recria um ambiente completo. Esse tipo de virtualização geralmente funciona dividindo um único servidor físico em partes independentes, e funciona através de um hipervisor.

Um hipervisor, também chamado de monitor de máquinas virtuais (VMM) é um software, hardware ou firmware que cria e administra máquinas virtuais. Ele também é responsável por manejar e alocar dinamicamente recursos do sistema, como memória e processamento, de acordo com a necessidade de cada sistema virtual. Hipervisores podem ser de tipo 1, ou native, ou de tipo 2, ou hosted. Hipervisores de tipo 1 rodam diretamente em cima do próprio hardware, enquanto que os de tipo 2 rodam em cima do sistema operacional do host.

Kernel-based virtual machines (KVM) é uma forma de virtualização que usa o próprio Kernel do Linux como hipervisor. Vêm ganhando atenção na última década por sua simplicidade e boa performance. Sendo um tipo de virtualização assistida por hardware, ou seja, uma forma de virtualização com acesso direto aos recursos do hardware, ela diminui consideravelmente o overhead, se comparado com infraestruturas mais antigas, que rodavam a nível de software.


Histórico

KVM foi anunciada ao mundo pela primeira vez em 19 de Outubro de 2006, por seu craidor Avi Kivity, um desenvolvedor de software israelense, na época trabalhando para a Qumranet. Na época, o mais popular hipervisor open-source era o Xen. Entretanto, o Xen foi lançado em uma época em que arquiteturas de hardware não proviam suporte para virtualização, o que significa que seu design foi projetado para funcionar sem a assistência do hardware. Kivity trabalhava para a Qumranet em um momento em que a empresa encontrou vários problemas por causa das limitações do Xen. Com as recém-implementadas extensões para virtualização nos processadores AMD e Intel, Kivity começou a desenvolver uma alternativa de virtualização que tirasse vantagem dessas extensões.

Um dos principais objetivos do projeto KVM era o aproveitamento da maior parte de recursos existentes possível. Ao usar o próprio kernel do Linux como o hipervisor, isso conferiu ao KVM a dupla vantagem de poder delegar tantas funcionalidades quanto possível para o Linux em si, e automaticamente poder aproveitar qualquer nova funcionalidade que fosse adicionada ao sistema. Por isso, KVM se tornou uma infraestrutura versátil, como também leve.

Com todas essas vantagens, não foi difícil para Kivity colocar KVM no kernel do Linux e quando submeteu sua ideia, seu código foi fácilmente aceito, com KVM sendo oficialmente lançado como parte da nova versão do kernel de Linux em Fevereiro de 2007. A partir daí, interesse de desenvolvedores veio naturalmente. Devido à diversas funcionalidades do KVM, hacking e debugging eram extremamente simples, o que facilitou muito o processo de estabilização e melhoria do programa.

Com o crescente interesse pelo KVM, vários grandes nomes da indústria também passaram a repensar sues negócios com KVM em mente. A IBM, a Intel, a ARM e a Linaro, entre outras, contribuiram com suporte e compatibilidade entre o KVM e diferentes arquiteturas. No mesmo ano em que KVM foi implementado pela primeira vez, ocorreu o primeiro Fórum KVM, uma conferência anual de desenvolvedores interessados em virtualização KVM, e onde são discutidas questões sobre o presente e o futuro da KVM. Em sua primeira edição, o Fórum era somente um punhado de desenvolvedores em uma sala com um quadro branco, hoje, meros dez anos depois, os Fórum são conferências enormes, com centenas de participantes.

Em setembro de 2008, a Qumranet foi adquirida pela empresa Red Hat. A Red Hat, que aé então usava Xen como seu hipervisor oficial, passou a suportar tanto Xen quanto KVM até 2010, quando passou a usar somente KVM. KVM continua sendo uma infraestrutura de virtualização popular até hoje, uma década depois de seu lançamento. Desenvolvedores continuam a trabalhar no código, tanto para mantê-lo compatível com novos lançamentos de hardware, quanto para melhorar o código já existente, com novos algoritmos e novas formas de otimizar performance.


Como funciona

KVM é um módulo do kernel do Linux desde a versão 2.6.20. Ele também utiliza as extensões de virtualização dos processadores Intel-VT e AMD-v. Usando o Intel como exemplo, essas extensões são principalmente uma função que muda o processamento para o hipervisor quando uma "instrução sensível" é detectada. Instruções sensíveis são instruções privilegiadas que dão controle sobre a alocação de recursos do hardware. Se uma dessas instruções for executada por ou em uma máquina virtual sem intervenção, elas podem causar sérios problemas ao sistema. Por isso, é necessário que a CPU passe controle da execução da instrução para o hipervisor quando uma instrução sensível é detectada. Entretanto, CPUs x86 não foram feitas com virtualização em mente, então não conseguem detectar algumas instruções sensíveis.

Para consertar esse problema, a Intel criou o Intel-VT. O que esse processador faz é criar dois modos de execução: virtual machine extension (VMX) root operation e non-root operation. Esse último é o modo de execução das máquinas virtuais, enquanto que o primeiro é o modo de execução do hipervisor. Quando uma instrução sensível é feita enquando em VMX non-root operation mode a CPU detecta a operação e troca de modo de execução, transferindo o controle para o hipervisor. A transição entre os dois modos de execução é manejada pelo KVM.

O KVM, por si só, não é capaz de criar uma máquina virtual. Para isso, ele utiliza o QEMU, um software de emulação anterior e independente do KVM. Porém, por trabalhar a nível de software, a performance do QEMU é lenta e limitada. O relacionamento entre o KVM e o QEMU funciona desta forma: Primeiro, o kernel cria um arquivo /dev/kvm que permite ao QEMU fazer pedidos ao hipervisor. Quando chega a hora de executar uma máquina virtual, o QEMU faz um pedido ao hipervisor instruíndo-o a criar uma. O KVM então, troca para o modo de execução VMX non-root operation, provido pelo processador Intel-VT. Quando uma instrução sensível é detectada, o KVM faz a transição de volta e, se necessário transfere controle para o QEMU para que este execute alguma tarefa. Quando a tarefa termina, o QEMU mais uma vez faz para o hipervisor um pedido para que o processo continue.

O QEMU, de certa forma, funciona como uma CPU virtual para a máquina virtual. Para cada máquina, existe um processo QEMU correspondente, e para cada "CPU" de uma máquina virtual, existe uma thread no processo QEMU correspondente. Do ponto de vista do kernel do Linux, threads de processos QEMU são tratados como processos de usuário comuns. O escalonamento de uma CPU virtual (thread de QEMU) é feito da mesma forma que de outros processos quaisquer.


Como usar


Funcionalidades


Comparação com outras formas de virtualização

Algumas das maiores vantagens do KVM também se tornam fatores limitantes em seu uso. KVM é parte do kernel do Linux, o que traz ao KVM muitos benefícios, incluindo aproveitamento de qulaquer update feito ao kernel e torná-lo muito mais open source que outras formas de virtualização, mas também significa que o KVM só pode ser usado por um host Linux. Similarmente, KVM é uma forma de virtualização assistida por hardware, o que significa que ele só pode ser usado por máquinas que possuam certas extensões de suporte à virtualização, como Intel VT e AMD-v.

Outra vantagem do KVM em comparação com outras tecnologias, é sua leveza e relativa simplicidade (apenas cerca de dez mil linhas de código), especialmente com relação a outros grandes nomes, como o VMware e o Xen. O Xen, por exemplo, precisa agir como seu próprio kernel, com seu próprio gerenciador de memória, inicializador de máquina, entres outros, e só requer que o Linux execute I/O. Porém, como o KVM é um módulo do kernel do Linux, e aproveita todas as funcionalidades já presentes nele. Assim, o KVM pode focar exclusivamente na virtualização, se baseando no kernel, ao invés de substituindo-o.

Em termos técnicos, o Xen é um hipervisor superior ao KVM. Ele é muito mais antigo, e teve muito mais tempo para otimizar performance, porém, esse intervalo vêm sido fechado rapidamente. Além disso, o KVM tem a vantagem de ter suporte oferecido como parte padrão do kernel Linux. Suporte para Xen, por outro lado, requer um número considerável de patches alguns dos quais não são disponíveis em todas as versões do kernel.

Além do Xen, um dos maiores competidores do KVM no ramo é o VMware, que por muitos anos, foi líder de mercado. A primeira grande diferença que é imediatamente notada quando se compara KVM com VMware é o custo. KVM é open source, enquanto que VMware é um produto pago, o que é o principal fator para que o KVM tenha, em média, um custo 39% menor. Além disso, o VMware é um código robusto, que nunca foi compleetamente reescrito desde sua origem. Por não ser livremente disponível, não se pode confirmar seu tamanho, mas acredita-se que o programa consista de cerca seis milhões de linhas de código, em comparação com as dez mil do KVM.

KVM também tem a desvantagem de ser menos user-friendly que outras tecnologias, como o VMware. Ele é, primariemente, uma ferramenta de linha de comando, e não tenha uma GUI tão intuitiva como o VMware, o que o torna menos recomendável para usuários casuais ou iniciantes de virtualização, especialmente se não tiverem as extensões de virtualização requeridas pelo KVM. Entretando, sua disponibilidade como módulo padraão do Linux, integração com o kernel, leveza e simplicidade de programa e baixo custo, tornam o KVM a princiapl escolha entre profissionais.


Conclusão


Perguntas

1. Por que o KVM é tão leve comparado com outras tecnologias, como Xen e VMware?

Resposta: Porque o KVM se aproveita o máximo possível das funcionalidades existentes no kernel do Linux e das extensões de virtualização presentes no hardware. O Xen e o VMware, que existiam antes de tais extensões estarem disponíveis, e que não são integrados com o kernel, precisam de código próprio para implementar funcionalidades que o KVM pode simplesmente delegar a outras partes do sistema.

2. O KVM é um hipervisor Tipo 1 ou Tipo 2?

Resposta: Não há uma resposta definitiva, de fato, existe um grande debate sobre isso. Oficialmente, é tipo 1, pois o kernel do Linux é transformado em um hipervisor que roda diretamente no hardware. Por outro lado, alguns defendem que o KVM é tipo dois, pois, por ser parte do sistema operacional do Linux, ele precisa da presença do sistema operacional.

KVM funciona em qualquer máquina?

Resposta: Não. O KVM requer um hardware x86 rodando uma versão recente do kernel do Linux e com um processador Intel-VT ou AMD-v. Porém existe uma versão experimental do KVM em desenvolvimento para Windows.


Bibliografia

HERTZOG, Raphael; MAS, Roland. Manual do Administrador Debian: Debian Jessie, da descoberta à maestria, 2013.

LI, Cong. Kernel-based Virtual Machine: Bachelor's thesis on information Technology. South-Eastern Finland University of Applied Sciences, 2017.

LEITÃO, Breno et al. Virtualização com KVM no Linux, 2014. Em: https://www.ibm.com/developerworks/br/local/linux/instalandokvmnolinux/index.html

VETTATHU, Anil; CHIRAMMAL, Humble Devassy; MUKHEDKAR, Prasad. Mastering KVM Virtualization, 2016.

VON HAGEN, William. Using KVM Virtualization, 2014. Em https://www.ibm.com/developerworks/library/l-using-kvm/index.html

HESS, Kenneth; NEWMAN, Amy. Practical Virtualization Solutions: Virtualization from the Trenches, 2009.

HABIB, Irfan. Virtualization with KVM. Linux Journal nº166, Fevereiro 2008.

GOTO, Yasunori. Kernel-based Virtual Machine Technology. Fujitsu Scientific and Technical Journal, vol. 47, nº3, pp. 362-368, Julho 2011.

Welcome to KVM Virtualization, 4 de Maio de 2014. Em: http://www.dedoimedo.com/computers/kvm-intro.html

Kernel Virtual Machine (KVM) Best practices for KVM. IBM Knowledge Center, 2012.

SHAH, Amit. Ten Years of KVM. Novembro de 2016. Em: https://lwn.net/Articles/705160/

ANNE, Surendra. What is KVM virtualization in Linux? Fevereiro de 2013. Em: http://www.linuxnix.com/what-is-kvm-virtualization-in-linux/