Este guia apresenta o processo detalhado de configuração e gerenciamento de um ambiente de virtualização utilizando KVM no Debian 13. O material foi estruturado para facilitar a implantação em um homelab, abordando desde a preparação do servidor até o gerenciamento avançado de máquinas virtuais, redes e armazenamento.
O ambiente de laboratório descrito neste documento é baseado na seguinte infraestrutura:
virt-manager, SSH e Terraform.Para que as máquinas virtuais possam se comunicar com a rede externa como se fossem dispositivos físicos, é necessário configurar uma interface de rede em modo bridge.
Primeiramente, instale o pacote necessário para gerenciar interfaces bridge:
sudo apt install bridge-utils
Edite o arquivo /etc/network/interfaces para definir a interface bridge (br0) vinculada à interface física principal (neste exemplo, enp11s0f0).
# /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug enp11s0f0
iface enp11s0f0 inet manual
# Bridge
auto br0
iface br0 inet static
bridge_ports enp11s0f0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
address 192.168.0.251
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 192.168.0.1
# Adicione IPv6 na bridge, não na interface física
iface br0 inet6 auto
# Ou use static se preferir:
# address 2804:2084:52c:eb01::250/64
# gateway fe80::4a22:54ff:fe5d:1ef8
Para garantir o funcionamento adequado do IPv6 na bridge, configure o Router Advertisement (RA).
Aplicação temporária (para testes):
sudo sysctl -w net.ipv6.conf.br0.accept_ra=2
sudo sysctl -w net.ipv6.conf.br0.forwarding=1
Configuração persistente:
Crie o arquivo /etc/sysctl.d/99-libvirt-ipv6.conf:
sudo vim /etc/sysctl.d/99-libvirt-ipv6.conf
Adicione o seguinte conteúdo:
# Permitir Router Advertisement na bridge mesmo com forwarding
net.ipv6.conf.br0.accept_ra=2
net.ipv6.conf.br0.forwarding=1
# Desabilitar IPv6 na interface física (opcional mas recomendado)
net.ipv6.conf.enp11s0f0.disable_ipv6=1
# Garantir que a bridge aceite redirecionamentos
net.ipv6.conf.br0.accept_redirects=1
Aplique as configurações e reinicie o serviço de rede:
sudo sysctl -p /etc/sysctl.d/99-libvirt-ipv6.conf
sudo systemctl restart networking && exit
Após reconectar via SSH (ssh 192.168.0.251), verifique o status da interface:
ip a show br0
Caso seja necessária a saída IPv6 (NAT66), configure o ip6tables:
sudo ip6tables -t nat -A POSTROUTING -o br0 -j MASQUERADE
sudo apt install iptables-persistent
sudo netfilter-persistent save
sudo cat /etc/iptables/rules.v4
Instale os pacotes fundamentais para o funcionamento do KVM e libvirt:
sudo apt install libvirt-daemon-system virt-install libosinfo-bin genisoimage ovmf guestfs-tools
Verifique a versão instalada:
sudo virsh version --daemon
Adicione seu usuário aos grupos necessários para gerenciar as VMs sem privilégios de root em todos os comandos:
getent group | egrep 'libvirt|kvm|qemu'
sudo usermod -aG kvm,libvirt $USER
Reinicie o servidor para aplicar as alterações de grupo:
sudo reboot
Após o reinício, verifique o status do serviço libvirtd:
sudo systemctl status libvirtd
Neste ambiente, uma partição dedicada de 1.6 TiB (/datastore) foi reservada para armazenar os dados das máquinas virtuais.
Crie os diretórios que servirão como pools de armazenamento:
sudo mkdir -p /datastore/{images,isos,nvram,templates}
images: Armazena os discos virtuais (qcow2) das VMs em execução.templates: Guarda imagens base (golden images) pré-configuradas para clonagem rápida (útil com Terraform).isos: Armazena as imagens de instalação (.iso) dos sistemas operacionais.nvram: Armazena as variáveis de inicialização UEFI das VMs.Defina os pools no libvirt apontando para os diretórios criados:
sudo virsh pool-define-as --name default --type dir --target /datastore/images
sudo virsh pool-define-as --name isos --type dir --target /datastore/isos
sudo virsh pool-define-as --name nvram --type dir --target /datastore/nvram
sudo virsh pool-define-as --name templates --type dir --target /datastore/templates
Configure-os para iniciar automaticamente junto com o sistema:
sudo virsh pool-autostart default
sudo virsh pool-autostart isos
sudo virsh pool-autostart nvram
sudo virsh pool-autostart templates
Inicie os pools manualmente pela primeira vez:
sudo virsh pool-start default
sudo virsh pool-start isos
sudo virsh pool-start nvram
sudo virsh pool-start templates
Verifique se estão ativos:
sudo virsh pool-list
Para que o QEMU/KVM possa acessar os novos diretórios, é necessário ajustar as regras do AppArmor.
Crie o arquivo de configuração local:
sudo mkdir -p /etc/apparmor.d/local/abstractions
sudo vi /etc/apparmor.d/local/abstractions/libvirt-qemu
Adicione as permissões de leitura (r), escrita (w) e bloqueio (k):
# Permissões para os pools
/datastore/images/ r,
/datastore/images/** rwk,
/datastore/nvram/ r,
/datastore/nvram/** rwk,
/datastore/templates/ r,
/datastore/templates/** rwk,
/datastore/isos/ r,
/datastore/isos/** r,
Recarregue o AppArmor e reinicie o libvirt:
sudo systemctl reload apparmor
sudo systemctl restart libvirtd
Primeiro, faça o download da imagem ISO:
sudo wget -4 -T 30 --read-timeout=60 https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-13.4.0-amd64-netinst.iso -P /datastore/isos
Crie a máquina virtual utilizando o virt-install:
sudo virt-install \
--virt-type kvm \
--machine q35 \
--name debian13 \
--description "Debian Trixie" \
--boot uefi \
--cdrom /datastore/isos/debian-13.4.0-amd64-netinst.iso \
--os-variant debian13 \
--disk pool=default,size=32,format=qcow2,bus=virtio,cache=none \
--memory 4096 \
--vcpus 2 \
--cpu host-passthrough \
--network=default,model=virtio \
--graphics spice \
--noautoconsole
Para sistemas Windows, é necessário emular o TPM e fornecer os drivers VirtIO durante a instalação.
Faça o download dos drivers VirtIO: VirtIO-Win.
Comando de criação:
sudo virt-install \
--name win11 \
--os-variant win11 \
--virt-type kvm \
--machine q35 \
--vcpus 4 \
--memory 8192 \
--boot uefi,loader_secure=yes \
--tpm backend.type=emulator,backend.version=2.0,model=tpm-tis \
--cpu host-passthrough \
--disk pool=default,size=64,format=qcow2,bus=virtio,cache=none \
--cdrom /datastore/isos/Win11_22H2_English_x64v1.iso \
--disk path=/datastore/isos/virtio-win-0.1.285.iso,device=cdrom \
--network network=default,model=virtio \
--graphics spice \
--noautoconsole
Para gerenciar as VMs a partir de sua estação de trabalho, configure o acesso SSH sem senha.
Gere uma chave SSH (na estação de trabalho):
ssh-keygen -t ed25519 -f ~/.ssh/kvm
Copie a chave para o servidor:
ssh-copy-id -i ~/.ssh/kvm.pub 192.168.0.251
Configure o atalho no arquivo ~/.ssh/config:
Host kvm-02
HostName 192.168.0.251
User gean
IdentityFile ~/.ssh/kvm
Agora você pode utilizar o virt-manager remotamente:
sudo apt install virt-manager
virt-manager --connect qemu+ssh://gean@kvm-02/system
| Ação | Comando | Observação |
|---|---|---|
| Listar VMs | virsh list --all |
Mostra todas (rodando e desligadas). |
| Desligar (suave) | virsh shutdown debian13 |
Envia sinal ACPI (requer acpid no guest). |
| Desligar forçado | virsh destroy debian13 |
Equivale a "puxar da tomada". |
| Iniciar VM | virsh start debian13 |
Inicia a execução. |
| Reiniciar | virsh reboot debian13 |
Reinicializa o sistema operacional. |
| Suspender | virsh suspend debian13 |
Salva o estado atual na RAM. |
| Retomar | virsh resume debian13 |
Retorna da suspensão. |
| Informações | virsh dominfo debian13 |
Exibe detalhes sobre recursos alocados. |
| Console serial | virsh console debian13 |
Acesso via texto (Use Ctrl+] para sair). |
Nota: Snapshots não substituem backups regulares. Eles são úteis para reverter estados rapidamente antes de atualizações críticas.
# Criar snapshot
virsh snapshot-create-as --domain debian13 --name "snap-antes-update" --description "Antes de apt upgrade" --disk-only --atomic
# Listar snapshots
virsh snapshot-list debian13
# Reverter para um snapshot
virsh snapshot-revert debian13 snap-antes-update
# Excluir snapshot
virsh snapshot-delete debian13 snap-antes-update
O método mais seguro e recomendado é utilizar a ferramenta virt-clone:
# Clonar VM com novo nome e alocação automática de disco
sudo virt-clone \
--original debian13 \
--name debian13-clone \
--auto-clone
Discos:
# Listar discos de uma VM
virsh domblklist debian13
# Adicionar novo disco a quente (hotplug)
virsh attach-disk debian13 /datastore/images/debian13-data.qcow2 vdb --driver qemu --subdriver qcow2 --targetbus virtio --cache none --config --live
Redes:
# Listar redes
virsh net-list --all
# Listar IPs distribuídos pelo DHCP do libvirt
virsh net-dhcp-leases default
Atenção: O comando
virsh undefineremove apenas a configuração XML. Os discos virtuais devem ser excluídos manualmente.
virsh destroy debian13
virsh undefine debian13
rm /datastore/images/debian13*.qcow2
# Exportar configuração XML
virsh dumpxml debian13 > debian13.xml
# Backup a quente (Hot Backup) sem downtime
virsh blockcopy debian13 vda /backup/debian13-live.qcow2 --wait --verbose --pivot
# Preparar imagem para Template (remove chaves SSH e logs)
sudo virt-sysprep -d debian13 --operations defaults,-ssh-hostkeys --hostname debian-template
# Registrar VM a partir de um XML (após restaurar o arquivo de disco)
virsh define debian13.xml
# Importar disco existente criando uma nova VM
sudo virt-install --name debian13-restored --import --disk /datastore/images/debian13-disk.qcow2,format=qcow2,bus=virtio --memory 4096 --vcpus 2 --os-variant debian13 --network=default --noautoconsole
Para economizar espaço em disco e melhorar a performance, você pode compactar imagens .qcow2.
dd if=/dev/zero of=/zero.fill bs=1M status=progress && sync && rm -f /zero.fillsdelete64.exe C: -zqemu-img convert -f qcow2 -O qcow2 -c /datastore/images/debian13.qcow2 /datastore/images/debian13-compact.qcow2
mv /datastore/images/debian13-compact.qcow2 /datastore/images/debian13.qcow2
Uma referência rápida para comandos essenciais:
# === EXPORTAR ===
virsh dumpxml debian13 > vm.xml # XML da VM
virsh blockcopy debian13 vda /backup/disk.qcow2 --wait # Hot backup
virt-sysprep -d debian13 # Limpar para template
# === IMPORTAR ===
virsh define vm.xml # Registrar VM
virt-install --import --disk path=disk.qcow2 ... # Criar com disco existente
qemu-img convert -f vmdk -O qcow2 src.vmdk dst.qcow2 # Converter formato
# === OTIMIZAR ===
qemu-img convert -f qcow2 -O qcow2 -c src.qcow2 dst.qcow2 # Compactar
qemu-img check -r all disk.qcow2 # Reparar
virsh edit debian13 # Ajustar cache=none, io=native