Am Dienstag, den 22.05.2018, 12:36 +0200 schrieb Michael Biebl:
> Am 22.05.2018 um 12:27 schrieb Benjamin Drung:
> > networking.service calls 'udevadm
> > settle' in 'ExecStartPre'.
> 
> It does, indeed. But not unconditionally.
> 
> ifupdown is basically installed on every system, even if e.g.
> NetworkManager is actually in charge and /e/n/i is empty.
> 
> This would mean you unconditionally pull in systemd-udev-
> settle.service
> on basically every system out there, and we certainly don't want
> that.
> systemd-udev-settle.service is a hack.

Attached is an updated and tested patch that splits the udevadm settle
command into a separate ifupdown-pre service without modifying the
logic. So a no-op 'udevadm settle' will stay a no-op.

-- 
Benjamin Drung
System Developer
Debian & Ubuntu Developer

ProfitBricks GmbH
Greifswalder Str. 207
10405 Berlin

Email: benjamin.dr...@profitbricks.com
URL: https://www.profitbricks.de

Sitz der Gesellschaft: Berlin
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B
Geschäftsführer: Achim Weiss, Matthias Steinberg, Christoph Steffens
From 1cdf80cbaa1ad881f5b44c1ad5504c5082c9245d Mon Sep 17 00:00:00 2001
From: Benjamin Drung <benjamin.dr...@profitbricks.com>
Date: Tue, 22 May 2018 11:52:24 +0200
Subject: [PATCH] Split 'udevadm settle' from networking.service

udev rules trigger rdma-load-modules@infiniband.service (which loads the
ib_ipoib kernel module) which should run before networking.service.
The networking service should not attempt to do udevadm settle
internally, but it must depend on separate service for that instead.

The reason is due to how systemd scheduals ordering. Once it starts
running networking.service 'ExecStartPre' it will not re-consider
order past that point. So any activations done by udev while settling
have no impact on networking.service at all.

Closes: #899002
Signed-off-by: Benjamin Drung <benjamin.dr...@profitbricks.com>
---
 debian/ifupdown-pre.service | 13 +++++++++++++
 debian/networking.service   |  4 ++--
 debian/rules                |  1 +
 3 files changed, 16 insertions(+), 2 deletions(-)
 create mode 100644 debian/ifupdown-pre.service

diff --git a/debian/ifupdown-pre.service b/debian/ifupdown-pre.service
new file mode 100644
index 0000000..b6602ad
--- /dev/null
+++ b/debian/ifupdown-pre.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Helper to synchronize boot up for ifupdown
+DefaultDependencies=no
+Wants=systemd-udevd.service
+After=systemd-udev-trigger.service
+Before=network.target
+
+[Service]
+Type=oneshot
+TimeoutSec=180
+RemainAfterExit=yes
+EnvironmentFile=-/etc/default/networking
+ExecStart=/bin/sh -c 'if [ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=lo)" ]; then udevadm settle; fi'
diff --git a/debian/networking.service b/debian/networking.service
index f5e5bcd..593172b 100644
--- a/debian/networking.service
+++ b/debian/networking.service
@@ -2,8 +2,9 @@
 Description=Raise network interfaces
 Documentation=man:interfaces(5)
 DefaultDependencies=no
+Requires=ifupdown-pre.service
 Wants=network.target
-After=local-fs.target network-pre.target apparmor.service systemd-sysctl.service systemd-modules-load.service
+After=local-fs.target network-pre.target apparmor.service systemd-sysctl.service systemd-modules-load.service ifupdown-pre.service
 Before=network.target shutdown.target network-online.target
 Conflicts=shutdown.target
 
@@ -14,7 +15,6 @@ WantedBy=network-online.target
 [Service]
 Type=oneshot
 EnvironmentFile=-/etc/default/networking
-ExecStartPre=-/bin/sh -c 'if [ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=lo)" ]; then udevadm settle; fi'
 ExecStart=/sbin/ifup -a --read-environment
 ExecStop=/sbin/ifdown -a --read-environment --exclude=lo
 RemainAfterExit=true
diff --git a/debian/rules b/debian/rules
index c3761c8..e1457b4 100755
--- a/debian/rules
+++ b/debian/rules
@@ -23,6 +23,7 @@ override_dh_installinit:
 	dh_installinit --name=networking --noscripts
 	dh_installsystemd --name=networking
 	dh_installsystemd --name=ifup@
+	dh_installsystemd --name=ifupdown-pre
 	dh_installsystemd --no-enable --no-start --name=ifupdown-wait-online
 
 override_dh_auto_clean:
-- 
2.17.0

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to