When dealing with KVM virtualization, the qcow2 format provides excellent features like thin provisioning and snapshots, but presents unique backup challenges:
- Large file sizes increase backup duration
- Guest pause requirements impact availability
- Storage overhead when keeping multiple versions
Instead of full VM pauses, consider these production-grade solutions:
1. Incremental Backups with QCOW2
# Create an external snapshot first
virsh snapshot-create-as --domain vm1 backup-snap --disk-only \
--diskspec vda,file=/var/lib/libvirt/images/vm1-snap.qcow2
# Then backup only the delta
qemu-img convert -f qcow2 -O qcow2 /var/lib/libvirt/images/vm1-snap.qcow2 \
backup-server:/backups/vm1-incremental.qcow2
# Commit changes back to base image
virsh blockcommit vm1 vda --active --verbose --pivot
2. Filesystem-Level Backups
For filesystem-only backup needs (recommended approach):
# Mount guest filesystem via libguestfs
guestmount -a /var/lib/libvirt/images/vm1.qcow2 -i /mnt/vm1
# Perform rsync backup (no VM pause needed)
rsync -avz --delete /mnt/vm1/ backup-server:/backups/vm1-fs/
# Alternative: Use virt-tar-out
virt-tar-out -a vm1.qcow2 / - | gzip > vm1-backup.tar.gz
3. Leveraging Changed Block Tracking (CBT)
# Enable dirty block tracking
virsh qemu-monitor-command vm1 --hmp "drive_mirror -n virtio0 \
/backups/vm1-incremental.qcow2 -b /var/lib/libvirt/images/vm1.qcow2 \
--sync=dirty-bitmap --mode=incremental"
- Compression: Use zstd or lz4 for qcow2 images (qemu-img convert -c)
- Deduplication: Consider tools like BorgBackup for multiple VMs
- Scheduling: Combine with cron or systemd timers
#!/bin/bash
VM_NAME="production-vm"
BACKUP_DIR="/backups/kvm"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
# Create temporary snapshot
virsh snapshot-create-as --domain $VM_NAME "backup-$TIMESTAMP" --disk-only \
--diskspec vda,file=$BACKUP_DIR/${VM_NAME}-${TIMESTAMP}.qcow2
# Backup with compression
qemu-img convert -c -f qcow2 -O qcow2 \
$BACKUP_DIR/${VM_NAME}-${TIMESTAMP}.qcow2 \
backup-server:/backups/${VM_NAME}-${TIMESTAMP}.qcow2
# Cleanup
virsh blockcommit $VM_NAME vda --active --verbose --pivot
rm $BACKUP_DIR/${VM_NAME}-${TIMESTAMP}.qcow2
When dealing with QCOW2-format KVM guests, traditional backup approaches often prove inefficient due to the file size and live-system constraints. The fundamental requirements are:
- Filesystem-consistent backups (not runtime state preservation)
- Minimal downtime during backup operations
- Efficient storage utilization for offsite transfers
Instead of full VM snapshots or paused-state copies, consider these professional approaches:
1. QCOW2 Internal Snapshots with External Backups
# Create internal snapshot
virsh snapshot-create-as --domain vm1 backup_snapshot --disk-only --atomic --quiesce
# Backup using qemu-img convert (sparse-aware)
qemu-img convert -O qcow2 -f qcow2 /var/lib/libvirt/images/vm1.qcow2 \
nbd:unix:/var/run/nbd.sock
# Stream compressed backup directly to remote
ssh backup-server "cat > /backups/vm1_$(date +%F).qcow2" < \
qemu-img convert -O qcow2 -c /var/lib/libvirt/images/vm1.qcow2 -
2. Incremental Backups with Dirty Bitmaps
# Create persistent bitmap
virsh qemu-monitor-command vm1 --hmp 'block-dirty-bitmap-add node=drive-virtio-disk0 name=incremental_1'
# Later, create incremental backup:
qemu-img create -f qcow2 -b vm1.qcow2 -F qcow2 incremental.qcow2
qemu-img rebase -u -b incremental.qcow2 -F qcow2 vm1.qcow2
Using Libvirt's Built-in Backup API
<domain>
...
<backup mode='pull'>
<server transport='tcp' name='backup.example.com' port=10809/>
</backup>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<backup mode='incremental'/>
</disk>
</domain>
Alternative: File-Level Backup with Guestmount
guestmount -a /var/lib/libvirt/images/vm1.qcow2 -i /mnt/vm1
rsync -az --delete /mnt/vm1/ backup-server:/backups/vm1/
guestunmount /mnt/vm1
For production environments, consider these enhancements:
- Implement backup rotation with hardlinks using
rsync --link-dest
- Use
btrfs send/receive
for efficient storage if using BTRFS - Combine with LVM snapshots for additional consistency options
Method | Backup Size | Downtime | Restore Complexity |
---|---|---|---|
Full QCOW2 Copy | 100% | High | Low |
Incremental Bitmap | 5-20% | Low | Medium |
Guestmount+rsync | Files Only | Medium | High |