KVM/Libvirt supports UNMAP, similar to TRIM. That way you can free space used by a VM on a qemu2 vdisk not currently in use.
First of all, your disk images need to be in QCOW2 format. If they are raw, [convert] them first. To allow for deallocation of unused space, you'll need to use UNMAP, similar to TRIM, except that the latter is the ATA counterpart to SCSI's UNMAP. KVM/Libvirt doesn't support the ATA version, so we'll change the driver to SCSI. Usually drives are added as VirtIO. If they are, change this, using virt-manager. Obviously, you can do this on the commandline, but I'm lazy so I just use the GUI. On my box (Debian Jessie), I can't change VirtIO to VirtIO SCSI, so I'll have to remove and re-add the drives. If your version of KVM/Libvirt support changing this, skip steps 2 and 3 and just change it. Otherwise, do as follows
- Shut down the VM
- Start virt-manager and remove the disk(s) from the VM
- Add them in the same order, but as VirtIO SCSI
Now, you need to add a flag to the driver to make it support UNMAP. Changing the XML config file itself may not work too well, so in my experience, I find it easier to just dump the config, change it, undefine (that is, delete, not touching the data) the old VM and recreating one.
virsh dumpxml myvm > myvm.xml
Then change myvm.xml, adding the discard part
<driver name='qemu' type='qcow2' discard='unmap'/>
Undefine and redefine the VM
virsh undefine myvm virsh define myvm.xml
Start the vm with virsh start myvm or with virt-manager and wait for it to start. When done, try du -sh /var/lib/libvirt/images/myvm.qcow2 and run fstrim / inside the VM and check the du output again. If there are a lot of wasted space, it should be freed by now.