Descubra a Máquina Virtual do Kernel Linux

Conheça a Arquitetura e Vantagens da KVM

Chamadas do sistema Linux® e flexibilidade caminham juntos; e as opções de virtualização não são diferentes. Mas, recentemente, uma alteração na paisagem da virtualização Linux apareceu com a introdução da Kernel Virtual Machine, ou KVM. A KVM é a primeira solução de virtualização a fazer parte do kernel Linux principal (V2.6.20). A KVM oferece suporte à virtualização dos sistemas operacionais guest Linux -- até mesmo o Windows® com hardware que reconhece a virtualização. Conheça a arquitetura da KVM Linux, bem como por que sua grande integração com o kernel pode alterar a forma como o Linux é utilizado.

M. Tim Jones, Consultant Engineer, Emulex Corp.

M. Tim JonesM. Tim Jones é um arquiteto de firmwares embarcados e autor de Inteligência Artificial: Sistemas de Abordagem, GNU/Linux, Programação de Aplicativos AI (atualmente em sua segunda edição), Programação de Aplicativos AI (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Sua formação em engenharia vai desde o desenvolvimento de kernels para nave espacial geossincrônica até a arquitetura de sistema embarcado e o desenvolvimento de protocolos de interligação de redes. Tim é um Engenheiro Consultor para a Emulex Corp. em Longmont, Colorado.


nível de autor Contribuidor do
        developerWorks

18/Abr/2007

Introdução

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.

KVM e kvm

Neste artigo, eu me refiro a KVM quando falo sobre a Kernel Virtual Machine e kvm quando abordo o utilitário hypervisor (utilizado para iniciar uma nova máquina virtual).

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.

Suporte do Processador para Virtualização

As vantagens da virtualização de plataforma são tão reais que fornecedores de processadores modificaram seus produtos para oferecer suporte ao método de forma direta. Isso permite que o processador ofereça suporte direto a um hypervisor de forma diferente daquela de um sistema operacional guest. Além de o estado do processador (registros, etc) ser gerenciado de forma diferente para uma VMM e uma VM, o processador oferece suporte à virtualização de E/S e interrupções. Para informações adicionais, consulte Recursos.

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).

Origem da KVM no Kernel Linux

É possível localizar a origem da KVM em ./linux/drivers/kvm (na V2.6.20 e posterior). Este diretório contém os arquivos de origem para a KVM, bem como os arquivos de suporte para extensões Intel e AMD.

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

Aprender

  • 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.
  • Na zona Linux do developerWorks, encontre mais recursos para desenvolvedores Linux.
  • Fique atualizado com eventos técnicos e Webcasts do developerWorks.

Obter produtos e tecnologias

  • 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.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


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