How to configure VirtIO FS for Proxmox VE

Create /var/lib/vz/snippets/exec-cmds with the following contents:

#!/bin/bash
VMID="$1"
ACTION="$2"
SLEPT=""
vmpid() {
cat "/var/run/qemu-server/$VMID.pid"
}
if_action() {
if [[ "$ACTION" == "$1" ]]; then
shift
eval "$@"
fi
}
sleep_once() {
if [[ -z "$SLEPT" ]]; then
sleep 1s
SLEPT=1
fi
}
exec_virtiofsd() {
echo "Needs virtiofsd for directory $1"
/usr/lib/kvm/virtiofsd --socket-path=/run/qemu-server/$VMID-${1/\//}.virtiofsd -o source=$1 -o cache=always --daemonize > /dev/null 2>&1 &
}
exec_cmds() {
while read CMD ARG1 ARG2 REST; do
case "$CMD" in
"#virtiofsd")
if_action pre-start exec_virtiofsd "$ARG1"
;;
esac
done
}
exec_cmds < "/etc/pve/qemu-server/$1.conf"
exit 0

Add a comment to the top of the config to each VM that needs it under /etc/pve/qemu-server/<VMID>.conf. It denotes the directory from the local machine to share.

#virtiofsd /media
args: -chardev socket,id=char0,path=/run/qemu-server/101-media.virtiofsd -device vhost-user-fs-pci,queue-size=1024,chardev=char0,tag=/media -object memory-backend-file,id=mem,size=4G,mem-path=/dev/shm,share=on -numa node,memdev=mem
# path=/run/qemu-server/101-media.virtiofsd -- '101' should be changed to match the VMID and 'media' should be changed to match the shared directory name without slashes.
# size=4G -- should be changed to be equal to the VM's RAM size
# tag=/media -- this is used by the VM to mount the correct virtiofs share

Once your VM is booted up, you can test the directory mount with:

mkdir /mnt/tmp
mount -t virtiofs /media /mnt/tmp