Virtualização – Definição

Introdução

Virtualização não é um termo tão novo como costumamos pensar. As primeiras máquinas que foram projetadas para executar algum tipo de virtualização datam de 1964 com o mainframe IBM S/360. O termo voga principalmente pelo crescente advento da computação em nuvem no nosso cotidiano e como as técnicas evoluíram com o passar dos anos. Abaixo explico os principais conceitos interligados com virtualização.

Definição

Definir virtualização de maneira direta não é uma tarefa simples. Gosto de utilizar a definição de Singh [10] que diz que virtualização consiste na emulação de ambientes completos, podendo ser constituído de sistema operacional, rede, software armazenamento, etc. Uma definição mais acadêmica apresenta virtualização como um processo de abstração de diversos conceitos cuja finalidade busca facilitar, ou até mesmo empregar aspectos como segurança em atividades que podem ser realizadas em ambientes físicos ou lógicos.

Grande parte das pessoas já devem ter ouvido falar em redes virtuais, máquinas virtuais, armazenamento virtual, etc. Isso é algo que a virtualização permite: abstrair um conceito físico (máquinas, armazenamento, rede) em algo lógico (arquivos, diretórios, programas). Assim como diretório é uma abstração de armários e arquivos é uma abstração do papel, temos que máquinas virtuais são abstrações de máquinas físicas, rede virtual é uma abstração de hubs, switches e cabos, etc. A figura abaixo demonstra uma arquitetura virtual.

Figura 1: Arquitetura tradicional (a esquerda) e arquitetura virtualizada ( a direita)
Figura 1: Arquitetura tradicional (a esquerda) e arquitetura virtualizada ( a direita). Adaptado de [2]

Temos uma máquina que pode isolar diversas aplicações, cada uma possuindo o seu próprio sistema operacional que é totalmente independente com outros sistemas.

Um ambiente virtual pode ser também denominado de abstração virtual. Quando falamos de abstrações virtuais, por hora, vamos considerar como máquinas virtuais (veremos porém que depende da técnica de virtualização que está sendo utilizada).

O sistema que sofre virtualização é definido como sistema convidado (ou Guest OS) e o sistema que abriga os sistemas convidados é definido como sistema hospedeiro (ou Host OS). Uma máquina virtual é dotada de sistema operacional, artifícios de acesso à rede, disco, memória, processamento, etc. A arquitetura de um sistema hospedeiro pode não ser a mesma de um sistema convidado (ou seja, a arquitetura do sistema hospedeiro pode ser uma x86 enquanto que os convidados podem rodar um SPARC, x86, ARM7).

Vantagens

As vantagens do uso de virtualização são enormes, dentre ela destacam como principais:

  • Execução de múltiplas versões de um mesmo programa
  • Melhor aproveitamento dos recursos disponíveis
  • Elasticidade (ou seja, aumentar ou reduzir a quantidade de recursos disponíveis em uma máquina virtual de maneira rápida)
  • Execução de diversos sistemas operacionais diferentes
  • Execução de diferentes arquiteturas
  • Isolamento de um determinado serviço de outros
  • Migração para outros hospedeiros

Hypervisor

Uma peça importante no fornecimento de virtualização é o hypervisor (ou VMM, Virtual Machine Monitor). Ele é responsável por gerenciar e fornecer os recursos que serão utilizados pelas máquinas virtuais (VM’s). É responsável também em traduzir as instruções virtuais em instruções que serão executadas pela máquina e vice-versa. Ele é o intermédio entre o mundo físico e o mundo virtual, geralmente localizado entre o hardware e o sistema operacional. A figura abaixo demonstra um ambiente virtual com o hypervisor.

Figura 1: Hypervisor
Figura 2: Hypervisor. Adaptado de [3]

Como observamos na Figura 1, existem dois tipos de hypervisor dependendo da sua localização. No tipo 1 (ou bare-metal) o sistema hospedeiro é o próprio hypervisor, executando diretamente sobre o hardware. No tipo 2  (ou hosted) o hypervisor é executado sobre um sistema operacional do hospedeiro.

São exemplos de hypervisor do tipo 1: Xen, Hyper-V e VMware ESXi. Exemplos do tipo 2: Qemu/KVM, VirtualBox e Boxes.

Técnicas de virtualização

O próximo passo natural é entendermos como é realizada a comunicação da virtualização com o ambiente real. Vimos que o hypervisor é o intermédio entre os dois sistemas existentes (físico e virtual) mas, a maneira que uma máquina virtual se comunica com o hypervisor pode ser dada de diferentes maneiras. Atualmente, pode-se classificar as técnicas de virtualização em 3 grupos: virtualização total, para-virtualização e virtualização a nível de sistema operacional.

Virtualização total

O sistema convidado não é capaz de saber que está em um ambiente virtual. Ele irá se comportar como se estivesse um um ambiente real. Nessa técnica, quando instalamos o sistema operacional da máquina virtual, não exige nenhuma modificação para que ele funcione. Todos os recursos necessários serão fornecido pelo hypervisor em 100% das vezes. Esse tipo de virtualização é mais utilizada para virtualizar sistemas operacionais como Windows e MacOS pois possuem o código fechado e não permite alterações para reconhecerem que estão em um ambiente virtual. Não existe uma cooperação entre o hypervisor e o convidado.

A principal vantagem é que praticamente não existe restrições para o que se pode ser virtualizado. A principal desvantagem é que a performance desses sistemas costuma ser péssima (pois não existe uma cooperação entre o hypervisor e o convidado). São exemplos de softwares que utilizam essa técnica: Xen, KVM, e VMware workstation.

A figura abaixo demonstra a arquitetura de um sistema com virtualização total.

total
Figura 3: Virtualização total

Para-virtualização

O sistema convidado é adaptado e sabe que está em um ambiente virtualizado. Dessa forma instruções privilegiadas são executadas de maneira diferente, podendo ser executados diretamente no hardware sem o intermédio do hypervisor. Nem todos os recursos são interpretados pelo hypervisor, o que trás um benefício significativo principalmente em instruções de I/O de rede e disco.

Dentre as vantagens trazidas por essa técnica está no melhor uso dos recursos para oferecer a virtualização e na performance que é bastante superior a virtualização total.

Como existe a necessidade de modificação do kernel do sistema, adicionando e acionando módulos, não pode ser realizado por qualquer sistema (apenas por aqueles que possuem um código fonte disponível para modificações). A Microsoft™ encontrou uma maneira de disponibilizar uma imagem de seu sistema operacional que foi especialmente modificada para suportar para-virtualização através do Xen.

A figura abaixo demonstra a arquitetura da para-virtualização.

para
Figura 4: Para-virtualização

Virtualização a nível de sistema operacional

Uma técnica que vem chamando atenção pela maneira que é implementada e pelos resultados que trás é a virtualização a nível de sistema operacional.

Alguns autores não considera ela uma técnica de virtualização, porém com o passar dos anos ela vem se destacando e é inclusa por muitos autores (alguns são ambiciosos o bastante para dizer que irá causar decréscimo nos demais grupos). Para começar, ela abstrai totalmente a função do hypervisor para funções do sistema operacional hospedeiro, ou seja, descarta o uso de um hypervisor para gerenciar seus sistemas convidados. As abstrações virtuais gerada por essa técnica são chamadas de containers.

Os containers surgiram como uma evolução do comando chroot (responsável por criar outro diretório raiz no sistema, utilizado principalmente para testar softwares) e das antigas jails do Solaris (utilizada com o mesmo fim do chroot, para servir como honeypot em invasões). Apesar de alguns afirmarem que os containers são uma espécie de chroot com esteróides, eles possuem muitas diferenças arquiteturais.

A figura abaixo mostra a técnica de virtualização a nível de sistema operacional.

Figura x: Virtualização a nível de sistema operacional
Figura 5: Virtualização a nível de sistema operacional

Os containers são dependentes do kernel do hospedeiro. Eles não podem utilizar um kernel diferente do kernel do hospedeiro. O sistema operacional que roda sobre os convidados só poderá ser um sistema baseado em Linux (já que atualmente só existe implementado funções de controle de containers no kernel do Linux, apesar da Microsoft™ está correndo para até 2016 implementar uma versão par seu sistema).

A principal vantagem dos containers é sem dúvida sua performance. Conseguem manter uma excelente performance (próxima de um serviço rodando em um servidor real) principalmente naqueles fatores onde a virtualização total e para-virtualização enfrentam dificuldades.

As principal desvantagem é o isolamento, que apesar de existir ainda é muito frágil quando comparamos com as técnicas que usam o hypervisor. Outra desvantagens é que alguns recursos físicos pode não ser utilizados em containers da mesma maneira que seriam utilizada em máquinas virtuais.

Virtualização e o hardware

Quando se desenvolve um algoritmo e deseja eficiência, é comum inserir a lógica do algoritmo (ou parte dela) em um sistema físico (um chip). Isso é visto com algoritmos de verificação de erro de memória (existe um chip na memória que é responsável por isso), algumas instruções para executar jogos (lógica inserida em uma placa gráfica, por isso que alguns jogos são melhores em uma determinada placa e em outra não), etc. Na virtualização acontece o mesmo. Com o intuito de ganhar velocidade e performance algumas instruções que são utilizadas frequentemente nas abstrações virtuais foram inseridas em alguns modelos de processadores. Os processadores Intel-VTx e AMD-v são equipados com essas instruções e podem ser ativadas na BIOS.

Em placas de rede encontramos tecnologias como multiqueues e virtual ethernet que permitem melhorar ainda mais a maneira que o tráfego é trocado nas máquinas virtuais.

Conclusão

Sistemas virtualizados estão em alta e existem diversas pesquisas sendo realizada para esses ambientes. Hoje em dia existe uma quantidade grande de ferramentas que satisfaz as necessidades da grande maioria.

Encontrou algum erro? Possui alguma opinião sobre o assunto? Deixe nos comentários! Keep learning!

Referências

[1] http://www.gta.ufrj.br/grad/08_1/virtual/index.html

[2] http://www.fasterti.com.br/css/images/virtualizacao2.jpg

[3] http://blogs.technet.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-46-64-metablogapi/2161.Hypervisor-Design_5F00_4.jpg

[4] http://www.computerworld.com/article/2907187/microsoft-creates-a-container-for-windows.html

[5] http://docs.oracle.com/cd/E37670_01/E37355/html/ol_containers.html

[6] http://wiki.prgmr.com/mediawiki/index.php/Chapter_13:_Xen_and_Windows

[7] https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Virtualization/pr01s05.html

[8] https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Administration_Guide/sect-Virtualization-Troubleshooting-Enabling_Intel_VT_and_AMD_V_virtualization_hardware_extensions_in_BIOS.html

[9] Smith, Jim, and Ravi Nair. Virtual machines: versatile platforms for systems and processes. Elsevier, 2005.

[10] Singh, Amit. “An introduction to virtualization.” ISSN http://www. kernelthread. com/publications/virtualization/. URL http://www. kernelthread. com/publications/virtualization (2004).

4 comentários

Deixe um comentário