The essentials
Quick reference
One focused task per row. Jump to the related section for complete, working examples.
| Use | Syntax | Examples |
|---|---|---|
| Inspect CPU virtualization flags | lscpu | grep -E 'Virtualization|Hypervisor vendor' | View examples |
| Validate the KVM host | sudo virt-host-validate qemu | View examples |
| Show the active libvirt URI | virsh --connect qemu:///system uri | View examples |
| Inspect domain capabilities | virsh --connect qemu:///system domcapabilities | View examples |
| List every domain | virsh --connect qemu:///system list --all | View examples |
| Inspect domain state | virsh --connect qemu:///system dominfo prod-vm | View examples |
| Export inactive domain XML | virsh --connect qemu:///system dumpxml --inactive \
prod-vm | View examples |
| Request a graceful shutdown | virsh --connect qemu:///system shutdown prod-vm | View examples |
| Create a qcow2 disk | qemu-img create -f qcow2 ./prod-vm.qcow2 80G | View examples |
| Inspect image metadata | qemu-img info --backing-chain \
/var/lib/libvirt/images/prod-vm.qcow2 | View examples |
| List storage-pool volumes | virsh --connect qemu:///system vol-list default \
--details | View examples |
| Map guest disks to sources | virsh --connect qemu:///system domblklist prod-vm \
--details | View examples |
| Query guest filesystems | virsh --connect qemu:///system domfsinfo prod-vm | View examples |
| Inspect vCPU placement | virsh --connect qemu:///system vcpuinfo prod-vm | View examples |
| List domain interfaces | virsh --connect qemu:///system domiflist prod-vm | View examples |
| List DHCP leases | virsh --connect qemu:///system net-dhcp-leases default | View examples |
| Inspect network configuration | virsh --connect qemu:///system net-dumpxml default | View examples |
| List snapshot ancestry | virsh --connect qemu:///system snapshot-list prod-vm \
--tree | View examples |
| Start a defined live backup | virsh --connect qemu:///system backup-begin prod-vm \
--backupxml /etc/libvirt/backup/prod-vm.xml | View examples |
| Inspect a block job | virsh --connect qemu:///system blockjob prod-vm vda \
--info --bytes | View examples |
| Check an offline image | qemu-img check /srv/backups/prod-vm/prod-vm.qcow2 | View examples |
| Check destination CPU compatibility | virsh --connect qemu+ssh://hv2/system \
hypervisor-cpu-compare prod-vm.migratable.xml --error \
--validate | View examples |
| Inspect domain security labels | virsh --connect qemu:///system dominfo prod-vm |
grep -E '^Security' | View examples |
| Read the QEMU domain log | sudo journalctl -u 'virtqemud*' --since -30min | View examples |
KVM supplies Linux kernel virtualization, QEMU emulates virtual hardware, and libvirt models and controls guests, storage, networks, and security policy. Reliable administration begins by proving host acceleration and driver capabilities, then treating domain XML, disk chains, firmware state, and guest data as one managed system. These commands target the local system libvirt connection; confirm the URI, installed versions, distribution packaging, storage topology, and outage plan before making changes.
Step by step
Detailed examples
Validate acceleration, permissions, and the exact connection
Hardware virtualization must be exposed by firmware and any outer hypervisor, the KVM kernel modules must match the architecture, and the libvirt QEMU driver must be able to access /dev/kvm. virt-host-validate identifies many common gaps but warnings still require interpretation. qemu:///system and qemu:///session have different daemons, privileges, networks, storage, and domain inventories; always state the URI in automation. Distribution packages may use monolithic libvirtd or modular virtqemud and virtstoraged services, and capability output changes with QEMU, libvirt, kernel, firmware, and machine-type versions.
uname -r
lscpu | grep -E 'Architecture|Virtualization|Hypervisor vendor'
lsmod | grep -E '^kvm'
ls -l /dev/kvm
sudo virt-host-validate qemu
virsh --connect qemu:///system uri
virsh --connect qemu:///system version
virsh --connect qemu:///system domcapabilities > /tmp/domain-capabilities.xml Inspect persistent and live state before lifecycle changes
A persistent domain has inactive XML used on the next boot and may also have live XML with hot-plugged or runtime-only differences. Capture both when diagnosing drift. shutdown is an asynchronous request and can fail when the guest cannot respond; wait for a confirmed shut off state before host maintenance or cold copying. destroy is equivalent to pulling power and can corrupt guest filesystems and applications, so reserve it for approved incident recovery. Autostart changes boot behavior and should be coordinated with storage, network, and dependency readiness.
uri=qemu:///system
vm=prod-vm
virsh --connect "$uri" list --all
virsh --connect "$uri" dominfo "$vm"
virsh --connect "$uri" dumpxml --inactive "$vm" > /tmp/prod-vm.inactive.xml
virsh --connect "$uri" dumpxml "$vm" > /tmp/prod-vm.live.xml
virsh --connect "$uri" shutdown "$vm"
for attempt in 1 2 3 4 5; do
state=$(virsh --connect "$uri" domstate "$vm")
printf '%s\n' "$state"
[ "$state" = 'shut off' ] && break
sleep 10
done Treat disk formats, backing chains, and pools as integrity boundaries
Use libvirt storage pools where practical so ownership, SELinux labels, and lifecycle are modeled rather than bypassed. Explicitly declare disk formats: probing an untrusted or guest-writable raw image as another format has had security consequences. qcow2 supports sparse allocation and backing files, but its apparent file size is not its maximum growth and every backing file is part of recovery. Never use qemu-img check, resize, rebase, amend, convert, or snapshot operations on an image opened for writing by a running VM unless the command and storage protocol explicitly support that live operation. Monitor host free space independently of guest free space.
uri=qemu:///system
vm=prod-vm
virsh --connect "$uri" pool-list --all --details
virsh --connect "$uri" vol-list default --details
virsh --connect "$uri" domblklist "$vm" --details
virsh --connect "$uri" domblkinfo "$vm" vda --human
image=/var/lib/libvirt/images/prod-vm.qcow2
qemu-img info --backing-chain "$image"
df -h -- "$(dirname "$image")" uri=qemu:///system
virsh --connect "$uri" vol-create-as default prod-vm.qcow2 80G --format qcow2
virsh --connect "$uri" pool-refresh default
virsh --connect "$uri" vol-info --pool default prod-vm.qcow2
virsh --connect "$uri" vol-path --pool default prod-vm.qcow2 Coordinate host operations with the guest operating system
The QEMU guest agent enables filesystem discovery, freeze and thaw, IP reporting, and more accurate shutdown behavior, but only when a virtio channel, the guest package, and its service are configured. Agent access is privileged: raw qemu-agent-command requests can inspect or modify guest state and should be tightly authorized and audited. Freeze filesystems only around a short, guaranteed backup action and always arrange thaw on failure; filesystem quiescence alone does not guarantee application consistency for every database. CPU and memory hotplug also depend on guest support and XML maximums.
uri=qemu:///system
vm=prod-vm
virsh --connect "$uri" domfsinfo "$vm"
virsh --connect "$uri" domifaddr "$vm" --source agent
virsh --connect "$uri" guestinfo "$vm" --filesystem
virsh --connect "$uri" vcpucount "$vm"
virsh --connect "$uri" dommemstat "$vm" Understand virtual network reachability before exposure
The common default libvirt network provides host NAT and DHCP, but exact firewall backends, bridge names, address ranges, and autostart behavior are distribution-defined. A bridge attached to a physical network can expose guests directly and requires upstream switching, firewall, and address-management review. domifaddr may depend on the guest agent, DHCP leases, or ARP observation and is not authoritative in every topology. Editing or restarting a live network can interrupt every attached guest. Back up network XML, avoid overlapping address space, and test DNS and egress failure behavior before production rollout.
uri=qemu:///system
vm=prod-vm
virsh --connect "$uri" net-list --all
virsh --connect "$uri" net-info default
virsh --connect "$uri" net-dumpxml default > /tmp/default-network.xml
virsh --connect "$uri" net-dhcp-leases default
virsh --connect "$uri" domiflist "$vm"
virsh --connect "$uri" domifaddr "$vm" --source agent Build backups around an explicit consistency boundary
A VM snapshot is not an independent backup: external snapshots add backing-chain dependencies, and internal snapshots share the same storage failure domain. Live backups should use libvirt's backup and checkpoint APIs, reviewed XML, monitored jobs, sufficient scratch space, and guest or application quiescence. Cold backup is simpler but causes an outage; confirm the VM is fully shut off, inventory every disk plus domain XML and UEFI NVRAM, then copy or convert only inactive images. Multi-disk applications need one coordinated consistency point. Verify checksums and boot a restored copy on an isolated network rather than assuming archive creation equals recovery.
uri=qemu:///system
vm=prod-vm
source_image=/var/lib/libvirt/images/prod-vm.qcow2
backup_dir=/srv/backups/libvirt/prod-vm-2026-08-12
xml=$(mktemp)
trap 'rm -f "$xml"' EXIT
state=$(virsh --connect "$uri" domstate "$vm")
[ "$state" = 'shut off' ] || { printf '%s\n' 'VM must be shut off' >&2; exit 1; }
virsh --connect "$uri" dumpxml --inactive "$vm" > "$xml"
sudo install -d -m 0700 "$backup_dir"
sudo install -m 0600 "$xml" "$backup_dir/prod-vm.xml"
sudo qemu-img convert -p -f qcow2 -O qcow2 "$source_image" "$backup_dir/prod-vm.qcow2"
sudo qemu-img check "$backup_dir/prod-vm.qcow2"
sudo sha256sum "$backup_dir/prod-vm.qcow2" "$backup_dir/prod-vm.xml" | sudo tee "$backup_dir/SHA256SUMS" uri=qemu:///system
vm=prod-vm
virsh --connect "$uri" snapshot-list "$vm" --tree
virsh --connect "$uri" checkpoint-list "$vm" --tree
virsh --connect "$uri" domblklist "$vm" --details
virsh --connect "$uri" blockjob "$vm" vda --info --bytes
virsh --connect "$uri" domjobinfo "$vm" --completed --keep-completed Preserve isolation and preflight migration failure modes
Libvirt normally confines QEMU with a dedicated account, cgroups, namespaces, seccomp, and SELinux or AppArmor policy. Prefer modeled domain XML over opaque QEMU command-line passthrough because libvirt cannot automatically authorize hidden host resources. Do not solve access failures by running QEMU as root or disabling confinement. Domain XML, NVRAM, disk images, TPM state, migration channels, and libvirt secret definitions can expose sensitive infrastructure or credentials; restrict backups and logs accordingly. Live migration additionally requires compatible CPUs, machine types, firmware, storage access, networks, QEMU/libvirt features, and enough bandwidth. Libvirt has no general migration dry-run flag: inspect migratable XML, compare the destination hypervisor CPU, validate dependencies separately, define rollback criteria, and retain the known-good source until post-migration validation. A control or data-network outage can pause or fail migration; post-copy failure can require specialized recovery.
vm=prod-vm
source_uri=qemu:///system
dest_uri=qemu+ssh://hv2/system
virsh --connect "$source_uri" domcapabilities > /tmp/source-capabilities.xml
virsh --connect "$dest_uri" domcapabilities > /tmp/destination-capabilities.xml
virsh --connect "$source_uri" dumpxml --migratable "$vm" > /tmp/prod-vm.migratable.xml
virsh --connect "$dest_uri" hypervisor-cpu-compare /tmp/prod-vm.migratable.xml --error --validate
virsh --connect "$source_uri" domiflist "$vm"
virsh --connect "$source_uri" domblklist "$vm" --details vm=prod-vm
virsh --connect qemu:///system dominfo "$vm" | grep -E '^Security'
virsh --connect qemu:///system dumpxml --security-info "$vm" > /tmp/prod-vm.security.xml
ps -eo user,group,label,pid,cmd | grep '[q]emu-system'
sudo ausearch -m AVC,USER_AVC -ts recent 2>/dev/null || true
sudo journalctl -u 'virtqemud*' --since -30min --no-pager Diagnose from the control plane down without changing evidence
First confirm URI, daemon health, domain state, job state, disk capacity, storage pool state, networks, logs, and mandatory-access-control denials. A paused guest may indicate I/O errors or exhausted storage rather than a CPU problem. Avoid deleting snapshots, rebasing chains, repairing qcow2, resetting NVRAM, undefining domains, or restarting all libvirt daemons until the dependency graph and recovery path are known. On modular deployments inspect virtqemud and virtstoraged; older systems may report everything through libvirtd. Remote connections add SSH, PKI, firewall, DNS, and clock-skew failure modes.
uri=qemu:///system
vm=prod-vm
virsh --connect "$uri" version
virsh --connect "$uri" domstate "$vm" --reason
virsh --connect "$uri" domjobinfo "$vm"
virsh --connect "$uri" domblkerror "$vm"
virsh --connect "$uri" domblklist "$vm" --details
virsh --connect "$uri" domiflist "$vm"
virsh --connect "$uri" pool-list --all --details
df -h /var/lib/libvirt/images
sudo journalctl -u 'virtqemud*' -u 'virtstoraged*' --since -30min --no-pager Sources and further reading
References
Authoritative documentation used to verify and expand this cheat sheet.
- Linux Kernel documentationKVM — Kernel-based Virtual Machine documentationdocs.kernel.org
- libvirt projectvirsh(1) — Management user interfacelibvirt.org
- libvirt projectvirt-host-validate(1) — Validate host virtualization setuplibvirt.org
- libvirt projectDomain XML formatlibvirt.org
- libvirt projectLive full disk backuplibvirt.org
- libvirt projectSecure usage of libvirtlibvirt.org
- libvirt projectQEMU command-line passthrough securitylibvirt.org
- QEMU projectQEMU disk image utilityqemu.org
Help us improve
Found a typo or missing example?
Tell us what would make this cheat sheet clearer, more complete, or more useful.



