Nível: Intermediário M. Tim Jones, Consultant Engineer, Emulex Corp.
31/Mai/2009 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).
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
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
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
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
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
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
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
- O
Relatório do EPA
sobre a eficiência de energia do servidor e do centro de dados
inclui uma grande pesquisa de opinião sobre onde a energia é consumida no centro de dados.
A partir deste relatório, fica claro que a virtualização tem um papel importante na melhoria
da eficiência de energia dos centros de dados através da consolidação do servidor.
- A
Máquina de Virtualização baseada em Kernel
é uma opção para um hypervisor baseado em Linux. Você pode saber mais sobre o KVM
no Web site do projeto. Aqui você obterá um
white paper interessante
que descreve as ideias sobre a tecnologia. O KVM continua evoluindo e você pode conhecer o que
está acontecendo e o que há pela frente no último
Fórum KVM 2008.
Você também pode obter uma lista de guests suportados na
Página de status de suporte
de guest do KVM.
- Existem vários tipos de virtualização.
Este artigo abordou duas soluções que englobam virtualização e paravirtualização
completas. Você pode conhecer algumas outras opções em
"Linux Virtual"
(developerWorks, dezembro de 2006). Você também pode obter mais detalhes do KVM e do QEMU em
"Descubra o Kernel Virtual Machine Linux"
(developerWorks, abril de 2007) e
"Emulação do Sistema com o QEMU"
(developerWorks, setembro de 2007).
- Este artigo abordou outros tópicos
interessantes do Linux, como os módulos do kernel carregáveis e o sistema de
arquivos /proc. Para obter mais detalhes sobre esses dois assuntos, consulte
"Anatomia dos Módulos do Kernel Carregáveis do Linux"
(developerWorks, julho de 2008) e
"Acessar o kernel do
Linux usando o sistema de arquivos /proc"
(developerWorks, março de 2006).
- O Lguest (Hypervisor x68 Simples) mostra como criar
um hypervisor x86 simples com o Linux com um mínimo de mudanças.
O Web site do Lguest
fornece os últimos detalhes e documentação para aprender mais.
- Embora este artigo aborde a teoria de alto nível
por trás dos hypervisores baseados em Linux, você pode explorar a instalação
e usar o Lguest em
Dicas do Linux Corporativo.
-
Na
Zona Linux do developerWorks,
obtenha mais recursos para os desenvolvedores Linux e faça uma busca em nossos
artigos e tutoriais mais conhecidos.
-
Consulte todos os
Tutoriais Linux e
Dicas Linux no developerWorks.
-
Atualize-se com os
Eventos técnicos e webcasts do developerWorks.
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.
Sobre o autor  | 
|  | M. 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. |
Avalie esta página
|