nfs-common won't restart all services after upgrade
Andreas Hasenack
andreas at canonical.com
Thu May 13 12:33:38 UTC 2021
Hi,
tl;dr
I filed https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/1928259
found while testing
https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/1927745 and
verifying that rpc.gssd was not restarted after a package upgrade. Which
means the fix wasn't available until the service was restarted manually.
# Troubleshooting story
I was testing
https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/1927745, and while
the fix is correct, it didn't always "stick" after I upgraded the packages.
Further troubleshooting showed that some of the NFS services are not
restarted after a package upgrade, under a specific condition which took a
while to figure out.
Many services make up a NFS server or client, so sometime ago debian
decided to wrap them all around a systemd service called nfs-utils.service,
which is a bit fake, used just to coordinate all the real services. Its
header explains it:
$ systemctl cat nfs-utils.service
# /lib/systemd/system/nfs-utils.service
[Unit]
Description=NFS server and client services
# This service should never be stopped, only restarted.
# When it is re-started, all other services which declare
# themselves to be "PartOf" this service will also be
# restarted. Thus
# systemctl restart nfs-utils
# will restart all daemons which are part of nfs-utils
# and which are running. This is useful after a software
# update.
# This is a "service" rather than "target" so that we
# don't need to say "systemctl restart nfs-utils.target".
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
d/rules has these, and we can see it does not enable nfs-utils.service, but
asks for it to be restarted on upgrade:
dh_systemd_enable -p nfs-common nfs-client.target
dh_systemd_enable -p nfs-kernel-server nfs-server.service
dh_installinit -pnfs-common -R
dh_systemd_start -p nfs-common --restart-after-upgrade
nfs-utils.service
dh_systemd_start -p nfs-kernel-server --restart-after-upgrade
nfs-server.service
And this "fake" service really can't be enabled:
$ sudo systemctl enable nfs-utils.service
The unit files have no installation config (WantedBy, RequiredBy, Also,
Alias
settings in the [Install] section, and DefaultInstance for template units).
(...long explanation follows this output ...)
We get this during package install:
Setting up nfs-common (1:1.3.4-2.1ubuntu5.3) ...
nfs-utils.service is a disabled or a static unit not running, not starting
it.
Even when upgrading:
Setting up nfs-common (1:1.3.4-2.1ubuntu5.4) ...
nfs-utils.service is a disabled or a static unit not running, not starting
it.
This is because the service is not enabled.
Critically for the bug I'm fixing, rpc.gssd is not restarted, so the fix
isn't applied :/
Before upgrade:
442 ? Ss 0:00 /usr/sbin/blkmapd
7146 ? Ss 0:00 /usr/sbin/rpc.gssd
7399 ? Ss 0:00 /usr/sbin/rpc.idmapd
7406 ? Ss 0:00 /usr/sbin/rpc.mountd --manage-gids
7400 ? Ss 0:00 /usr/sbin/rpc.svcgssd
After pkg upgrade:
442 ? Ss 0:00 /usr/sbin/blkmapd
7146 ? Ss 0:00 /usr/sbin/rpc.gssd
8421 ? Ss 0:00 /usr/sbin/rpc.idmapd
8422 ? Ss 0:00 /usr/sbin/rpc.mountd --manage-gids
8420 ? Ss 0:00 /usr/sbin/rpc.svcgssd
If I do a manual "sudo systemctl start nfs-utils.service" (or restart)
before upgrading the package, then all these processes are restarted after
the package upgrade, because deb-systemd-invoke sees nfs-utils.service as
"started". From its code:
# If the job is disabled and is not currently running, the job is not
started or restarted.
# However, if the job is disabled but has been forced into the running
state, we *do* stop
# and restart it since this is expected behaviour for the admin who forced
the start.
# We don't autostart static units either.
I filed https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/1928259
and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=988430.
Some ideas I'm considering:
a) just do a systemctl start before the #DEBHELPER# marker, like this:
--- a/debian/nfs-common.postinst
+++ b/debian/nfs-common.postinst
@@ -43,6 +43,10 @@ case "$1" in
if [ -f /lib/init/rw/sendsigs.omit.d/statd ]; then
mv /lib/init/rw/sendsigs.omit.d/statd /run/sendsigs.omit.d/statd
fi
+
+ # always "start" nfs-utils.service, so package upgrades will restart
it,
+ # see LP: #1928259
+ systemctl start nfs-utils.service > /dev/null || true
;;
esac
b) Don't use dh_systemd_* in d/rules for nfs-utils.service, and do my own
handling in d/nfs-common.postinst using systemctl directly, instead of
deb-systemd-invoke, i.e., something like (also untested):
diff --git a/debian/nfs-common.postinst b/debian/nfs-common.postinst
index f709d53..feb375a 100644
--- a/debian/nfs-common.postinst
+++ b/debian/nfs-common.postinst
@@ -43,11 +43,19 @@ case "$1" in
if [ -f /lib/init/rw/sendsigs.omit.d/statd ]; then
mv /lib/init/rw/sendsigs.omit.d/statd /run/sendsigs.omit.d/statd
fi
-
- # always "start" nfs-utils.service, so package upgrades will restart
it,
- # see LP: #1928259
- systemctl start nfs-utils.service > /dev/null || true
;;
esac
+if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" =
"abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
+ if [ -d /run/systemd/system ]; then
+ systemctl --system daemon-reload >/dev/null || true
+ if [ -n "$2" ]; then
+ _dh_action=restart
+ else
+ _dh_action=start
+ fi
+ systemctl $_dh_action 'nfs-utils.service' >/dev/null || true
+ fi
+fi
+
#DEBHELPER#
diff --git a/debian/rules b/debian/rules
index 8bb2f25..3259d3b 100755
--- a/debian/rules
+++ b/debian/rules
@@ -57,7 +57,6 @@ binary-arch: build
dh_systemd_enable -p nfs-common nfs-client.target
dh_systemd_enable -p nfs-kernel-server nfs-server.service
dh_installinit -pnfs-common -R
- dh_systemd_start -p nfs-common --restart-after-upgrade
nfs-utils.service
dh_systemd_start -p nfs-kernel-server --restart-after-upgrade
nfs-server.service
install -m 0755 debian/nfs-kernel-server.init
debian/nfs-kernel-server/etc/init.d/nfs-kernel-server
install -m 0644 debian/nfs-common.bugcontrol
debian/nfs-common/usr/share/bug/nfs-common/control
I just grabbed the bits that debhelper added for the dh_systemd_start line
I removed, and replaced deb-systemd-invoke with systemctl
Any other ideas?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/ubuntu-devel/attachments/20210513/8698a19e/attachment.html>
More information about the ubuntu-devel
mailing list