libvirt is an open-source library, daemon, and toolset that provides a unified, stable API for managing virtualisation infrastructure — virtual machines, storage volumes, virtual networks, and host devices — across multiple hypervisor backends. It was originally written by Daniel Berrange at Red Hat and has since become the standard virtualisation management layer on Linux, underpinning KubeVirt, OpenStack Nova, oVirt/RHEV, Proxmox, and the virsh / virt-manager administrative tools. The core value proposition is hypervisor abstraction: the same libvirt API call creates a VM on KVM/QEMU, Xen, LXC, or (historically) VMware ESXi, without the management layer caring about the underlying implementation. In practice, the KVM/QEMU driver is the dominant use case on Linux; the others are progressively less-maintained but remain supported. libvirt communicates with hypervisors through driver-specific mechanisms — with QEMU, it generates the full QEMU command line from the domain XML definition and manages the QEMU process lifecycle, communicating with the running VM through the QEMU Monitor Protocol (QMP) over a Unix socket.
All libvirt-managed resources are described in domain XML: a declarative specification of every aspect of a VM — CPU topology (sockets, cores, threads, NUMA topology, CPU pinning), memory (size, hugepages, NUMA binding), boot order and firmware (UEFI or BIOS, Secure Boot, SMM), disk devices (virtio-blk, virtio-scsi, IDE with format qcow2/raw and source as file, block device, or network), network interfaces (virtio-net, bridge, SR-IOV VF, macvtap, VDPA), PCI and USB device passthrough, graphics (VNC, SPICE), video, serial/console, watchdog, RNG, and TPM devices (either passthrough of the host’s physical TPM, or an emulated software TPM via swtpm). The XML is the authoritative source of truth; virsh dumpxml <domain> outputs the running domain’s effective configuration, and virsh define domain.xml creates a persistent VM from a specification. Storage is managed through storage pools (directories, LVM VGs, NFS mounts, Ceph RBD clusters, iSCSI targets) and storage volumes allocated from them; network connectivity through virtual networks (virsh net-*) that libvirt manages as Linux bridges, VLAN-tagged bridges, macvtap, or OVS bridges, with iptables/nftables rules and dnsmasq instances for NAT networks managed automatically. The daemon architecture in libvirt 6.0+ uses a modular daemon model — separate daemons per driver (virtqemud, virtnetworkd, virtstoraged, virtnodedevd, etc.) instead of the monolithic libvirtd — improving isolation and privilege separation at the cost of a more complex service dependency graph.
libvirt’s security integration is its most relevant feature in the context of this glossary. The sVirt security model automatically assigns each QEMU process a unique SELinux MCS label pair (system_u:system_r:svirt_t:s0:c<X>,c<Y>) at VM start time, and dynamically relabels all disk images and devices the VM will access to match those categories (system_u:object_r:svirt_image_t:s0:c<X>,c<Y>). The SELinux policy is written so that a QEMU process in one category pair cannot access files labelled with a different category pair — meaning a compromised VM process cannot read another VM’s disk image even if it escapes its own namespace and gains access to the host filesystem as the qemu user. On Ubuntu and Debian, the equivalent mechanism uses AppArmor profiles via the virt-aa-helper tool, which generates a per-VM AppArmor profile at startup and loads it dynamically. libvirt also integrates with firewalld over D-Bus to open and close ports for VM network access, with the host TPM (both physical passthrough and swtpm-emulated software TPM for Secure Boot + measured boot in guests), and with UEFI firmware images (OVMF for standard UEFI, OVMF with SEV or TDX configuration for SEV-SNP and TDX confidential VMs). KubeVirt uses libvirt as its hypervisor management layer — the virt-launcher pod runs a libvirtd instance and communicates with it via the libvirt API, making libvirt the execution engine that both conventional KubeVirt VMs and KubeVirt confidential VMs ultimately run through.
