Stopping a Qemu vm on shutdown is a tricky thing with systemd. The solution mentioned in the arch wiki isnt working for me. It always kills the vm instantly.
After some trying I found a solution that works for me. Socat is required for this and the vm should listen to acpi events like power button pressed.
The systemd service file (/etc/systemd/system/qemu@.service) is shown below:
[Unit] Description=QEMU virtual machine (%i) After=network.target firstname.lastname@example.org [Service] Type=forking PIDFile=/run/qemu_%i.pid EnvironmentFile=/etc/conf.d/qemu.d/%i ExecStart=/usr/bin/qemu-system-x86_64 -name %i -daemonize -pidfile /run/qemu_%i.pid -monitor unix:/tmp/%i.sock,server,nowait $args ExecStop=/bin/sh -c '/usr/bin/echo system_powerdown | /usr/bin/socat - UNIX-CONNECT:/tmp/%i.sock; while ps ax | grep "/usr/bin/qemu-system-x86_64 -name %i" | grep -vq grep; do sleep 1; done' TimeoutStopSec=30 [Install] WantedBy=multi-user.target
As you see, the configuration for each vm is located in /etc/conf.d/qemu/$name. A sample config could look like this:
args=-cpu kvm64 -display none -m 7G -smp 2 -enable-kvm -net nic,macaddr=01:23:45:67:89:AB -net bridge,br=br0 /path/to/vm.img
A comment to the kvm64 processor type: I used to use the host cpu type but with the Intel(R) Core(TM) i7-4770 CPU of the server the vms were throwing NMI errors and one oopsed because of this some days ago.