Pesquisa de site

Configurando a pilha Libvirt QEMU e KVM no Debian


A virtualização baseada em QEMU-KVM está no centro da pilha de virtualização baseada em Linux. É gratuito e de código aberto e é uma das tecnologias de virtualização mais prevalentes em todo o setor. A maioria dos provedores de serviços em nuvem usa KVM e por um bom motivo. Ele oferece uma pilha de virtualização muito eficiente, mas muito segura, e não há licenciamento complicado para lidar. Este não é o caso de sua configuração típica de Hyper-V ou VMWare. A desvantagem, no entanto, é que a configuração pode ser muito complexa, especialmente para usuários inexperientes. Este artigo pretende reduzir essa complexidade para o leitor.

Com isso dito, vamos tentar configurar nosso próprio hypervisor KVM em um servidor Debian 9.

Ativando extensões VT-x ou AMD-V

Idealmente, você precisará de uma instalação limpa de sua distribuição Linux favorita em uma máquina (não uma VM) que tenha uma CPU bastante moderna. A maioria das CPUs Intel modernas suporta extensões VT-x e, da mesma forma, a AMD tem suas extensões AMD-V. Essas extensões são “aprimoramentos” embutidos no silício de sua CPU que permitem uma virtualização mais rápida e segura. Você precisa habilitar essas extensões no menu BIOS/UEFI da sua placa-mãe. Consulte o manual da placa-mãe para obter mais informações.

Se você não deseja manchar sua estação de trabalho Linux perfeitamente funcional, pode usar uma máquina virtual na nuvem para executar esses experimentos. A DigitalOcean, por exemplo, oferece máquinas virtuais com virtualização aninhada habilitada. Isso permite que você execute VMs dentro de sua VM hospedada na nuvem (isso é conhecido como virtualização aninhada). Obviamente, esta será uma maneira muito ineficiente de praticamente executar um hipervisor, mas como um experimento funcionará bem. Certifique-se de obter pelo menos 4 GB de memória e mais de 2 CPUs.

Depois de habilitar as referidas extensões, você pode verificar isso executando lscpu e procurando a entrada Virtualização:

$ lscpu
….
Virtualization:        VT-x
….

Agora que temos as extensões habilitadas, é hora de subir ainda mais na pilha.

Instalando KVM e QEMU

KVM (ou Kernel-Based Virtual Machine) consiste em alguns módulos de kernel do Linux que aproveitarão as extensões de CPU que habilitamos anteriormente. O QEMU, por outro lado, consiste em vários programas de userland que nos fornecem recursos de emulação. Como um software independente, o QEMU pode ser usado para executar programas de uma arquitetura, como ARM, em outra como x86_64 e vice-versa. Ele pode ser usado para executar qualquer coisa, desde um único arquivo binário até um sistema operacional completo.

Iremos, é claro, usá-lo apenas para virtualizar sistemas operacionais x86_64 na plataforma x86_64. E para isso precisamos apenas de um único pacote:

$ sudo apt install qemu-kvm

Você pode verificar se o pacote carregou todos os módulos necessários executando:

$ lsmod | grep kvm
kvm_intel             200704  0
kvm                   598016  1 kvm_intel
irqbypass              16384  1 kvm

Isso é tudo que você precisa, teoricamente. Mas você logo perceberá que isso é prático. As máquinas virtuais são extremamente complexas e exigimos um wrapper de software para gerenciar todas as várias demandas, como rede, gerenciamento de sistema de arquivos, etc., de maneira bastante automatizada (e escalável). Para fazer isso, precisamos da biblioteca/daemon de virtualização Libvirt.

Instalando o Libvirt

Libvirt é uma parte essencial de sua pilha de virtualização. O daemon libvirtd executa serviços relacionados à virtualização em segundo plano. Serviços que escutam solicitações como “Create a VM ”, “Destroy a VM ”, “Create a Network ”, etc e as executam nelas usando os utilitários básicos do Linux como qemu binários, iptables, etc.

Libvirt é muito generalizado e pode ser usado para gerenciar convidados KVM, contêineres LXC e pilha de virtualização Xen. Vamos nos concentrar apenas no Libvirt para convidados KVM por enquanto. Libvirtd expõe uma API que pode ser consumida por aplicativos GUI como virt-manager ou oVirt ou ferramentas de linha de comando como virt-install, virsh, etc. Podemos escrever até mesmo nossos próprios clientes personalizados que usam a mesma API padrão. Estaremos usando as ferramentas de linha de comando, como virsh e virt-install, para manter as coisas padronizadas.

Vamos instalar todas essas ferramentas:

$ apt install libvirt-clients libvirt-daemon-system virtinst

Também precisaremos de outro pacote libguestfs-tools, para nos ajudar a editar ou modificar os discos rígidos e sistemas de arquivos da VM convidada.

Ótimo! Agora nós instalamos toda a pilha e sabemos como a arquitetura está disposta. Para usar libvirt (e ferramentas relacionadas), adicione seu usuário aos grupos libvirt-qemu e libvirt.

$ sudo usermod -aG libvirt <username>
$ sudo usermod -aG libvirt-qemu <username>

Ou execute os comandos como usuário root.

Virsh e Iniciando a Rede Padrão

O utilitário de linha de comando virsh é algo que você usará muito ao gerenciar suas VMs. Você pode simplesmente digitar virsh e entrar na interface de linha de comando virsh ou digitar virsh [Opções] em seu shell normal. Percorra a saída da ajuda do virsh sempre que estiver preso em alguma operação relacionada à VM.

O primeiro comando virsh que usaremos invocará a rede padrão à qual uma VM pode se conectar:

$ virsh net-autostart default
$ virsh net-start default

Isso iniciará a rede padrão e garantirá que ela seja iniciada automaticamente quando o host for reinicializado. Para verificar os detalhes sobre esta rede padrão, use o comando:

$ virsh net-dumpxml default
<network>
<name>default</name>
<uuid>3d723dc6-49a4-4f73-bf6d-623d6b46b099</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:4d:1b:02'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>

O arquivo xml pode mostrar o intervalo de possíveis endereços IP e como eles se comunicarão com o mundo exterior. Basicamente, o tráfego chegará a eles por meio de um NAT e eles não farão parte da rede externa do seu host. Você pode usar o Bridge Networking para expor cada VM à LAN da máquina host.

Para iniciar uma máquina virtual

Para iniciar uma máquina virtual, precisamos de uma mídia de instalação (como o ISO de instalação para qualquer sistema operacional) e quantas CPUs e quanta memória precisa ser alocada para a VM e se ela precisa de VNC. Esta etapa é onde você pode realmente apreciar um instalador GUI como virt-manager, no entanto, faremos isso usando um comando virt-install bastante complexo.

Eu gosto de manter todas as minhas mídias de inicialização em /var/lib/libvirt/boot e todas as VMs e seus discos rígidos virtuais em /var/lib/libvirt/images (o local padrão), o que simplifica a organização.

$ cd /var/lib/libvirt/boot
$ wget http://releases.ubuntu.com/18.04.2/ubuntu-18.04.2-desktop-amd64.iso

O comando acima busca o ISO da área de trabalho do Ubuntu, você pode facilmente obter o CentOS ou qualquer outra distribuição que desejar.

Para criar uma nova VM e inicializá-la, execute:

$ virt-install --virt-type kvm \
--name myVM \
--memory 2048 --vcpus=2 \
--cdrom /var/lib/libvirt/boot/ubuntu-18.04.2-desktop-amd64.iso \
--disk size=40 \
--graphics vnc,listen=0.0.0.0,port=5900 \
--noautoconsole

O comando acima é, de fato, complicado. Sugiro salvar esses comandos em arquivos de texto e executá-los como scripts executáveis sempre que você criar uma nova VM. A maioria dos parâmetros como virt-type e virt-name são bastante auto-explicativos. Eles são apenas tediosos para escrever.

A última opção para exibição VNC iniciará um servidor VNC e permitirá que você tenha acesso de console à sua VM remotamente, conectando-se à porta 5900 do host. Abra um cliente VNC em sua área de trabalho e acesse o IP do host KVM na porta 5900 Certifique-se de acessar o IP do host e não o IP da VM. Seu VNC se conectará à saída de vídeo de sua VM e você poderá prosseguir com a instalação.

Onde a próxima?

A partir daqui, você pode tentar pausar, parar e excluir as VMs. Você também pode modificar a infraestrutura subjacente adicionando pools para armazenamento e configurando redes de ponte. Todos os arquivos de configuração, para VMs individuais, interfaces de rede e pools de armazenamento, são armazenados em /etc/libvirt/ e /etc/libvirt/qemu.

Às vezes, você terá que excluir fisicamente os arquivos do disco rígido salvos em /lib/libvirt/images, mesmo depois de remover a VM do libvirt. Para automatizar ainda mais as coisas, tente importar imagens qcow2 que a maioria das distribuições Linux como Ubuntu e CentOS. Estes têm o sistema operacional pré-instalado neles.

Conclusão

Configurar isso não é tão fácil quanto configurar o VirtualBox e a razão por trás disso é múltipla. A maior parte da pilha é complicada porque foi projetada para ser modular e altamente escalável. Ele não faz suposições sobre onde você está executando a VM. O ambiente pode ser um desktop pessoal ou um centro de dados. Trabalhar com uma GUI pode ajudar a reduzir essa complexidade até certo ponto. No entanto, esses sistemas são projetados para funcionar com uma API REST para se conectar aos sistemas de cobrança, sistemas de monitoramento etc. de sua organização. Eles quase nunca são tocados por um humano após a implantação.

Dito isso, automação é o nome do jogo com libvirt e qemu-kvm. Examine a documentação oficial e escreva seu próprio script interessante para ativar uma frota de VMs e nos informe se achou este tutorial útil.

Artigos relacionados: