On Mon, Jun 15, 2026 at 04:23:55PM +0200, Peter Krempa via Devel wrote: > From: Peter Krempa <[email protected]> > > For socket activation to work our systemd unit files use the following > pattern: > > [virtlogd.socket] <----(After)--- [virtlogd.service] > [virtqemud.socket] <----(After)--- [virtqemud.service] > > Now the qemu daemon also wants to use the services provided by those > daemons so we have dependency between the two too: > > [virtlogd.socket] <----(After)--- [virtlogd.service] > ^ > +-------------(After+Requires)-------+ > | > [virtqemud.socket] <----(After)--- [virtqemud.service] > > Now on startup everything is fine, because with socket activation, when > 'virtqemud.service' wants to use 'virtlogd' services the socket is > already up due to the dependency+ordering and opening a connection will > cause 'virtlogd.service' to be socket-activated. > > On shutdown though there's no transitive 'After' ordering between > 'virtqemud.service' and 'virtlogd.service' and thus nothing explicitly > telling systemd that if virtlogd was started. In fact systemd is free to > translate it that 'virtlogd' and 'virtqemud' need to be stopped before > stopping 'virtlogd.socket'. > > To illustrate what happens consider the following scenario: > > A host is running a VM under virtqemud. 'virtqemud' is configured to > attempt shutdown on the VMs before killing them (daemon-based guest > shutdown, but the same reproduces also with libvirt-guests). The host > is being rebooted. > > (virtqemud attempts to shut down guests, but guest takes more than the > configured shutdown inhibition timeout, journald output follows): > > 06:44:02 fedora systemd-logind[664]: Delay lock is active (UID 0/root, PID > 991/virtqemud) but inhibitor timeout is reached. > 06:44:02 fedora systemd-logind[664]: System is rebooting. > [...] > 06:44:02 fedora virtlogd[802]: 802: debug : virSystemdNotify:667 : Notify > 'STOPPING=1' > 06:44:02 fedora systemd[1]: Stopping virtlogd.service - libvirt logging > daemon... > 06:44:02 fedora systemd[1]: Stopping virtqemud.service - libvirt QEMU > daemon... > 06:44:02 fedora virtqemud[991]: 991: debug : virSystemdNotify:667 : Notify > 'STOPPING=1' > 06:44:02 fedora systemd[1]: virtlogd.service: Deactivated successfully. > 06:44:02 fedora systemd[1]: Stopped virtlogd.service - libvirt logging > daemon. > > (the shutdown times out, virtqemud kills the unresponsive vm) > > 06:44:27 fedora virtqemud[991]: 1053: debug : qemuProcessStop:8916 : > Shutting down vm=0x7f71ac032670 name=virt-vm1 id=1 pid=805, reason=destroyed, > asyncJob=none, flags=0x0 > 06:44:27 fedora virtqemud[991]: 1053: debug : > qemuDomainLogAppendMessage:5757 : Append log message (vm='virt-vm1' > message='2026-06-15 10:44:27.427+0000: shutting down, reason=destroyed > ) stdioLogD=1 > 06:44:27 fedora virtqemud[991]: 1053: error : virNetSocketReadWire:1767 : > Cannot recv data: Connection reset by peer > 06:44:27 fedora virtqemud[991]: 1053: debug : qemuProcessKill:8811 : > vm=0x7f71ac032670 name=virt-vm1 pid=805 flags=0x5 > > Now the log shows that we want to add VM log file message in > 'qemuDomainLogAppendMessage' but it fails because virtlogd is dead > already. > > Now the same happens also with 'virtlockd' but with much worse outcome, > especially if the configured action is to save the VMs because shutdown > of 'virtlockd' when locks are held ends up 'fencing' the VMs by killing > them. > > The same also happens when libvirt-guests is used to shutdown the guests > instead. > > This patch adds an explicit 'After=virtlo[ck|g]d.service' to the daemons > containing the qemu driver to ensure that the shutdown ordering makes > sense. This doesn't break socket activation (e.g. the log/lock daemons > are not started unless first invoked). > > Signed-off-by: Peter Krempa <[email protected]> > --- > src/qemu/virtqemud.service.extra.in | 4 ++++ > src/remote/libvirtd.service.in | 4 ++++ > 2 files changed, 8 insertions(+) > > diff --git a/src/qemu/virtqemud.service.extra.in > b/src/qemu/virtqemud.service.extra.in > index cc16b6a9bb..3cc2edcfd0 100644 > --- a/src/qemu/virtqemud.service.extra.in > +++ b/src/qemu/virtqemud.service.extra.in > @@ -6,6 +6,10 @@ Requires=virtlogd.socket > Wants=virtlockd.socket > After=virtlogd.socket > After=virtlockd.socket
Is there any point in keeping these two lines ? The "Wants" on the socket, and the "After" on the sevice should be enough ? > +# To ensure that our helper daemons are not shut down before the main daemon > +# shuts down we need also explicit ordering with the .service unit > +After=virtlogd.service > +After=virtlock.service > Wants=systemd-machined.service > After=systemd-machined.service > After=remote-fs.target > diff --git a/src/remote/libvirtd.service.in b/src/remote/libvirtd.service.in > index b0a062e885..f26494d646 100644 > --- a/src/remote/libvirtd.service.in > +++ b/src/remote/libvirtd.service.in > @@ -15,6 +15,10 @@ Requires=virtlogd.socket > Wants=virtlockd.socket > After=virtlogd.socket > After=virtlockd.socket > +# To ensure that our helper daemons are not shut down before the main daemon > +# shuts down we need also explicit ordering with the .service unit > +After=virtlogd.service > +After=virtlock.service > Wants=systemd-machined.service > After=network.target > After=dbus.service > -- > 2.54.0 > With regards, Daniel -- |: https://berrange.com ~~ https://hachyderm.io/@berrange :| |: https://libvirt.org ~~ https://entangle-photo.org :| |: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
