Anatomia de um Hypervisor Linux

Uma introdução ao KVM e ao Lguest

Uma das mais importantes inovações do Linux ® é a sua transformação em um hypervisor (ou seja, um sistema operacional para outros sistemas operacionais). Várias soluções de hypervisor lançadas fazem uso do Linux como núcleo. Este artigo aborda os conceitos sobre o hypervisor e sobre dois hypervisores específicos que usam o Linux como a plataforma (KVM e Lguest).

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

31/Mai/2009

Os hypervisores fazem para os sistemas operacionais o que os sistemas operacionais dificilmente fazem para os processos. Eles fornecem plataformas de hardware virtual isoladas para execução que, por sua vez, dá uma ilusão de acesso total à máquina subjacente. Mas nem todos os hypervisores são os mesmos, o que é bom, pois o Linux consiste basicamente de flexibilidade e escolha. Este artigo começa com uma rápida introdução à virtualização e aos hypervisores e, em seguida, aborda alguns hypervisores baseados em Linux.

Virtualização e hypervisores

Leia mais artigos de Tim Jones no developerWorks

Primeiro vamos entender porque a virtualização é importante e a função que os hypervisores exercem. (Para obter mais informações sobre os dois tópicos, consulte a seção Recursos ).

Virtualização, no contexto deste artigo, é o processo de ocultar o hardware físico subjacente de modo que ele possa ser utilizado e compartilhado de forma transparente em vários sistemas operacionais. Essa arquitetura é mais popularmente conhecida como virtualização de plataforma. Em uma arquitetura típica em camadas, a camada que é fornecida para a virtualização de plataforma é chamada de hypervisor (às vezes chamada de Virtual Machine Monitor, ou VMM). Cada instância de um sistema operacional guest é chamada de máquina virtual (VM), já que o hardware é virtualizado para ser exibido como dedicado a elas. A Figura 1 mostra uma ilustração simples desta arquitetura em camadas.

Figura 1. Arquitetura simples em camadas que mostra a virtualização do hardware comum
Arquitetura simples em camadas que mostra a virtualização do hardware comum.

Os benefícios da virtualização de plataforma são muitos. Mas uma estatística interessante reportada pela U.S. Environmental Protection Agency (EPA) se destaca. Um estudo da EPA sobre a eficiência de energia do servidor e do centro de dados constatou que apenas cerca de 5% da capacidade do servidor é realmente utilizada. O restante fica inativo. Virtualizar plataformas em um único servidor pode melhorar o uso do servidor, mas os benefícios de reduzir a contagem do servidor são um multiplicador de forças. Servidores reduzidos reduzem o estado real, o consumo de energia, custos de resfriamento (menos custos de energia) e custos de gerenciamento. Menos hardware também significa confiabilidade melhorada. Em suma, a virtualização de plataforma traz não apenas vantagens técnicas como também vantagens de custo e de energia.

Como você pode ver na Figura 1, o hypervisor é a camada de software que fornece a virtualização da máquina subjacente (em alguns casos, com suporte do processador). Nem todas as soluções de virtualização são iguais e você pode aprender mais sobre os vários estilos de virtualização em Recursos. Continuando com o tema de processos, os sistemas operacionais virtualizam o acesso aos recursos subjacentes da máquina aos processos. Os hypervisores fazem a mesma coisa, mas em vez dos processos, eles executam essa tarefa para os sistemas operacionais guest inteiros.

Classificações do Hypervisor

Os hypervisores podem ser classificados em dois tipos distintos. O primeiro, os hypervisores do tipo 1, são aqueles que originalmente são executados no hardware bare-metal. O segundo, o tipo 2, são os hypervisores que são executados no contexto de outro sistema operacional (que é executado no bare metal). Os exemplos de hypervisores do tipo 1 incluem a Máquina Virtual baseada em Kernel (KVM—em um hypervisor baseado em sistema operacional). Os exemplos de hypervisores do tipo 2 incluem QEMU e WINE.


Elementos de um Hypervisor

Um hypervisor (independentemente do tipo) é um aplicativo em camadas que separa o hardware da máquina de cada guest. Dessa forma, cada um vê uma VM em vez do hardware real. Vamos analisar genericamente a parte interna de um hypervisor e também como ele é apresentado às VMs (sistemas operacionais guest).

Em um nível superior, o hypervisor requer um pequeno número de itens para inicializar um sistema operacional guest: uma imagem de kernel para inicializar, uma configuração (como endereços IP e quantidade de memória a serem usados), um disco e um dispositivo de rede. O disco e o dispositivo de rede normalmente são mapeados para o disco físico da máquina e para o dispositivo de rede (conforme mostrado na Figura 2). Por fim, um conjunto de ferramentas guest é necessário para ativar um guest e, subsequentemente, gerenciá-lo.

Figura 2. Mapeamento mínimo de recursos em um hypervisor hipotético
Mapeamento mínimo de recursos em um hypervisor hipotético

Uma arquitetura de hypervisor simplificada implementa a união que permite que um sistema operacional guest seja executado simultaneamente com o sistema operacional host. Essa funcionalidade requer alguns elementos específicos, mostrados na Figura 3. Primeiro, semelhante às chamadas do sistema que vinculam os aplicativos de espaço do usuário com as funções de kernel, uma camada de hypercall está normalmente disponível o que permite que guests façam pedidos ao sistema operacional host. A entrada/saída (E/S) pode ser virtualizada no kernel ou assistida pelo código no sistema operacional guest. As interrupções devem ser manipuladas exclusivamente pelo hypervisor para lidar com as interrupções reais ou para rotear as interrupções para os dispositivos virtuais para o sistema operacional guest. O hypervisor também deve manipular traps ou exceções que ocorrerem em um guest. (Com isso, uma falha em um guest poderá travá-lo mas não o hypervisor ou outros guests). O elemento principal de um hypervisor é um mapeador de página, que aponta o hardware para as páginas de um determinado sistema operacional (guest ou hypervisor). Por fim, um planejador de nível superior é necessário para transferir o controle entre o hypervisor e os sistemas operacionais guest (e vice-versa).

Figura 3. Visualização simplificada de um hypervisor baseado em Linux
Visualização simplificada de um hypervisor baseado em Linux

Hypervisores do Linux

Este artigo aborda duas soluções de hypervisor baseadas em Linux. A primeira é —KVM—que foi o primeiro módulo de hypervisor a ser integrado no kernel Linux, que implementa uma virtualização completa, e o segundo é —Lguest—, um hypervisor experimental que, surpreendentemente, fornece uma paravirtualização com poucas alterações.

KVM

O KVM é uma infraestrutura de virtualização residente no kernel para o hardware x86 Linux. O KVM foi o primeiro hypervisor a fazer parte do kernel Linux nativo (2.6.20) e foi desenvolvido e mantido pelo Avi Kivity através da inicialização Qumranet, agora de propriedade do Red Hat.

Este hypervisor fornece a virtualização x86, com portas para o PowerPC® e para o IA64 em processo. Além disso, o KVM recentemente incluiu suporte para hosts (e guests) de multiprocessamento simétrico (SMP) e suporta recursos de nível corporativo, como a migração ativa (para permitir que os sistemas operacionais guest sejam migrados entre os servidores físicos).

O KVM é implementado como um módulo do kernel, permitindo que o Linux se torne um hypervisor apenas ao carregar um módulo. O KVM fornece virtualização completa em plataformas de hardware que fornecem suporte para instrução de hypervisor (como as ofertas Intel ® Virtualization Technology [Intel VT] ou o AMD Virtualization [AMD-V]). O KVM também suporta guests paravirtualizados, incluindo o Linux e o Windows®.

Essa tecnologia é implementada como dois componentes. O primeiro é o módulo carregável pelo KVM que, quando instalado com o kernel Linux, fornece gerenciamento de hardware de virtualização, expondo seus recursos através do sistema de arquivos /proc (consulte a Figura 4). O segundo componente fornece a emulação de plataforma PC, que é fornecida por uma versão modificada do QEMU. O QEMU é executado como um processo de espaço do usuário, coordenando junto com o kernel os pedidos do sistema operacional guest.

Figura 4. Visualização de alto nível do hypervisor de KVM
Visualização de alto nível do hypervisor de KVM

Quando um novo sistema operacional é inicializado no KVM (através de um utilitário chamado kvm), ele se torna um processo do sistema operacional host e, portanto, pode ser planejado como qualquer outro processo. Mas diferentemente dos processos tradicionais no Linux, o sistema operacional guest é identificado pelo hypervisor como estando no modo "guest" (independente dos modos do kernel e do usuário).

Cada sistema operacional guest é mapeado através do dispositivo /dev/kvm, possuindo seu próprio espaço de endereço virtual que é mapeado para o espaço de endereço físico do kernel. Conforme mencionado anteriormente, o KVM usa o suporte de virtualização do hardware subjacente para fornecer virtualização completa (nativa). Os pedidos de E/S são mapeados através do kernel host para o processo de QEMU que é executado no host (hypervisor).

O KVM opera no contexto do Linux como o host, mas suporta um grande número de sistemas operacionais guests, dando suporte para a virtualização do hardware subjacente. Você pode obter uma lista de guests suportados em Recursos.

Lguest (antigo lhype)

O hypervisor Lguest, desenvolvido por Rusty Russell da IBM na Austrália, faz uma abordagem totalmente diferente sobre a virtualização. Em vez de fornecer suporte completo à virtualização para executar sistemas operacionais arbitrários, o Lguest fornece uma paravirtualização simples para guests x86 Linux ativados pelo Lguest (também chamado de Virtualização Linux-on-Linux). Isso significa que os sistemas operacionais guests sabem que eles estão sendo virtualizados e esse conhecimento é acompanhado dos aprimoramentos de desempenho. Porém, o Lguest fornece um desempenho ideal sem precisar que o QEMU forneça virtualização de plataforma (como é o caso do KVM). A abordagem do Lguest também simplifica os requisitos gerais de código, requerendo apenas uma fina casa do sistema operacional guest e também do sistema operacional host. Vamos agora discutir essas mudanças e revisar a arquitetura de alto nível de um ambiente Lguest.

Como mostra a Figura 5, o sistema operacional guest inclui uma fina casca do código Lguest (por definição, paravirtualização). Esse código fornece um certo número de serviços. No nível mais alto, há um código para determinar se o kernel a ser inicializado será virtualizado. Também há uma camada de abstração (implementado através de paravirt_ops) para rotear as operações privilegiadas para o sistema operacional host através de hypercalls. Por exemplo, o guest não pode desativar interrupções, assim, esses pedidos são executados no sistema operacional host. Você também encontrará um barramento que implementa uma abstração de dispositivo para guests além de um conjunto de drivers simples que implementam um console, um driver de bloco virtual e um driver de rede virtual (que permite comunicação com outros guests).

Figura 5. Decomposição da abordagem Lguest para a paravirtualização x86
Decomposição da abordagem Lguest para a paravirtualização x86

O conjunto de objetos do kernel é implementado como um módulo carregável chamado de lg.ko. Este módulo contém a interface do sistema operacional guest para o kernel host. O primeiro elemento é o alternador, que implementa o método pelo qual os sistemas operacionais guest alternam o contexto para execução. O código do sistema de arquivos /proc (para /dev/lguest) também é implementado neste módulo, que implementa as interfaces de espaço do usuário para o kernel e os drivers, incluindo as hypercalls. Há um código para fornecer o mapeamento de memória através do uso de tabelas de página de sombra e do gerenciamento de segmentos x86.

Por fim, o subdiretório Documentation no kernel contém o utilitário ativador (lguest) para ativar a nova instância do sistema operacional guest. Este arquivo tem função dupla, como utilitário e como documentação.

O Lguest esteve na linha principal do kernel desde a versão 2.6.23 (outubro de 2007) e foi desenvolvido e é mantido por Rusty Russell. Ele consiste aproximadamente de 5000 linhas de código de origem, incluindo os utilitários de espaço do usuário. Embora (supostamente) simples, o Lguest fornece a paravirtualização real. Porém, junto com essa simplicidade há restrições. Por exemplo, o Lguest virtualiza apenas outros sistemas operacionais guest ativados por Lguest e atualmente apenas para arquitetura x86. Porém mesmo com essas restrições, o Lguest fornece uma abordagem interessante para virtualização que pode ser acessado por qualquer um que desejar estudar o código mantido por Rusty.


Benefícios do Hypervisor Linux

Desenvolver hypervisores usando o Linux como o núcleo traz benefícios reais e tangíveis. Mais obviamente, basear um hypervisor no Linux traz benefícios como uma progressão estável do Linux e uma grande quantidade de trabalho que ele recebe. A partir das inovações de otimizações e correções de erro, de planejamento e de gerenciamento de memória para suportar arquiteturas de processador diferentes, o Linux é uma plataforma que continua avançando (citando John of Salisbury - "sentado nos ombros de gigantes").

O KVM provou recentemente que através da inclusão de um módulo do kernel, alguém poderia transformar o kernel Linux em um hypervisor. O hypervisor Lguest considera isso como uma etapa adicional e com as restrições da paravirtualização, simplificou a solução ainda mais.

Outro benefício interessante no uso do Linux como a plataforma é que você pode obter vantagem dessa plataforma como um sistema operacional e também como um hypervisor. Portanto, além de executar vários sistemas operacionais guest em um hypervisor Linux, você pode executar outros aplicativos tradicionais nesse nível. Assim, em vez de se preocupar com uma nova plataforma com as novas interfaces de programação de aplicativos (APIs), você tem sua plataforma Linux padrão para desenvolvimento de aplicativos (caso um aplicativo de monitoramento ou um aplicativo de gerenciamento de hypervisor seja necessário). Os protocolos padrão (TCP/IP) e outros aplicativos úteis (servidores da Web) estão disponíveis junto com os guests. Reveja a Figura 4 na discussão do KVM: Além dos sistemas operacionais guest, há o QEMU modificado pelo KVM. Este é um processo padrão e ilustra o poder do Linux como um hypervisor. O KVM usa o QEMU para virtualização de plataforma e, com o Linux como o hypervisor, ele imediatamente defende a ideia dos sistemas operacionais guest executados em conjunto com outros aplicativos Linux.


Conclusão

Uma coisa é certa com os desenvolvimentos do hypervisor que estão ocorrendo: O hypervisor é um novo campo de batalha. Trinta anos atrás, o sistema operacional era o foco do controle e dominou um pequeno número de usuários. Hoje, esse campo de batalha mudou para o hypervisor e o Linux tem uma missão clara a cumprir.

Mas o Linux como um hypervisor não está livre de críticas e muitas delas surgem de argumentos fúteis. Esses mesmos argumentos foram usados tempos atrás no domínio integrado. Hoje, o Linux como um sistema operacional integrado é uma potência e ainda não foi combatido. Mas isso não quer dizer que nenhuma crítica possa ser feita. Possivelmente algumas mudanças na arquitetura devem tornar um sistema operacional grande e amplamente usado cada vez mais flexível.

Recursos

Aprender

Obter produtos e tecnologias

  • Com o IBM Trial Software, disponível para download diretamente a partir do developerWorks, crie seu próximo projeto de desenvolvimento no Linux.

Discutir

  • Entre na Comunidade Meu developerWorks; com seu perfil e página inicial customizados, você pode adequar o developerWorks como quiser e interagir com outros usuários do developerWorks.

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
ArticleID=397021
ArticleTitle=Anatomia de um Hypervisor Linux
publish-date=05312009