Libvirt Basics
Libvirt is the management layer that sits between you and KVM/QEMU. It manages networking (virtual switches, bridges, NAT), storage (pools of disk images), and provides the virsh API. Understanding libvirt's network and storage models is necessary for anything beyond basic VM creation — particularly for making VMs accessible on the local network (bridged networking) and for organizing disk image storage.
Libvirt networking
Libvirt network modes:
NAT (default):
VMs → virbr0 (virtual bridge) → NAT → host's physical NIC → internet
VMs can reach internet, but are NOT reachable from external hosts
VMs get IPs from 192.168.122.0/24
Bridged (production use):
VMs → bridge (br0) → physical NIC → network
VMs appear on same network as host, get IPs from DHCP
VMs are directly reachable from local network and internet# List networks:
virsh net-list --all
# Show NAT network details:
virsh net-info default
virsh net-dumpxml default # Full XML config
# Create a bridged network (for VMs on LAN):
# First create bridge in /etc/netplan/01-network.conf:
# bridges:
# br0:
# interfaces: [eth0]
# dhcp4: true
sudo netplan apply
# Then create libvirt bridge network:
cat > /tmp/bridge-network.xml << 'EOF'
bridge-network
EOF
virsh net-define /tmp/bridge-network.xml
virsh net-start bridge-network
virsh net-autostart bridge-network
Storage pools and volumes
# List storage pools:
virsh pool-list --all
# Default pool is at /var/lib/libvirt/images/
virsh pool-info default
# List disk images (volumes) in the default pool:
virsh vol-list default
# Create a new disk image:
virsh vol-create-as default vm-disk.qcow2 20G --format qcow2
# Resize a volume:
virsh vol-resize --pool default vm-disk.qcow2 30G
# Show disk image info:
sudo qemu-img info /var/lib/libvirt/images/ubuntu-test.qcow2
qemu-img info output
image: /var/lib/libvirt/images/ubuntu-test.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 3.45 GiB ← actual disk usage (QCOW2 is sparse)
VM XML configuration
# Every libvirt VM is defined by an XML file:
virsh dumpxml ubuntu-test > /backup/ubuntu-test.xml # Export config
# Key XML sections:
# : RAM allocation
# : CPU count
# : boot firmware and device order
# : disks, NICs, console
# : each disk image attached
# Restore a VM from XML (if VM was deleted):
virsh define /backup/ubuntu-test.xml # Recreate VM definition (not data)
Conclusion
For production VMs that need to be reachable from the local network, switch from the default NAT network to a bridged network. The default NAT works fine for isolated development VMs. Use virsh dumpxml to export VM configuration to XML — this is your VM configuration backup (separate from the disk image data backup). Store the XML alongside your disk image backups so a complete VM can be reconstructed.
Need help with Ubuntu administration?
Work directly with Muhammad Irfan Aslam for Ubuntu Server, Linux, cloud, Docker, DevOps, CI/CD, or infrastructure troubleshooting support.
Work with Muhammad Irfan Aslam