KVM e QEMU no Linux: Guia Prático para Criar Máquinas Virtuais

setembro 1, 2026 · 11 min de leitura · Luiz Seabra

KVM e QEMU no Linux: Guia Prático de Virtualização de Alta Performance

Introdução

Virtualização de tipo 1 (bare‑metal) ou tipo 2 leve é vital para administradores de sistemas, arquitetos DevOps e entusiastas de homelabs. No Linux, a combinação de KVM (Kernel‑based Virtual Machine) com QEMU (Quick Emulator) e libvirt fornece uma solução de virtualização de alto desempenho, escalável e de nível enterprise, sem custos de licenciamento. Este artigo traz uma abordagem completa para criar, gerenciar e otimizar máquinas virtuais.

O que você vai aprender

  • Diferença entre KVM, QEMU e libvirt.
  • Verificação de hardware (VT‑x / AMD‑V) e instalação.
  • Gerenciamento via CLI com virsh e virt‑install.
  • Manipulação de imagens de disco com qemu‑img (qcow2 vs raw, snapshots).
  • Configuração de redes (NAT, Bridged/macvtap, VLANs).
  • Pass‑through de dispositivos (PCI/USB).
  • Otimização de performance (virtio, CPU pinning, hugepages).
  • Laboratório reproduzível com 2 VMs em rede de ponte.
  • Troubleshooting avançado e práticas de segurança.

Pré‑requisitos

  • Processador x86_64 com suporte a VMX (Intel) ou SVM (AMD) ativado na BIOS/UEFI.
  • Distribuição Linux moderna (Ubuntu 22.04 LTS, Debian 12 ou Fedora 40).
  • Usuário com privilégios sudo e suporte a grupos kvm e libvirt.
  • Mínimo 8 GB RAM (16 GB+ recomendado) e SSD para armazenamento das VMs.

Conceitos fundamentais

Componente Papel Descrição
KVM Kernel Module Módulo que transforma o Linux em Hypervisor Tipo 1. Fornece o controle das extensões de hardware (VT‑x/AMD‑V).
QEMU Emulador / Device Model Emula dispositivos de hardware (IDE, VGA, NIC) e fornece a camada de execução que o KVM acelera.
Libvirt API / Daemon (libvirtd) Abstrai a gestão de KVM/QEMU (e outros hypervisors) através de uma API unificada, CLI (virsh) e GUI (virt-manager).
Virtio Drivers paravirtualizados Comunicação direta entre o SO Guest e o Host para E/S (disco, rede, memória) de altíssimo desempenho.

Arquitetura KVM/QEMU/Libvirt

+-------------------------------------------------------------+
|                 Aplicações de Gerenciamento                 |
|             (virsh / virt-manager / Terraform)              |
+------------------------------+------------------------------+
                               | API
+------------------------------v------------------------------+
|                        Daemon Libvirt                       |
+------------------------------+------------------------------+
                               |
+------------------------------v------------------------------+
|                            QEMU                             |
|          (Emulação de Dispositivos e Drivers Virtio)         |
+------------------------------+------------------------------+
                               | ioctl
+------------------------------v------------------------------+
|                         Módulo KVM                          |
|                     (Kernel Linux Host)                     |
+-------------------------------------------------------------+
|                 Hardware Físico (CPU/RAM/I/O)               |
+-------------------------------------------------------------+

Preparação do ambiente

1. Verificar suporte do processador

# Verificar se as extensões VMX/SVM estão disponíveis no Kernel
egrep -c '(vmx|svm)' /proc/cpuinfo

Resultado esperado: Número maior que 0 (ex.: 4 ou 8 dependendo das threads).

Instale o utilitário cpu-checker no Ubuntu/Debian para confirmação explícita:

sudo apt update && sudo apt install -y cpu-checker
kvm-ok

Resultado esperado: INFO: /dev/kvm exists e KVM acceleration can be used.

2. Instalação dos pacotes necessários

No Ubuntu 22.04 / Debian 12:

sudo apt update
sudo apt install -y \
  qemu-system-x86 \
  libvirt-daemon-system \
  libvirt-clients \
  bridge-utils \
  virtinst \
  virt-manager \
  qemu-utils

No RHEL 9 / Fedora:

sudo dnf groupinstall -y "Virtualization Headless"
sudo dnf install -y virt-install virt-manager qemu-img

3. Configurar permissões do usuário

Adicione seu usuário atual aos grupos kvm e libvirt para gerenciar VMs sem sudo:

sudo usermod -aG kvm,libvirt $USER
newgrp libvirt

Verifique se o serviço libvirtd está ativo:

sudo systemctl enable --now libvirtd
sudo systemctl status libvirtd

Tutorial passo a passo

Etapa 1 – Gerenciamento de discos com qemu-img

O formato qcow2 (QEMU Copy-On-Write) é o mais recomendado por suportar expansão dinâmica, criptografia, compressão e snapshots. O formato raw é mais simples e pode ter uma ligeira vantagem em I/O sequencial.

# Criar um disco de 20GB no formato qcow2 com pré-alocação otimizada (metadata)
qemu-img create -f qcow2 -o preallocation=metadata /var/lib/libvirt/images/disk-srv01.qcow2 20G

# Checar informações do disco criado
qemu-img info /var/lib/libvirt/images/disk-srv01.qcow2

# Converter de RAW para QCOW2 (caso necessário)
# qemu-img convert -f raw -O qcow2 disco.raw disco.qcow2

Etapa 2 – Instalação de VM via CLI com virt-install

Crie uma VM automatizada sem interface gráfica (usando console serial):

sudo virt-install \
  --name web-server-01 \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/disk-srv01.qcow2,format=qcow2,bus=virtio \
  --network network=default,model=virtio \
  --os-variant ubuntu22.04 \
  --location 'https://releases.ubuntu.com/22.04/ubuntu-22.04.4-live-server-amd64.iso',kernel=casper/vmlinuz,initrd=casper/initrd \
  --graphics none \
  --extra-args 'console=ttyS0,115200n8 serial'

Etapa 3 – Comandos vitais do virsh

Ação Comando virsh
Listar VMs ativas virsh list
Listar todas as VMs virsh list --all
Iniciar VM virsh start web-server-01
Desligar gracioso (ACPI) virsh shutdown web-server-01
Forçar desligamento virsh destroy web-server-01
Habilitar boot automático virsh autostart web-server-01
Acessar console serial virsh console web-server-01 (Sair com Ctrl + ])
Editar XML da VM virsh edit web-server-01
Remover VM e seus discos virsh undefine web-server-01 --remove-all-storage

Etapa 4 – Configuração de Rede: NAT vs Bridged (Ponte)

Por padrão, a libvirt fornece a rede default em modo NAT (192.168.122.0/24). Para expor VMs diretamente na sua LAN física, crie uma Bridge Linux.

Exemplo usando Netplan no host Ubuntu (/etc/netplan/01-netcfg.yaml):

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
  bridges:
    br0:
      interfaces: [eth0]
      dhcp4: yes
      parameters:
        stp: false
        forward-delay: 0

Aplique com sudo netplan apply. Em seguida, crie o XML de rede para a libvirt (bridge-network.xml):

<network>
  <name>host-bridge</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>

Defina e ative no libvirt:

virsh net-define bridge-network.xml
virsh net-start host-bridge
virsh net-autostart host-bridge

Etapa 5 – Snapshots com virsh

# Criar snapshot em tempo de execução (External/Internal)
virsh snapshot-create-as --domain web-server-01 \
  --name "pre-upgrade-nginx" \
  --description "Snapshot antes de atualizar o Nginx"

# Listar snapshots
virsh snapshot-list web-server-01

# Reverter para o snapshot
virsh snapshot-revert web-server-01 --snapshotname "pre-upgrade-nginx"

Laboratório: Provisionando cluster de 2 VMs com rede interna isolada

Neste laboratório, criaremos uma rede isolada privada (lab-net) e 2 VMs Debian para simular uma arquitetura Web + Banco de Dados.

                 +-----------------------------------+
                 |           Host Linux              |
                 |      Rede libvirt: lab-net        |
                 |         (10.10.50.0/24)           |
                 +--------+-----------------+--------+
                          |                 |
            10.10.50.10   |                 |   10.10.50.20
            +-------------+--+           +--+-------------+
            |    VM 01       |           |     VM 02      |
            | (app-server)   |           |  (db-server)   |
            +----------------+           +----------------+

1. Criar arquivo de definição de rede privada (lab-network.xml)

<network>
  <name>lab-net</name>
  <bridge name='virbr10' status='unmanaged'/>
  <ip address='10.10.50.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='10.10.50.10' end='10.10.50.100'/>
      <host mac='52:54:00:00:00:10' name='app-server' ip='10.10.50.10'/>
      <host mac='52:54:00:00:00:20' name='db-server' ip='10.10.50.20'/>
    </dhcp>
  </ip>
</network>
virsh net-define lab-network.xml
virsh net-start lab-net

2. Criar discos e instalar as VMs

# Discos
qemu-img create -f qcow2 /var/lib/libvirt/images/app-server.qcow2 10G
qemu-img create -f qcow2 /var/lib/libvirt/images/db-server.qcow2 10G

# VM 1: App Server
sudo virt-install \
  --name app-server \
  --ram 1024 --vcpus 1 \
  --disk path=/var/lib/libvirt/images/app-server.qcow2,bus=virtio \
  --network network=lab-net,mac=52:54:00:00:00:10,model=virtio \
  --os-variant debian11 \
  --location 'https://deb.debian.org/debian/dists/bullseye/main/installer-amd64/' \
  --graphics none --extra-args 'console=ttyS0'

# VM 2: DB Server
sudo virt-install \
  --name db-server \
  --ram 1024 --vcpus 1 \
  --disk path=/var/lib/libvirt/images/db-server.qcow2,bus=virtio \
  --network network=lab-net,mac=52:54:00:00:00:20,model=virtio \
  --os-variant debian11 \
  --location 'https://deb.debian.org/debian/dists/bullseye/main/installer-amd64/' \
  --graphics none --extra-args 'console=ttyS0'

3. Validação do laboratório

Acesse a VM app-server e faça um teste de conectividade com a VM db-server:

virsh console app-server
# Dentro do app-server:
ping -c 3 10.10.50.20

Resultado esperado: As duas máquinas se comunicam perfeitamente através do switch virtual da libvirt.

Troubleshooting: Erros comuns e soluções

1. Sintoma: error: failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied

  • Possível Causa: O usuário corrente não está no grupo libvirt.
  • Diagnóstico: Executar id e verificar a ausência de libvirt.
  • Solução: Run sudo usermod -aG libvirt $USER e depois faça re-login ou execute newgrp libvirt.
  • Prevenção: Automatizar a criação de usuários com Ansible ou scripts de pós-instalação adicionando ao grupo.

2. Sintoma: error: Could not start domain: Storage pool 'default' is not active

  • Possível Causa: O Pool de Armazenamento padrão da libvirt desativou.
  • Diagnóstico: virsh pool-list --all mostra status inactive.
  • Solução:
    bash
    virsh pool-start default
    virsh pool-autostart default
  • Prevenção: Garantir que o autostart do pool esteja ativado.

3. Sintoma: Lentidão excessiva na gravação de E/S dentro do Guest.

  • Possível Causa: Utilização de drivers de disco emulados antigos (IDE/SATA) em vez de virtio, ou cache=writethrough.
  • Diagnóstico: Inspecione o XML com virsh dumpxml <vm_name> e procure por <target dev='hda' bus='ide'/>.
  • Solução: Altere a especificação do disco no XML da VM para usar bus='virtio' e ajuste o cache:
    xml
    <driver name='qemu' type='qcow2' cache='none' io='native'/>
    <target dev='vda' bus='virtio'/>
  • Prevenção: Sempre utilize a flag bus=virtio na chamada do virt-install.

4. Sintoma: Sem endereço IP atribuído à VM no modo NAT.

  • Possível Causa: O serviço dnsmasq interno da libvirt travou ou o firewall (iptables/nftables) está bloqueando as requisições DHCP.
  • Diagnóstico: virsh net-dhcp-leases default.
  • Solução: Reinicie a rede libvirt:
    bash
    virsh net-destroy default
    virsh net-start default

Segurança em Ambientes Virtualizados

  • sVirt (SELinux / AppArmor): O libvirt integra-se ao SELinux/AppArmor dinamicamente rotulando cada processo QEMU com uma categoria isolada (ex: svirt_t). Mantenha o SELinux/AppArmor em modo Enforcing.
  • CPU Model Passthrough vs Security: Evite usar host-passthrough em clusters heterogêneos de migração ao vivo (live-migration), pois expõe instruções da CPU física. Para nós isolados, host-passthrough melhora a performance.
  • Desativar interfaces gráficas desnecessárias: Evite escutar o VNC/SPICE em 0.0.0.0. Restrinja a 127.0.0.1 ou utilize TLS.
  • Criptografia de disco: Use arquivos Qcow2 criptografados com LUKS ou suporte nativo QEMU para dados sensíveis no host.

Boas Práticas e Otimização de Performance

Categoria Recomendação Benefício
Drivers Sempre usar drivers virtio para rede, bloco, balão de memória e serial. Redução drástica no overhead de CPU.
Memória Habilitar HugePages no Host para VMs com alta carga de memória. Minimiza a degradação da tabela de páginas do Kernel.
CPU Pinning Mapear vCPUs para CPUs físicas específicas (vcpu-pin no XML). Evita troca de contexto (context switching) desnecessária e melhora uso do cache L3.
Armazenamento Utilizar cache='none' e io='native' para volumes em discos SSD/NVMe. Bypassa o Cache da página do Host e acelera IOPS de baixa latência.
Discard/TRIM Configurar discard='unmap' no XML da VM. Libera espaço do arquivo Qcow2 no host quando arquivos são deletados na VM.

Tabela Comparativa de Soluções de Virtualização Linux

Recurso KVM / QEMU Proxmox VE VMware ESXi VirtualBox
Tipo Hypervisor Tipo 1 Appliance Tipo 1 (Base Debian) Bare-Metal Proprietário Hypervisor Tipo 2
Licença Open Source (GPL) Open Source (AGPLv3) Comercial / Proprietário GPLv2 / PUEL
Gerenciamento CLI (virsh), Terraform, Cockpit Interface Web nativa, API vCenter, Web Client GUI / VBoxManage
Uso Ideal Homelabs, Nuvem (OpenStack/AWS), DevOps Homelabs, PMEs, Racks dedicados Data Centers Corporativos Desktop / Desenvolvimento local
Desempenho Nativo (Próximo de Bare-Metal) Nativo Nativo Moderado

Conclusão

A pilha KVM, QEMU e Libvirt fornece uma infraestrutura de virtualização extremamente robusta, flexível e performática diretamente integrada no kernel do Linux. Ao dominar a CLI (virsh, virt-install, qemu-img), entender a arquitetura de armazenamento e rede, e implementar boas práticas de otimização, você adquire independência total para operar desde homelabs eficientes até nuvens privadas em larga escala.

Próximos Passos

Perguntas Frequentes (FAQ)

Q1: Qual a diferença prática entre KVM e QEMU?
R: O KVM é o módulo de kernel que executa as instruções do processador diretamente no hardware físico. O QEMU é a aplicação de espaço do usuário que emula os componentes que o KVM não virtualiza diretamente (placa de rede, controladores de disco, chipset).

Q2: Posso rodar Docker dentro de uma VM KVM (Nested Virtualization)?
R: Sim! Como o Docker usa apenas namespaces e cgroups (sem depender de extensões de CPU), ele roda perfeitamente em VMs. Se você precisar rodar KVM dentro de KVM, ative o parâmetro nested=1 no módulo do KVM no host.

Próximo passo

Agora que você domina Kvm E Qemu No Linux, o próximo passo lógico da nossa trilha de aprendizado é continuar desenvolvendo suas habilidades.

→ Continue: Docker no Linux

Artigos relacionados

Estes artigos complementam o conteúdo apresentado:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima