Libvirt Setup

Install libvirt

$ dnf install guestfs-tools \
              libvirt-daemon-config-network\
              libvirt-daemon-kvm \
              qemu-kvm \
              virt-install \
              virt-viewer \
              virt-top
# GUI Manager
$ dnf install virt-manager
$ systemctl enable --now libvirtd

Create Network

$ sudo virsh net-define /usr/share/libvirt/networks/default.xml
$ sudo virsh net-autostart default
$ sudo virsh net-start default

Create Storage Pool

$ mkdir -p $HOME/var/lib/libvirt/images
$ virsh pool-define default-pool.xml
$ virsh pool-autostart default
$ virsh pool-start default

Create Disk Image

virsh vol-create default volume.xml

Create VM

virsh define <domain>.mxl

Start VM

virsh start <domain>

View VM

virt-viewer <domain>

Remove Empty Space in Disk Image

virt-sparsify --in-place <path/to/disk/image>

Make Directory Tree

mkdir -p $HOME/var/lib/libvirt/qemu/nvram

Set SELinux to allow shared directories

$ sudo semanage fcontext -a -t svirt_image_t "<path no slash>(/.*)?"
$ sudo restorecon -vR <path no slash>

Create Shared Directory

$ virsh edit <domain>

<filesystem type='mount' accessmode='squash'>
  <source dir='<path/to/share>' />
  <target dir='<mount name>' />
</filesystem>
guest$ echo '<mount name> <mount point> 9p trans=virtio,version=9p2000.L 0 0' >> /etc/fstab
guest$ reboot

Taking Snapshots

virsh snapshot-create-as <domain> --name <name>

Reverting Snapshots

From https://unix.stackexchange.com/a/691192

$ virsh shutdown <domain>
$ backingfile=$(qemu-img info <domain>.<snapshot name> -U | grep -Po 'backing file:\s\K(.*)')
$ targetdisk=<sda or some such>
$ virt-xml <domain> --edit target=$disk --disk path=$backingfile --update
$ virsh snapshot-delete --metadata <domain> <snapshot name>
$ rm <snapshot image file>