Virtualização de Servidores Explicada

Provavelmente já ouviram falar sobre uma imensa variedade de tipos distintos de virtualização; Total, no metal nu, para-virtualização, SO convidado (guest), SO assistido, assistida por hardware, hospedada, ao nível do SO, ao nível do kernel, de kernel partilhado, por emulação de hardware, virtualização de hardware, baseada em hipervisor, por contentores ou ainda virtualização nativa. Confuso, não é?

Não se preocupem meus fiéis leitores, o propósito deste blog é exactamente explicar estes assuntos para que todos possam ter uma visão clara sobre as questões normalmente restritas a um grupo de geeks. Mas lembrem-se que alguns destes termos são popularizados por certos fornecedores e não têm a aceitação total de toda a indústria. Além disso, muitos dos termos são usados indistintamente e de forma intermutável (e por isso mesmo são tão confusos).

Apesar de outros classificarem as actuais técnicas de virtualização de uma maneira diferente, eu vou utilizar o seguinte critério:

  1. Virtualização Completa;
  2. Para-Virtualização;
  3. Virtualização ao Nível do Sistema Operativo;
  4. Virtualização assistida por hardware.

Nos emocionantes capítulos seguintes vou explicar estas técnicas, uma a uma, mas antes acredito que seja útil dar-lhes uma breve introdução a alguns conceitos subjacentes.


História da Virtualização de Servidores


A virtualização foi desenvolvida na década de 1960 para dividir grandes mainframes com vista a uma melhor utilização do hardware. Em 1964, a IBM desenvolveu um Monitor de Máquina Virtual (Virtual Machine Monitor ) para executar os seus vários sistemas operativos nos seus mainframes, fornecendo uma maneira de dividir logicamente estes grandes computadores em máquinas virtuais separadas. Essas partições permitiam aos mainframes a multitarefa; executar várias aplicações e processos ao mesmo tempo. O hardware era caro demais para ser subutilizado e por isso era projectado para o particionamento como uma forma de rentabilizar o investimento.

No entanto, com o advento do hardware barato, a virtualização deixou de ser popular e foi vista como uma relíquia de uma época onde os recursos computacionais eram escassos. Isto reflectiu-se no projecto da arquitectura x86 que já não fornecia suporte suficiente para implementar a virtualização de forma eficiente. A virtualização foi abandonada nas décadas de 1980 e 1990, quando as aplicações cliente-servidor e os servidores x86 e desktops de baixo custo levaram à computação distribuída. A ampla adopção do Windows e o surgimento do Linux como sistemas operativos de servidor na década de 1990 estabeleceram os servidores x86 como o padrão da indústria.

Com o custo do hardware a descer e a complexidade do software a crescer, um grande número de administradores começou a colocar uma aplicação por servidor. Isto garantia-lhes o isolamento, onde uma aplicação não interferia com quaisquer outras aplicações. No entanto, passado algum tempo, esta postura na gestão de TI começou a resultar num problema conhecido como dispersão de servidores. Ou seja, havia muitos servidores com utilização média entre 5% e 15%. Além do custo do hardware, há também requisitos de energia e refrigeração para todos estes servidores o que fez com que o velho problema da utilização dos recursos de hardware surgisse novamente.

O crescimento das implementações de servidores e estações de trabalho x86 levou a uma nova infra-estrutura de TI e a novos desafios operacionais, nomeadamente:
  • Baixa utilização da infra-estrutura;
  • Aumento dos custos da infra-estrutura física;
  • Aumento dos custos de gestão;
  • Insuficiente capacidade de failover e protecção contra desastres;

Terminologia da Virtualização


Hóspedes e Anfitriões


Uma máquina virtual (VM) tem normalmente dois componentes: o servidor anfitrião (host)  e a máquina virtual hóspede (guest). O servidor anfitrião é o hardware subjacente que fornece recursos de computação, tais como poder de processamento, memória, E/S de rede e disco e assim por diante. A máquina virtual hóspede é uma instalação completamente separada e independente de um sistema operativo e software aplicacional. Os hóspedes são as cargas de trabalho virtuais que residem num servidor anfitrião e partilham os recursos de computação desse servidor.

Monitor de Máquina Virtual


Sistemas de máquina virtual são capazes de virtualizar um conjunto completo de recursos de hardware, incluindo um processador (ou processadores), memória e recursos de armazenamento e dispositivos periféricos. Um Monitor de Máquina Virtual (Virtual Machine Monitor ou VMM, também conhecido como hipervisor) é o pedaço de software que fornece a abstracção de uma máquina virtual. Há três propriedades de interesse quando se analisa o ambiente criado por um VMM:

  • Fidelidade ou Equivalência;
  • Segurança ou Controle de Recursos;
  • Desempenho ou Eficiência

Na terminologia de Popek e Goldberg, um VMM deve apresentar todas as três propriedades.

Critérios de Popek e Goldberg


Os critérios de Popek e Goldberg são um conjunto de condições suficientes para uma arquitectura de computador suportar a virtualização do sistema de forma eficiente. Foram introduzidos por Gerald Popek e Robert Goldberg no seu artigo de 1974 chamado “Formal Requirements for Virtualizable Third Generation Architectures” (Requisitos formais para arquitecturas de terceira geração virtualizáveis). O documento estabelece três características essenciais para que o software do sistema possa ser considerado um VMM:

  • Equivalência / Fidelidade: O software executado sob o VMM deve exibir um comportamento essencialmente idêntico ao que demonstra durante a execução directamente no hardware equivalente, salvo efeitos de temporização;

  • Eficiência / Performance: A grande maioria das instruções de máquina devem ser executadas pelo hardware sem a intervenção do VMM;

  • Controle de Recursos / Segurança: O VMM deve manter controlo total dos recursos virtualizados.

Apesar destes requisitos serem derivados de hipóteses simplificadoras, eles representam uma maneira conveniente de determinar se uma arquitectura de computador suporta virtualização eficiente e fornecem orientações para a concepção de arquitecturas de computadores virtualizadas.

Níveis de protecção da CPU


A arquitectura x86 oferece uma gama de níveis de protecção, também conhecidos como anéis, onde o código pode ser executado e que os sistemas operativos e as aplicações usam para gerir o acesso ao hardware do computador. O Anel 0 tem o nível mais alto de privilégios e é nesse anel que o núcleo (kernel) do sistema operativo normalmente funciona. O código em execução no anel 0 é considerado como sendo executado no “espaço do sistema”, em “modo kernel” ou “modo supervisor”. Todo o restante código, como as aplicações em execução no sistema operativo, actuam em anéis menos privilegiados, normalmente no anel 3.

Níveis de protecção da CPU

Lembrem-se que o nível de privilégio sobre a CPU não tem nada a ver com os utilizadores do sistema operativo; não importa que seja root, administrador, convidado ou um utilizador regular. Todo o código de utilizador é executado no anel 3 e todo o código do kernel é executado no anel 0, independentemente de quem seja o utilizador do SO em cujo nome o código funciona.

Anéis de protecção da CPU

O termo "anel" (tal como se aplica a máquinas de arquitectura x86 e Windows) parece referir-se ao desenho, no manual de referência da arquitectura 80386 original, dos quatro níveis de protecção como círculos concêntricos de operações. Assim, o Anel 3 era o anel mais exterior e fornecia a maior protecção, permitindo apenas a execução de instruções que não poderiam afectar o estado geral do processador. O Anel 0 era o anel interior e permitia o controlo total do processador.

Problemas da virtualização em x86


Ao contrário dos mainframes, a arquitectura x86 não foi concebida para suportar a virtualização completa porque nestes sistemas operativos, concebidos para serem executados directamente no hardware, certas instruções sensíveis esperam que o SO esteja a interagir directamente com o hardware, o que torna difícil realizar verdadeira virtualização (como definida pelos critérios de Popek e Goldberg).

Virtualizar a arquitectura x86 requer a colocação de uma camada de virtualização sob o sistema operativo (que espera estar no Anel 0) para criar e gerir as máquinas virtuais que oferecem recursos partilhados. Para complicar ainda mais a situação, algumas instruções sensíveis não podem ser efectivamente virtualizadas pois têm semânticas diferentes quando não são executadas no Anel 0. A dificuldade em capturar e traduzir estes pedidos de instrução sensíveis e privilegiados em tempo de execução foi o desafio que originalmente fez com que a virtualização da arquitectura x86 parecesse impossível.

A VMware foi a primeira companhia a encontrar uma forma de contornar esse obstáculo, por meio de um método chamado tradução binária em que as instruções privilegiadas eram capturadas por uma camada de software intérprete conhecido como Virtual Machine Monitor (VMM) e convertidas em instruções “seguras” que podiam ser virtualizadas.

Tradução Binária

Em 1998, a VMware descobriu como virtualizar a plataforma x86, desenvolvendo técnicas de tradução binária que permitem que o VMM seja executado no Anel 0 para isolamento e desempenho, enquanto se move o sistema operativo para um anel de nível de utilizador com mais privilégios do que as aplicações no anel 3, mas menos privilégios do que o VMM no Anel 0. Esta combinação de tradução binária e execução directa no processador permite que múltiplos sistemas operativos hóspedes sejam executados, em isolamento total, no mesmo computador.