KVM e QEMU no Linux: Guia Prático para Criar Máquinas Virtuais
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
virshevirt‑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
sudoe suporte a gruposkvmelibvirt. - 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.:
4ou8dependendo 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 existseKVM 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
ide verificar a ausência delibvirt. - Solução: Run
sudo usermod -aG libvirt $USERe depois faça re-login ou executenewgrp 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 --allmostra statusinactive. - 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, oucache=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=virtiona chamada dovirt-install.
4. Sintoma: Sem endereço IP atribuído à VM no modo NAT.
- Possível Causa: O serviço
dnsmasqinterno 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-passthroughem clusters heterogêneos de migração ao vivo (live-migration), pois expõe instruções da CPU física. Para nós isolados,host-passthroughmelhora a performance. - Desativar interfaces gráficas desnecessárias: Evite escutar o VNC/SPICE em
0.0.0.0. Restrinja a127.0.0.1ou 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
- 06 docker linux – Alternativa leve de virtualização via containers.
- 12 ansible linux – Automação da instalação de VMs KVM com Ansible.
- 13 terraform infraestrutura – Provisionamento declarativo de VMs KVM usando o provider
dmacvicar/libvirt. - 14 homelab linux – Projeto prático unindo KVM, Docker e storage em casa.
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:
