Bug#1091519: deb-systemd-helper: Fails when non-existing unit is listed in Also= line
Andrea Bolognani
eof at kiyuko.org
Fri Dec 27 22:10:35 GMT 2024
Package: init-system-helpers
Version: 1.67
Severity: normal
Tags: patch
When installing libvirt-daemon on a testing/unstable system, the
following error message is reported:
/usr/bin/deb-systemd-helper: error: unable to read virtlockd.socket
Full debug output, with useless information redacted:
$ sudo _DEB_SYSTEMD_HELPER_DEBUG=1 apt-get install --no-install-recommends libvirt-daemon
The following NEW packages will be installed:
libvirt-daemon
Selecting previously unselected package libvirt-daemon.
Unpacking libvirt-daemon (10.10.0-3) ...
Setting up libvirt-daemon (10.10.0-3) ...
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = unmask, scriptname = libvirtd.service, service_path = /lib/systemd/system/libvirtd.service
(deb-systemd-helper DEBUG) rmdir_if_empty /var/lib/systemd/deb-systemd-helper-masked
(deb-systemd-helper DEBUG) rmdir(/var/lib/systemd/deb-systemd-helper-masked) failed (No such file or directory)
(deb-systemd-helper DEBUG) rmdir_if_empty /var/lib/systemd/deb-systemd-user-helper-masked
(deb-systemd-helper DEBUG) rmdir(/var/lib/systemd/deb-systemd-user-helper-masked) failed (No such file or directory)
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = was-enabled, scriptname = libvirtd.service, service_path = /lib/systemd/system/libvirtd.service
(deb-systemd-helper DEBUG) Reading state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd.service.dsh-also
(deb-systemd-helper DEBUG) Contents: $VAR1 = [];
(deb-systemd-helper DEBUG) All links present, considering libvirtd.service was-enabled.
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = enable, scriptname = libvirtd.service, service_path = /lib/systemd/system/libvirtd.service
(deb-systemd-helper DEBUG) Using systemctl preset to enable libvirtd.service
Failed to enable auxiliary unit virtlockd.socket, ignoring.
Created symlink '/etc/systemd/system/sockets.target.wants/libvirtd.socket' → '/usr/lib/systemd/system/libvirtd.socket'.
Created symlink '/etc/systemd/system/sockets.target.wants/libvirtd-ro.socket' → '/usr/lib/systemd/system/libvirtd-ro.socket'.
Created symlink '/etc/systemd/system/sockets.target.wants/libvirtd-admin.socket' → '/usr/lib/systemd/system/libvirtd-admin.socket'.
/usr/bin/deb-systemd-helper: error: unable to read virtlockd.socket
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = unmask, scriptname = libvirtd-admin.socket, service_path = /lib/systemd/system/libvirtd-admin.socket
(deb-systemd-helper DEBUG) rmdir_if_empty /var/lib/systemd/deb-systemd-helper-masked
(deb-systemd-helper DEBUG) rmdir(/var/lib/systemd/deb-systemd-helper-masked) failed (No such file or directory)
(deb-systemd-helper DEBUG) rmdir_if_empty /var/lib/systemd/deb-systemd-user-helper-masked
(deb-systemd-helper DEBUG) rmdir(/var/lib/systemd/deb-systemd-user-helper-masked) failed (No such file or directory)
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = was-enabled, scriptname = libvirtd-admin.socket, service_path = /lib/systemd/system/libvirtd-admin.socket
(deb-systemd-helper DEBUG) Reading state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-admin.socket.dsh-also
(deb-systemd-helper DEBUG) Contents: $VAR1 = [];
(deb-systemd-helper DEBUG) All links present, considering libvirtd-admin.socket was-enabled.
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = enable, scriptname = libvirtd-admin.socket, service_path = /lib/systemd/system/libvirtd-admin.socket
(deb-systemd-helper DEBUG) Using systemctl preset to enable libvirtd-admin.socket
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.statefOsJc.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-admin.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.statenPIoH.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-admin.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateLCkXc.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-admin.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.statep2PDL.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-admin.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateM29Ok.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-admin.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateF7a2H.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-admin.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateDAd0c.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-admin.socket.dsh-also
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = unmask, scriptname = libvirtd-ro.socket, service_path = /lib/systemd/system/libvirtd-ro.socket
(deb-systemd-helper DEBUG) rmdir_if_empty /var/lib/systemd/deb-systemd-helper-masked
(deb-systemd-helper DEBUG) rmdir(/var/lib/systemd/deb-systemd-helper-masked) failed (No such file or directory)
(deb-systemd-helper DEBUG) rmdir_if_empty /var/lib/systemd/deb-systemd-user-helper-masked
(deb-systemd-helper DEBUG) rmdir(/var/lib/systemd/deb-systemd-user-helper-masked) failed (No such file or directory)
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = was-enabled, scriptname = libvirtd-ro.socket, service_path = /lib/systemd/system/libvirtd-ro.socket
(deb-systemd-helper DEBUG) Reading state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-ro.socket.dsh-also
(deb-systemd-helper DEBUG) Contents: $VAR1 = [];
(deb-systemd-helper DEBUG) All links present, considering libvirtd-ro.socket was-enabled.
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = enable, scriptname = libvirtd-ro.socket, service_path = /lib/systemd/system/libvirtd-ro.socket
(deb-systemd-helper DEBUG) Using systemctl preset to enable libvirtd-ro.socket
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.statetIBlZ.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-ro.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateBihfm.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-ro.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateH5caR.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-ro.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateQDBhi.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-ro.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.state1lH4W.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-ro.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateXiC5q.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-ro.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.statepS8xr.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd-ro.socket.dsh-also
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = unmask, scriptname = libvirtd.socket, service_path = /lib/systemd/system/libvirtd.socket
(deb-systemd-helper DEBUG) rmdir_if_empty /var/lib/systemd/deb-systemd-helper-masked
(deb-systemd-helper DEBUG) rmdir(/var/lib/systemd/deb-systemd-helper-masked) failed (No such file or directory)
(deb-systemd-helper DEBUG) rmdir_if_empty /var/lib/systemd/deb-systemd-user-helper-masked
(deb-systemd-helper DEBUG) rmdir(/var/lib/systemd/deb-systemd-user-helper-masked) failed (No such file or directory)
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = was-enabled, scriptname = libvirtd.socket, service_path = /lib/systemd/system/libvirtd.socket
(deb-systemd-helper DEBUG) Reading state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd.socket.dsh-also
(deb-systemd-helper DEBUG) Contents: $VAR1 = [];
(deb-systemd-helper DEBUG) All links present, considering libvirtd.socket was-enabled.
(deb-systemd-helper DEBUG) is purge = no
(deb-systemd-helper DEBUG) action = enable, scriptname = libvirtd.socket, service_path = /lib/systemd/system/libvirtd.socket
(deb-systemd-helper DEBUG) Using systemctl preset to enable libvirtd.socket
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.state0LqFQ.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.statePtygq.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateyivti.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.statelrMK_.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.statesTPSG.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.state2YGDX.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd.socket.dsh-also
(deb-systemd-helper DEBUG) Renaming temp file /var/lib/systemd/deb-systemd-helper-enabled/.stateQmQOZ.tmp to state file /var/lib/systemd/deb-systemd-helper-enabled/libvirtd.socket.dsh-also
Note that I had installed all dependencies (libvirt-daemon-common,
libvirt-daemon-log) ahead of time to ensure that only the relevant
package would be included in this transaction.
This issue has been reported several months ago as
https://bugs.debian.org/1082939
and unfortunately I hadn't been able to turn that into a proper
report against init-system-helpers until now. Apologies for the
delay.
The root cause is that libvirtd.service contains
[Install]
Also=virtlockd.socket
but virtlockd (as well as its sockets) is shipped in the
libvirt-daemon-lock package, and the libvirt-daemon package (which
contains libvirtd and its sockets) *intentionally* does not Depend on
it.
The explanation is that virtlockd is a soft dependency for libvirtd:
specifically, libvirtd.service contains
[Unit]
Wants=virtlockd.socket
After=virtlockd.socket
but it can work perfectly well without it, and in fact in most cases
the virtlockd integration will be disabled, as per default
configuration. This is why Wants= is used instead of Requires=.
systemd itself handles this nicely by simply ignoring the soft
dependency when the corresponing unit doesn't exist.
deb-systemd-helper, on the other hand, reports an error and refuses
to create the libvirtd.service.dsh-also state file, which in turns
results in partial cleanup on purge as well as potentially other
side-effects that I haven't noticed.
I believe that deb-systemd-helper should follow systemd's example and
treat this situation more gracefully, but to be completely honest I
don't fully understand what its state files are used for in the first
place, so it's quite possible that this take is unhelpfully naive :)
I've attached a tentative patch that turns the hard failure into a
soft one. Consider it a mere conversation starter.
Cheers.
--
Andrea Bolognani <eof at kiyuko.org>
Resistance is futile, you will be garbage collected.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: deb-systemd-helper.diff
Type: text/x-diff
Size: 749 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-systemd-maintainers/attachments/20241227/da4e5890/attachment.diff>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-systemd-maintainers/attachments/20241227/da4e5890/attachment.sig>
More information about the Pkg-systemd-maintainers
mailing list