Este documento descreve a implementação de um host de virtualização com KVM no Debian 13 (trixie), incluindo preparação de rede, instalação do stack de virtualização, configuração de pools, permissões, criação de VMs e operações administrativas recorrentes .
Padronizar a implantação e a administração de hosts KVM baseados em Debian com gerenciamento remoto via virt-manager, ssh e Terraform, além de consolidar procedimentos operacionais para criação, manutenção, backup e recuperação de máquinas virtuais .
Este guia cobre os seguintes tópicos :
libvirt e ferramentas associadas.A implementação original foi realizada no seguinte cenário :
| Item | Detalhe |
|---|---|
| Host | IBM System x3550 M2 |
| Sistema operacional | Debian 13 com instalação mínima, sem interface gráfica |
| Gerenciamento | Estação remota kvm-03 com virt-manager, ssh e Terraform |
| Memória | 64 GiB |
| Armazenamento | 1.6 TiB |
O host utiliza bridge de rede para integração das VMs, libvirt como camada de gerenciamento, virt-install para provisionamento e pools dedicados para imagens, ISOs, NVRAM e templates .
Antes de iniciar, validar os seguintes itens :
sudo./datastore.sudo apt install bridge-utils
/etc/network/interfacesAjuste nomes de interface, endereçamento e gateway conforme o ambiente.
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
allow-hotplug enp11s0f0
iface enp11s0f0 inet manual
auto br0
iface br0 inet static
bridge_ports enp11s0f0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
address 192.168.0.250
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 192.168.0.1
iface br0 inet6 auto
# address 2804:2084:52c:eb01::250/64
# gateway fe80::4a22:54ff:fe5d:1ef8
Aplicação temporária :
sudo sysctl -w net.ipv6.conf.br0.accept_ra=2
sudo sysctl -w net.ipv6.conf.br0.forwarding=1
Persistência em /etc/sysctl.d/99-libvirt-ipv6.conf :
net.ipv6.conf.br0.accept_ra=2
net.ipv6.conf.br0.forwarding=1
net.ipv6.conf.enp11s0f0.disable_ipv6=1
net.ipv6.conf.br0.accept_redirects=1
Aplicar as alterações:
sudo sysctl -p /etc/sysctl.d/99-libvirt-ipv6.conf
sudo systemctl restart networking
ip a show br0
No ambiente de referência, foi necessário habilitar NAT66 para saída IPv6 .
sudo ip6tables -t nat -A POSTROUTING -o br0 -j MASQUERADE
sudo apt install iptables-persistent
sudo netfilter-persistent save
Atenção: o uso de NAT66 deve ser documentado como exceção arquitetural e validado conforme a política de rede da organização.
sudo apt install libvirt-daemon-system virt-install libosinfo-bin genisoimage ovmf guestfs-tools
sudo virsh version --daemon
getent group | egrep 'libvirt|kvm|qemu'
sudo usermod -aG kvm,libvirt $USER
sudo reboot
sudo systemctl status libvirtd
Foi reservado um filesystem específico para armazenamento em /datastore .
sudo mkdir -p /datastore/{images,isos,nvram,templates}
| Pool | Finalidade |
|---|---|
images |
Discos virtuais das VMs (qcow2) |
isos |
Imagens ISO de instalação |
nvram |
Arquivos relacionados ao boot UEFI/NVRAM |
templates |
Imagens base para clonagem e automação com Terraform |
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
sudo virsh pool-autostart default
sudo virsh pool-autostart isos
sudo virsh pool-autostart nvram
sudo virsh pool-autostart templates
sudo virsh pool-start default
sudo virsh pool-start isos
sudo virsh pool-start nvram
sudo virsh pool-start templates
sudo virsh pool-list
virsh pool-dumpxml default | grep path
Quando os pools são criados fora dos caminhos padrão, é necessário liberar acesso do libvirt-qemu aos diretórios definidos .
sudo mkdir -p /etc/apparmor.d/local/abstractions
sudo touch /etc/apparmor.d/local/abstractions/libvirt-qemu
sudo vi /etc/apparmor.d/local/abstractions/libvirt-qemu
/datastore/images/ r,
/datastore/images/** rwk,
/datastore/nvram/ r,
/datastore/nvram/** rwk,
/datastore/templates/ r,
/datastore/templates/** rwk,
/datastore/isos/ r,
/datastore/isos/** r,
sudo systemctl reload apparmor
sudo systemctl restart libvirtd
sudo journalctl -xe | grep apparmor
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
osinfo-query os | grep debian
sudo virt-install \
--virt-type kvm \
--machine q35 \
--name debian13 \
--description "Debian Trixie" \
--boot uefi \
--cdrom /datastore/isos/debian-13.3.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
Observação: o exemplo original utiliza
network=default; se a intenção for conectividade direta na bridge física, considerar o uso de rede bridge específica em vez da rede NAT padrão .
```bash
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
## Acesso remoto ao host
### Gerar chave SSH
```bash
ssh-keygen -t ed25519 -f ~/.ssh/kvm
ssh-copy-id -i ~/.ssh/kvm.pub 192.168.0.250
Host kvm-02
HostName 192.168.0.250
User gean
IdentityFile ~/.ssh/kvm
virsh -c qemu+ssh://gean@kvm-02/system list
virsh -c qemu+ssh://gean@kvm-02/system console debian13
virt-manager --connect qemu+ssh://gean@kvm-02/system
| Ação | Comando | Observação |
|---|---|---|
| Listar VMs | virsh list --all |
Exibe VMs ativas e desligadas |
| Desligar suavemente | virsh shutdown debian13 |
Requer suporte ACPI no guest |
| Desligar forçadamente | virsh destroy debian13 |
Equivale a desligamento abrupto |
| Iniciar VM | virsh start debian13 |
|
| Reiniciar | virsh reboot debian13 |
|
| Suspender | virsh suspend debian13 |
|
| Retomar | virsh resume debian13 |
|
| Inspecionar VM | virsh dominfo debian13 |
|
| Console serial | virsh console debian13 |
Saída com Ctrl+] |
Snapshots podem ser úteis para janelas de alteração, mas não substituem backup .
virsh snapshot-create-as --domain debian13 --name "snap-antes-update" --description "Snapshot antes de apt upgrade" --disk-only --atomic
virsh snapshot-list debian13
virsh snapshot-info debian13 snap-antes-update
virsh snapshot-revert debian13 snap-antes-update
virsh snapshot-delete debian13 snap-antes-update
virt-clonesudo virt-clone --original debian13 --name debian13-clone --auto-clone
virsh dumpxml debian13 > debian13-clone.xml
sed -i 's/debian13/debian13-clone/g' debian13-clone.xml
virsh uuidgen
virsh define debian13-clone.xml
qemu-img create -f qcow2 -b /datastore/images/debian13.qcow2 /datastore/images/debian13-clone.qcow2
virsh net-list --all
virsh net-info default
virsh net-dumpxml default
virsh net-start default
virsh net-destroy default
virsh net-autostart default
virsh net-dhcp-leases default
virsh attach-interface debian13 --type network --source default --model virtio --config --live
cat > /tmp/bridge-net.xml << 'EOFNET'
<network>
<name>bridge0</name>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
EOFNET
virsh net-define /tmp/bridge-net.xml
virsh net-start bridge0
virsh net-autostart bridge0
virsh domblklist debian13
virsh domblkinfo debian13 vda
virsh attach-disk debian13 /datastore/images/debian13-data.qcow2 vdb --driver qemu --subdriver qcow2 --targetbus virtio --cache none --config --live
qemu-img create -f qcow2 /datastore/images/debian13-data.qcow2 20G
virsh vol-create-as default debian13-data.qcow2 20G --format qcow2
qemu-img resize /datastore/images/debian13.qcow2 +10G
Após expandir o disco, o sistema de arquivos dentro da VM também deve ser ajustado .
virsh destroy debian13
virsh undefine debian13
rm /datastore/images/debian13*.qcow2
virsh undefine debian13 --remove-all-storage
Atenção:
virsh undefinenão remove os discos por padrão, salvo quando utilizado com--remove-all-storageem versões compatíveis do libvirt .
virsh dumpxml debian13 > debian13.xml
virsh dumpxml debian13 --update-uuid --clone > debian13-migration.xml
cp --sparse=always /datastore/images/debian13.qcow2 /backup/debian13-disk.qcow2
dd if=/datastore/images/debian13.qcow2 | gzip > /backup/debian13-disk.qcow2.gz
blockcopyvirsh blockcopy debian13 vda /backup/debian13-live.qcow2 --wait --verbose --pivot
virt-sysprepsudo virt-sysprep -d debian13 --operations defaults,-ssh-hostkeys --hostname debian-template
sudo virt-sysprep -a /datastore/images/debian13.qcow2
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
qemu-img convert -f qcow2 -O qcow2 -c /datastore/images/debian13.qcow2 /datastore/images/debian13-compact.qcow2
lsblk --discard
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer
qemu-img check /datastore/images/debian13.qcow2
qemu-img check -r all /datastore/images/debian13.qcow2
qemu-img info /datastore/images/debian13.qcow2
Para melhor uso em uma base de conhecimento, esta página foi reorganizada com foco em legibilidade, navegação e reaproveitamento operacional. As recomendações abaixo ajudam a manter consistência entre artigos semelhantes .
Sugestão de organização hierárquica para a base de conhecimento:
Infraestrutura
└── Virtualização
├── KVM no Debian 13
├── Pools de armazenamento no libvirt
├── Redes NAT e bridge no libvirt
├── Criação de VMs com virt-install
├── Backup e restauração de VMs
└── Otimização de imagens qcow2
Antes da publicação definitiva, recomenda-se revisar os seguintes pontos do conteúdo original :
debian-13.4.0 baixada e o exemplo de criação usando debian-13.3.0.network=default no virt-install versus proposta de bridge física.kvm-01, kvm-02, 192.168.0.250 e 192.168.0.251.# Exportar VM
virsh dumpxml debian13 > vm.xml
virsh blockcopy debian13 vda /backup/disk.qcow2 --wait
virt-sysprep -d debian13
# Importar VM
virsh define vm.xml
virt-install --import --disk path=disk.qcow2 ...
qemu-img convert -f vmdk -O qcow2 src.vmdk dst.qcow2
# Otimizar imagem
qemu-img convert -f qcow2 -O qcow2 -c src.qcow2 dst.qcow2
qemu-img check -r all disk.qcow2
virsh edit debian13