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