Mochileiro T.I
Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

QEMU/KVM para Virtualização em Linux

Embora existam várias soluções para ambientes de virtualização de máquinas, dentre as quais destacam-se o VirtualBox e VMware, há também a possibilidade de virtualização através da combinação QEMU/KVM.

Digo combinação visto que QEMU e KVM são coisas distintas que juntas podem fornecer uma poderosa ferramenta de virtualização em ambientes Linux.

Geralmente esse tipo de virtualização oferece melhor desempenho principalmente devido a virtualização nativa no kernel e por dispensar o uso de uma camada adicional de software.

Em outras palavras, o VirtualBox e Wmware oferecem um ambiente de virtualização com hypervisor tipo 2, ou seja, necessitam do SO hospedeiro para gerenciar os recursos de hardware.

O QEMU/KVM por sua vez consegue rodar diretamente no hardware do hospedeiro, sem depender de uma camada extra para acessá-lo, tornando-o dessa forma mais eficiente.

Portanto, se você é um usuário Linux fique ligado e acompanhe o restante do artigo! Nele abordaremos a instalação do QEMU/KVM, sua configuração, além de aprender como criar máquinas virtuais.

Além disso veremos como fazer da forma mais simples com a interface gráfica Virt Manager e pela menos amigável mas poderosa linha de comando.

Uma breve introdução ao QEMU/KVM

O QEMU, abreviação de Quick Emulator, é um emulador e virtualizador de hardware que pode emular um sistema completo (processador, dispositivos, memória, etc) e permitir dessa forma, a execução de sistemas operacionais de diferentes arquiteturas.

Um exemplo clássico são os emuladores de vídeo game que emulam o hardware do console e possibilitam dessa maneira a execução de seus jogos.

Porém, como cada instrução da CPU precisa ser convertida e processada, seu desempenho é muito mais lento que um ambiente virtualizado.

É aí que entra o KVM, ou Kernel-based Virtual Machine, um módulo do kernel Linux que transforma o sistema em um hypervisor.

Em outras palavras, ele permite que um sistema operacional convidado rode “diretamente” no hardware real, sem a necessidade da conversão e processamento de instruções de um sistema emulado, o que torna a virtualização muito mais rápida.

Por ser um módulo do kernel Linux, certamente não conseguimos executá-lo como um programa como fazemos com o QEMU.

Portanto, quando desejamos que o QEMU utilize o KVM, precisamos informá-lo através do parâmetro -enable-kvm na linha de comando.

Mas não se preocupe em entender os detalhes de linha de comando dos executáveis do QEMU, existem ferramentas e interfaces gráficas que facilitam muito toda a interação com ele.

Instalação do QEMU/KVM no Ubuntu

A utilização do ambiente de virtualização requer a instalação de alguns pacotes, portanto observe abaixo:

sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils cpu-checker -y

Isso deve atualizar a lista de pacotes e instalar as dependências necessárias. Em seguida, podemos verificar através desse comando se nosso sistema está apto para rodar máquinas virtuais:

kvm-ok

Como resultado você deverá ver a seguinte mensagem:

INFO: /dev/kvm exists
KVM acceleration can be used

Além das dependências, também é interessante adicionar seu usuário do grupo do libvirt, que nada mais é que uma API unificada para gerenciamento de VMs, como por exemplo as que criaremos com QEMU/KVM.

sudo usermod -aG libvirt $(whoami)

Em alguns casos o serviço do libvirt (libvirtd) fica desabilitado por padrão, no entanto habilitá-lo é bastante simples. Primeiramente verifique se ele está ativo:

systemctl status libvirtd

Se tudo estiver em ordem, uma saída semelhante a essa deverá aparecer:

Status libvirtd

Caso contrário, você pode habilitar e iniciar o serviço com o comando abaixo:

sudo systemctl enable --now libvirtd

Agora nosso sistema operacional está pronto para criar e rodar máquinas virtuais.

Criação de VM por linha de comando

Apesar de possível criar máquinas virtuais diretamente pelo QEMU, seu grau de complexidade é razoavelmente alto e portanto, aconselho utilizar outras formas que abstraiam pelo menos um pouco dessa complexidade.

Nesse sentido existe o virt-install, um programa de linha comando mais simples que permite criar máquinas virtuais de maneira um pouco menos complicada.

Vamos criar uma nova VM que rodará uma versão bem leve e rápida do Linux chamada Tiny Core Linux para demonstrar seu funcionamento.

Primeiramente baixe a iso do sistema e salve-a onde for melhor para você, no meu caso deixei na pasta padrão de downloads do Ubuntu.

Em seguida, rode este comando não se esquecendo de adaptar o parâmetro “cdrom” para o local do seu arquivo iso:

sudo virt-install --name tinycore --os-variant linux2022 --vcpus 2 --ram 2048 --cdrom ~/Downloads/CorePlus-current.iso --network bridge=virbr0,model=virtio --graphics spice

Explicações:

  • –name: define o nome da máquina virtual, neste caso será chamada de tinycore. É importante definir um nome de modo que possamos referenciar a VM em futuros comandos.
  • –os-variant: determina a variante do sistema operacional da máquina virtual de forma que o virt-install possa ajustar parâmetros como o kernel, inicialização e outros detalhes. Nesse caso o nome “linux2022” é uma configuração genérica uma vez que não existe opção específica para o Tiny Core Linux.
  • –vcpus: define a quantidade de CPUs virtuais a máquina terá, nesse caso são duas.
  • –ram: define a quantidade de memória ram disponível para a VM, nesse caso 2048GB
  • –cdrom: especifica a iso do sistema, de modo que possamos instalá-lo dentro da VM
  • –network: configuração de rede que, neste caso, está em modo bridge. O virbr0 é o adaptador de rede virtual e o model=virtio é o tipo do adaptador de rede. O virtio é um tipo de interface de alto desempenho para máquinas virtuais.
  • –graphics: define a interface gráfica da máquina virtual. Entenda que essa interface é apenas uma janela que permite a visualização do “conteúdo” da VM, seja de seu gerenciador de janelas ou até mesmo do modo texto no caso de servidores. Neste exemplo, a interface chama-se SPICE, no entanto, poderíamos dispensá-la com a opção “none” e acessar a VM por SSH, por exemplo.

Como resultado, a VM do Tiny Core carregará e após alguns segundos sua versão live estará ativa conforme abaixo:

Tiny Core Linux VM

Gerenciamento da VM por linha de comando

Enquanto o virt-install, conforme o próprio nome sugere, cuida apenas da instalação da máquina virtual e sua “primeira execução”, outros comandos cuidam do gerenciamento e configuração destas VMs.

O mais famoso chama-se virsh e sua função é cuidar de diversos aspectos, desde iniciar, pausar, suspender, reiniciar VMs até configurar o hardware envolvido como por exemplo memória, cpu, discos, rede, etc .

Além disso ele pode lidar com snapshots, controle de acesso e segurança, monitoramento e diagnóstico de sistema e várias outras coisas.

Na verdade, igualmente ao virt-install, o virsh também pode criar VM’s. No entanto, o processo é bem mais complexo e fazê-lo via virt-install é muito mais conveniente.

Dada sua complexidade e extensão, não abordarei aqui todos os aspectos do virsh e sim aqueles que mais nos interessam.

Veja, por exemplo, como iniciar a nossa VM de exemplo (supondo que tenha sido desligada após o virt-install)

virsh start tinycore

Nesse momento, você ficará em dúvida se o comando realmente funcionou uma vez que nada aparece. Isso ocorre porque precisamos nos conectar à VM:

remote-viewer spice://127.0.0.1:5900

E mais uma vez você será induzido a pensar que tudo deu errado, afinal ao invés de ver o desktop do Tiny Core, você verá isso:

Tiny Core Boot Error

Isso ocorre porque o virt-install monta temporariamente a nossa ISO de instalação, ou seja, apenas durante a primeira execução.

Como não instalamos o sistema e desligamos a VM, o próximo boot ocorre sem a nossa ISO e assim, falha. Portanto, para voltar a funcionar como antes, precisamos tornar a mídia de instalação permanente no CDROM virtual.

Primeiramente temos que editar o arquivo de configuração da máquina virtual com o comando:

virsh edit tinycore

Escolhe seu editor de texto preferido e procure onde o CDROM está definido, modificando-o:

<disk type='file' device='cdrom'>
      <driver name='qemu'/>
      <source file='/home/seu-usuario/Downloads/CorePlus-current.iso'/>
      <target dev='sda' bus='sata'/>
      <readonly/>
      <boot order='2'/>
      <alias name='sata0-0-0'/>
</disk>

Salve o arquivo e encerre a VM forçando seu desligamento com o comando (ou se preferir feche a janela da VM):

virsh destroy tinycore

Inicie novamente a máquina virtual do Tiny Core e dessa vez, tudo estará conforme antes:

virsh start tinycore && remote-viewer spice:127.0.0.1:5900

A salvação Virt-Manager!

Embora a linha de comando tenha suas vantagens, você pôde perceber que ela é bastante trabalhosa principalmente para quem não está habituado com estes comandos.

Geralmente utilizamos essa abordagem quando o ambiente gráfico não está disponível ou quando precisamos automatizar alguma tarefa, neste caso a manipulação de VMs.

Certamente há casos mais específicos que demandam a linha de comando, mas para todos os outros, a interface gráfica é uma boa saída facilita bastante nossa vida.

Pensando nisso, a comunidade criou o Virt-Manager, uma interface que lida com o libvirt e de forma transparente, usa os comandos virsh e virt-install (e outros) em nosso lugar.

Instalação

Por ser amplamente utilizado, o encontramos facilmente no repositório do Ubuntu:

sudo apt install virt-manager

E sua interface é igualmente simples:

Virt-Manager

Agora precisamos criar uma conexão com o QEMU/KVM que, neste caso, será local (existe a possibilidade de conectá-lo remotamente via SSH).

Nesse sentido, clique em File e em seguida em Add Connection…:

Virt-Manager add connection

Por fim clique em “Connect” e a conexão estará criada.

Criando uma máquina virtual QEMU/KVM

A criação da VM agora fica muito simplificada, bastando seguir apenas um assistente de instalação contendo cinco passos.

Assim sendo, clique no primeiro botão à esquerda (Create a new virtual machine) e a primeira tela perguntando como desejamos instalar o sistema operacional aparecerá.

No nosso exemplo, uma vez que temos a ISO de instalação, deixamos a seleção do jeito que está (Local install media).

Virt-Manager create step 1 of 5

Em seguida apontamos para onde está a ISO de instalação, portanto selecione arquivo do Tiny Core anteriormente baixado. Além disso, precisamos dizer ao Virt-Manager qual sistema operacional está sendo instalado.

Normalmente ele detecta a versão correta sozinho mas, neste caso, por algum motivo o Virt-Manager não o fez. Portanto, desmarque a caixa “Automatically detect from the installation media / source” e digite “Generic Linux 2022”.

Escolhermos uma versão genérica pois o Virt-Manager não possui o Tiny Core em sua lista de sistemas.

Virt-Manager step 2 of 5

O próximo passo apenas sugere a quantidade de memória RAM e CPUs que desejamos em nossa VM, podemos deixar como está:

Virt-Manager step 3 of 4

Em seguida determinamos o tamanho do disco virtual. Embora o Virt-Manager sugira um disco de 25GB, não precisaremos de todo esse espaço. Portanto, para fins de teste, podemos deixar algo em torno de 5GB:

Virt-Manager step 4 of 5

Por fim, nomeamos nossa VM e conferimos as configurações anteriormente selecionadas. Clique em “Finish” e a máquina virtual será criada e carregada.

Virt-Manager step 5 of 5
Virt-Manager Tiny Core

Perceba que agora temos listada a nossa nova VM no gerenciador e assim podemos parar, pausar, inicializar, etc:

Virt-Manager Gerenciador

Interagindo com a máquina virtual

No início do artigo, quando abordamos a criação e gerenciamento de VMs por linha de comando, tivemos que visualizar a VM recém-inicializada (com “virsh start”) através do comando remote-viewer.

No virt-manager não é diferente, no entanto, não precisamos da complexidade do comando para atingir nosso objetivo.

Dessa maneira, clicar no botão verde “start” apenas inicializada a VM e para visualizá-la precisamos clicar em “Open”.

Virt-Manager Viewer

Repare que nessa janela de visualização ainda conseguimos dar comandos de inicializar, pausar, etc, além de poder ajustarmos as configurações da VM clicando no botão azul “Show virtual hardware details”.

Virt-Manager Config

Aqui é importante ressaltar que podemos alterar essas configurações apenas quando a VM está parada. Nessa janela, podemos alterar as configurações antes fornecidas ao assistente e muitas outras, como por exemplo ajustes de boot, teclado, mouse, som e assim por diante.

Conclusão

Usuários Linux ou interessados em criar servidores de virtualização deveriam, na minha opinião, considerar a possibilidade de implantar VMs gerenciadas pelo QEMU/KVM.

Digo isso porque essa solução utiliza um hypervisor de nível 1 e portanto tem melhor desempenho frente a seus “concorrentes” VirtualBox e WMware que utilizam hypervisores de nível 2.

Em contrapartida, eles costumam ser mais atrativos que o QEMU/KVM para muitos usuários, principalmente pela facilidade de uso e compatibilidade com múltiplas plataformas.

Ambos VirtualBox e Wmware, possuem vasto leque de configurações e assim podem ser ajustados para ambientes bastante específicos.

No entanto, conforme vimos, o QEMU/KVM não deixa nada a desejar neste quesito adaptando-se naturalmente em sistemas Linux.

Portanto, analise os prós e os contras de cada um para fazer uma escolha segura e poupar tempo e esforço!

Espero ter ajudado!

Até a próxima!