Conteúdo


Descubra a Máquina Virtual do Kernel Linux

Conheça a Arquitetura e Vantagens da KVM

Comments

Virtualização é um conceito que surgiu há algum tempo. Resumidamente, é o processo no qual se obtém algo e o faz parecer outra coisa diferente. Aplicar esse conceito a um sistema de computador permite que usuários diferentes visualizem esse sistema único de modo diferente (por exemplo, um único computador que executa o Linux e o Microsoft® Windows® simultaneamente). Isso geralmente é chamado de virtualização completa.

A virtualização também pode ter uma forma mais complexa, na qual um único computador aparece como várias arquiteturas (para um usuário, é uma plataforma x86 padrão; para outros, é uma plataforma IBM Power PC®). Essa forma de virtualização geralmente é conhecida como emulação de hardware.

Por fim, uma forma simples de virtualização é a virtualização do sistema operacional, na qual um único computador executa vários sistemas operacionais do mesmo tipo. Esse tipo de virtualização simplesmente isola vários servidores em um único sistema operacional (o que significa que todos eles devem usar o mesmo tipo e versão de sistema operacional). Para informações adicionais sobre os métodos de virtualização, consulte Recursos.

Virtualização e Para-virtualização

Duas das abordagens mais comuns para virtualização são virtualização completa e para-virtualização. Na virtualização completa, existe uma camada entre os sistemas operacionais virtualizados e o hardware como forma de acesso arbitrário. Essa camada é chamada de hypervisor, ou monitor de máquina virtual (VMM). A para-virtualização é semelhante, mas o hypervisor opera de modo mais cooperativo. Isso ocorre porque cada sistema operacional guest sabe que está sendo virtualizado e, assim, coopera com o hypervisor para virtualizar o hardware subjacente.

Exemplos de virtualização completa incluem o VMware de solução de virtualização comercial, bem como o sistema operacional IBM System z9 Virtual Machine (z/VM) comercial para computadores IBM zSeries®. A para-virtualização é fornecida pelo Xen e pelo User-Mode-Linux (UML). A KVM também é considerada uma solução de virtualização completa, mas isso será visto depois.

Como Funciona a Virtualização

Começaremos com uma rápida discussão sobre a virtualização e os elementos envolvidos. No final de uma solução de virtualização há a máquina a ser virtualizada. Essa máquina pode ou não oferecer suporte diretamente à virtualização, que então requer suporte pela próxima camada, chamada de hypervisor. O hypervisor, ou VMM, atua como uma abstração entre o hardware da plataforma e os sistemas operacionais. Em alguns casos, o hypervisor é um sistema operacional; neste caso, ele é chamado de sistema operacional do host, como mostrado na Figura 1.

Figura 1. A Abstração em Camadas de uma Virtualização
A Abstração em Camadas de uma Virtualização

Acima do hypervisor estão os sistemas operacionais, também chamados de máquinas virtuais (VMs). Essas VMs são os sistemas operacionais isolados que visualizam a plataforma de hardware subjacente como pertencente a eles. Mas, na realidade, isso não acontece no hypervisor.

Um problema atual com as soluções de virtualização é que nem todos os hardwares suportam, de forma clara, a virtualização. Processadores x86 mais antigos produzem resultados diferentes para determinadas instruções, dependendo do domínio de execução. Isso cria um problema, pois o hypervisor deve ser executado apenas no domínio mais protegido. Por este motivo, as soluções de virtualização como VMware fazem uma pré-varredura do código que será executado para substituir essas instruções por instruções de interceptação, de modo que o hypervisor possa manipulá-las adequadamente. Xen, que suporta um método cooperativo de virtualização, não requer modificação, pois o guest sabe que está sendo virtualizado e é modificado. A KVM simplesmente ignora esse problema e informa que, para que haja virtualização, a execução terá de ser feita em um hardware mais novo.

A princípio, isso provavelmente parece um problema, mas, considerando que as máquinas que estão surgindo hoje oferecem suporte à virtualização (como Intel® VT e AMD SVM), isso será resolvido antes que tal problema se torne uma norma, e não exceção. Para informações adicionais sobre os processadores que oferecem suporte à virtualização, consulte Recursos e a barra lateral, Suporte do Processador para Virtualização.

O Hypervisor da KVM

Considerando a linha do tempo das técnicas de virtualização, a KVM é relativamente nova. Hoje existem vários métodos de software livre, como Xen, Bochs, UML, Linux-VServer e coLinux, mas a KVM está tendo, surpreendentemente, muito destaque na imprensa. Além disso, a KVM não é, na verdade, um esquema de virtualização completo por si só, mas parte de uma solução maior.

A abordagem que a KVM tem é a de tornar um kernel Linux um hypervisor, simplesmente carregando um módulo de kernel. O módulo de kernel exporta um dispositivo chamado /dev/kvm, que permite um modo guest do kernel (além do kernel tradicional e dos modos do usuário). Com /dev/kvm, uma VM tem seu próprio espaço de endereço separado do espaço do kernel ou de qualquer outra VM em execução. Dispositivos na árvore de dispositivo (/dev) são comuns a todos os processos de espaço do usuário. Mas /dev/kvm é diferente pelo fato de que cada processo que a abre vê um mapa diferente (para oferecer suporte ao isolamento das VMs).

A KVM simplesmente transforma o kernel Linux em um hypervisor (quando você instala o módulo kernel kvm). Como o kernel Linux padrão é o hypervisor, ele se beneficia com as alterações no kernel padrão (suporte de memória, planejador, etc). Otimizações para esses componentes Linux (como o novo planejador O(1) no kernel 2.6) beneficiam tanto o hypervisor (o sistema operacional do host) quanto os sistemas operacionais guest Linux. Mas a KVM não é a primeira a fazer isso. A UML vem transformando o kernel Linux em um hypervisor para algum tempo. Com o kernel atuando como um hypervisor, é possível então iniciar outros sistemas operacionais, como outro kernel Linux ou Windows.

KVM

Com a KVM instalada, é possível iniciar os sistemas operacionais guest no espaço do usuário. Cada sistema operacional guest é um único processo do sistema operacional host (ou hypervisor). Figura 2 fornece uma visualização da virtualização com a KVM. Na parte inferior há uma plataforma de hardware que pode fazer a virtualização (atualmente, isso significa um processador Intel VT ou AMD-SVM). Em execução, no hardware vazio, está o hypervisor (o kernel Linux com o módulo KVM). Esse hypervisor se assemelha a um kernel Linux comum, no qual é possível executar qualquer outro aplicativo. Mas este kernel também pode oferecer suporte a sistemas operacionais guest, carregados através do utilitário kvm. Por fim, um sistema operacional guest pode oferecer suporte aos mesmos aplicativos que o sistema operacional do host suporta.

Figura 2. Os Componentes de Virtualização com a KVM
Os Componentes de Virtualização com a KVM

Lembre-se de que a KVM faz parte de uma solução de virtualização. O processador fornece o suporte de virtualização diretamente (a capacidade de virtualizar o processador para vários sistemas operacionais). A memória é virtualizada através da kvm (que eu discutirei na próxima seção). Finalmente, a E/S é virtualizada através de um processo QEMU levemente modificado (uma cópia dele é executada com cada processo do sistema operacional guest).

A KVM introduziu um novo modo de processamento para o Linux, para o kernel existente e os modos do usuário. O novo modo é chamado de guest, e como o próprio nome sugere, ele é usado para execução do código do sistema operacional guest (ou pelo menos para alguns deles). Lembre-se de que o modo kernel representa o modo privilegiado para a execução do código, enquanto o modo do usuário representa o modo não-privilegiado (para programas em execução fora do kernel). Os modos de execução são então definidos para fins diferentes, com base no que está sendo executado e em seu objetivo. O modo guest existe para executar o código do sistema operacional guest, mas apenas para códigos que não são de E/S. Dentro do modo guest há dois modos padrão, para que um sistema operacional guest seja executado no modo guest, mas ofereça suporte ao kernel padrão e aos modos de usuário de seu kernel e aplicativos de espaço de usuário. O modo de usuário de um sistema operacional guest existe para executar E/S, que é gerenciada de forma independente.

A execução de E/S de um sistema operacional guest é fornecida com QEMU. QEMU é uma solução de virtualização de plataforma que permite a virtualização de um ambiente de PC completo (inclusive discos, adaptadores gráficos e dispositivos de rede). Qualquer pedido de E/S que um sistema operacional guest faz é interceptado e roteado para o modo do usuário a ser emulado pelo processo QEMU.

A KVM fornece virtualização de memória através do dispositivo /dev/kvm. Cada sistema operacional guest tem seu próprio espaço de endereço que é mapeado quando o guest é instanciado. A memória física que é mapeada para o sistema operacional guest é, na verdade, a memória virtual mapeada no processo. Um conjunto de tabelas de páginas com sombra é mantido para oferecer suporte à conversão de endereços físicos guest para endereços físicos host. O processador também oferece suporte ao processo de conversão de memória, pressionando o hypervisor (kernel host) quando um local de memória não-gerenciada é acessado.

Instanciando um Novo Guest

A instanciação de um novo sistema operacional guest é fornecida por um utilitário chamado kvm. Esse utilitário funciona com o módulo kvm, utilizando /dev/kvm para carregar um guest, associá-lo ao disco virtual (um arquivo comum no sistema operacional do host) e depois inicializá-lo.

O controle é suportado através de um conjunto de ioctls que são executados no dispositivo /dev/kvm. Quando o arquivo especial é aberto pela primeira vez, um novo objeto da VM é criado, que será associado a uma CPU virtual. É possível então utilizar vários ioctls para criar uma CPU virtual, verificar as versões de kvm, criar uma região da memória e depois iniciar uma CPU virtual. Isto é feito utilizando o comando kvm. Eu examinarei o comando kvm e mostrarei exemplos de alguns dos ioctls suportados nas seguintes seções.

Utilizando a KVM

Utilizar a KVM é realmente simples, se seu hardware oferecer suporte a ela. É necessário um processador que tenha suporte para virtualização: será possível dizer se seu sistema oferece suporte à virtualização consultando /proc/cpuinfo. Esse arquivo especifica se as extensões vmx (Intel) ou svm (AMD) possuem suporte.

Depois, será necessário de um kernel Linux com suporte à KVM ativado. Você faz isso na configuração do kernel, em Drivers de Dispositivo > Virtualização. Também é necessário ativar o suporte ao processador para seu ambiente. Você também deve ter os aplicativos do espaço de usuário kvm e qemu. Consulte Recursos para obter informações adicionais.

Utilizando um kernel inicializado com suporte para virtualização ativado, a próxima etapa é criar uma imagem de disco para o sistema operacional guest. Isso é feito com qeumu-img, como mostrado abaixo. Observe que o tamanho da imagem é de 4 GB, mas utilizar o formato copy-on-write (qcow) do QEMU fará com que o arquivo expanda conforme necessário, em vez de ocupar os 4 GB totais.

$ qemu-img create -f qcow vm-disk.img 4G

Com seu disco virtual criado, carregue o sistema operacional guest nele. O seguinte exemplo assume que o sistema operacional guest está em um CD-ROM. Além de ocupar o disco virtual com a imagem ISO do CD-ROM, será necessário executar boot na imagem depois da conclusão.

$ kvm -no-acpi -m 384 -cdrom guestos.iso -hda vm-disk.img -boot d

Ari Kivity escreveu um conjunto de ferramentas de teste para a KVM sem a necessidade de um modelo de dispositivo completo. O seguinte trecho de código (de kvm-12/user/main.c) fornece um pico de alto nível ao iniciar uma VM (consulte Lista 1). Os recursos de controle são fornecidos por ioctls no kernel (especialmente no arquivo ./linux-2.6.20/drivers/kvm/kvm_main.c).

A chamada para kvm_init abre o dispositivo /dev/kvm, verifica os números de versão (exportados pelo módulo de kernel KVM), depois aloca um objeto de contexto da KVM e preenche algumas funções de retorno de chamada. A função kvm_create configura e mapeia duas regiões da memória e depois cria uma CPU virtual (VCPU) com um ioctl (KVM_CREATE_VCPU).

A função load_file então carrega a imagem no espaço de endereço para uma determinada VM, que é executada com uma chamada para kvm_run (utilizando ioctl KVM_RUN). Embora simples, esse processo ilustra como é possível instanciar novos sistemas operacionais com a KVM.

Lista 1. Trecho de um Aplicativo para Testar o Hypervisor KVM
int main()
{
	void *vm_mem;

	kvm = kvm_init(&test_callbacks, 0);
	if (!kvm) {
	    fprintf(stderr, "kvm_init failed\n");
	    return 1;
	}
	if (kvm_create(kvm, 128 * 1024 * 1024, &vm_mem) < 0) {
	    kvm_finalize(kvm);
	    fprintf(stderr, "kvm_create failed\n");
	    return 1;
	}
	if (ac > 1)
	    if (strcmp(av[1], "-32") != 0)
		load_file(vm_mem + 0xf0000, av[1]);
	    else
		enter_32(kvm);
	if (ac > 2)
	    load_file(vm_mem + 0x100000, av[2]);
	kvm_show_regs(kvm, 0);

	kvm_run(kvm, 0);

	return 0;
}

Considerações Finais

A KVM é uma solução interessante para o problema de virtualização, mas é a primeira no kernel; é difícil não imaginar que ela ganhará espaço rapidamente na virtualização de servidores. Outros métodos competiram por algum tempo para entrar no kernel (como UML e Xen), mas como a KVM exigia poucas alterações e podia transformar um kernel padrão em um hypervisor, fica claro o porquê de ter sido escolhida.

Outra vantagem da KVM é que, como ela faz parte do próprio kernel, pode se beneficiar das otimizações e avanços do kernel. Isso ajuda a provar futuramente a abordagem dela sobre as demais, independentemente das soluções de hypervisor. As duas maiores desvantagens da KVM são: ela requer processadores mais novos, capazes de efetuar virtualização, e um processo QEMU de espaço de usuário para fornecer virtualização de E/S. Mas, boa ou ruim, a KVM está no kernel, o que dá a ela uma grande vantagem em relação às soluções existentes.


Recursos para download


Temas relacionados

  • Há várias formas de fornecer virtualização e é possível aprender mais sobre o assunto no artigo, "Linux Virtual" (developerWorks, dezembro de 2006).
  • Várias empresas, inclusive a IBM, Intel e AMD fornecem hardware de virtualização. É possível consultar seus respectivos sites para obter informações adicionais.
  • Para as últimas informações sobre a KVM, consulte o wiki da KVM que é fornecido pela Qumranet.
  • Mesmo que a KVM tenha ficado fora apenas por um breve período de tempo, é possível encontrar vários artigos que exploram seu desempenho em várias áreas. Dois artigos interessantes são fornecidos pela Phoronix e KernelNewbies.
  • Outro artigo interessante na KernelNewbies fornece uma ótima comparação de métodos de virtualização (inclusive KVM).
  • O planejador Linux V2.6 foi criado por Ingo Molnar para realizar o planejamento O(1). É possível ler mais sobre esse planejador em "Por Dentro do Planejador Linux" (M. Tim Jones, developerWorks, junho de 2006).
  • Um método de virtualização cooperativo, coLinux permite que você execute o Linux em Windows.
  • QEMU é um emulador de processador de software livre que também fornece recursos de virtualização para ambientes PC para a KVM.
  • Para fazer download dos aplicativos necessários para a KVM, consulte Debian.
  • Com o Software de período experimental IBM, disponível para download diretamente do developerWorks, construa seu próximo projeto de desenvolvimento em Linux.

Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux, Software livre
ArticleID=382592
ArticleTitle=Descubra a Máquina Virtual do Kernel Linux
publish-date=04182007