Uma Máquina Virtual (VM) é um termo 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 no nível do 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 sistema qemu-kvm
, 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 têm uma CPU virtual, RAM, NIC, gráficos, etc, que o convidado acredita ser o artigo genuíno. Devido a isso, muitos sistemas operacionais diferentes podem ser instalados nas VMs e eles funcionam "fora da caixa" sem necessidade de modificação.
Embora isso seja muito conveniente, em que muitos SOs 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 é desenvolvido para o convidado, projetado para desempenho em um ambiente virtual.qemu-kvm
fornece o intervalo virtio
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 este sistema, existe apenas um kernel instalado - o kernel do host. Cada contêiner é simplesmente um isolamento dos processos do usuário. Por exemplo, um servidor da 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 ele é próprio. Outro container pode conter toda a instalação userland de uma distribuição Linux (contanto que essa distro seja capaz de rodar 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 de usuários. Por causa disso, não é possível instalar plataformas diferentes em um contêiner - não há Windows no Linux.
Geralmente, os contêineres são criados usando 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 do 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.
Há prós e contras em ambos e em 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 deles. que é o caso de hipervisores. Eles podem, portanto, ser executados em hardware de especificação inferior. No entanto, eles só podem executar convidados do Linux (em hosts Linux). Além disso, como compartilham o kernel, existe a possibilidade de que um contêiner comprometido possa afetar outro.
- Os hipervisores são mais seguros e podem executar sistemas operacionais diferentes porque um SO completo é instalado em cada VM e os convidados não estão cientes de outras VMs. No entanto, isso utiliza mais recursos no host, que deve ser relativamente poderoso.