Uma máquina virtual (VM) é um termo bastante genérico para muitas tecnologias de virtualização.
Existem muitas variações nas tecnologias de virtualização, mas as principais são:
- Virtualização em nível de hardware
- Virtualização em nível de sistema operacional
qemu-kvm
e VMWare
são exemplos do primeiro. Eles empregam um hipervisor para gerenciar os ambientes virtuais nos quais um sistema operacional completo é executado. Por exemplo, em um qemu-kvm
sistema, você pode ter uma VM executando o FreeBSD, outra executando o Windows e outra executando o Linux.
As máquinas virtuais criadas por essas tecnologias se comportam como computadores individuais isolados para o convidado. Estes possuem uma CPU virtual, RAM, NIC, gráficos, etc. que o hóspede acredita serem o artigo original. Por esse motivo, muitos sistemas operacionais diferentes podem ser instalados nas VMs e eles funcionam "prontos para uso" sem nenhuma modificação necessária.
Embora isso seja muito conveniente, como muitos sistemas operacionais serão instalados sem muito esforço, há uma desvantagem em que o hipervisor precisa simular todo o hardware, o que pode atrasar as coisas. Uma alternativa é o hardware para-virtualizado, no qual um novo dispositivo e driver virtual são desenvolvidos para o convidado, projetado para desempenho em um ambiente virtual. qemu-kvm
forneça a virtio
variedade de dispositivos e drivers para isso. Uma desvantagem disso é que o sistema operacional convidado deve ser suportado; mas, se suportado, os benefícios de desempenho são ótimos.
lxc
é um exemplo de virtualização no nível do sistema operacional ou contêineres. Sob esse sistema, existe apenas um kernel instalado - o kernel host. Cada contêiner é simplesmente um isolamento dos processos da terra do usuário. Por exemplo, um servidor web (por exemplo apache
) é instalado em um contêiner. No que diz respeito ao servidor web, o único servidor instalado é ele próprio. Outro contêiner pode estar executando um servidor FTP. Esse servidor FTP não está ciente da instalação do servidor da Web - apenas ela é sua. Outro contêiner pode conter a instalação completa do usuário de uma distribuição Linux (desde que essa distribuição seja capaz de executar com o kernel do sistema host).
No entanto, não há instalações separadas do sistema operacional ao usar contêineres - apenas instâncias isoladas de serviços da terra do usuário. Por esse motivo, você não pode instalar plataformas diferentes em um contêiner - sem Windows no Linux.
Os contêineres geralmente são criados usando a chroot
. Isso cria uma raiz privada separada ( /
) para um processo para trabalhar. Ao criar muitas raízes privadas individuais, os processos (servidores da Web ou uma distribuição Linux, etc) são executados em seu próprio sistema de arquivos isolado. Técnicas mais avançadas, como cgroups
podem isolar outros recursos, como rede e RAM.
Existem prós e contras em ambos e muitos debates de longa duração sobre qual é o melhor.
- Os contêineres são mais leves, pois um sistema operacional completo não está instalado para cada um; qual é o caso dos hipervisores. Portanto, eles podem ser executados em hardware com especificações mais baixas. No entanto, eles podem executar apenas convidados Linux (em hosts Linux). Além disso, como eles compartilham o kernel, existe a possibilidade de que um contêiner comprometido possa afetar outro.
- Os hipervisores são mais seguros e podem executar diferentes sistemas operacionais porque um sistema operacional completo está instalado em cada VM e os convidados não conhecem outras VMs. No entanto, isso utiliza mais recursos no host, o que deve ser relativamente poderoso.