** Description changed:
Ubuntu Core 16 images using cloud-init fail to function when the
DataSource is over the network (Like OpenStack) as networking is not yet
available when cloud-init.service runs.
cloud-init service unit deps look like this:
[Unit]
Description=Initial cloud-init job (metadata service crawler)
DefaultDependencies=no
Wants=cloud-init-local.service
Wants=local-fs.target
Wants=sshd-keygen.service
Wants=sshd.service
After=cloud-init-local.service
After=networking.service
Requires=networking.service
Before=basic.target
Before=dbus.socket
Before=network-online.target
Before=sshd-keygen.service
Before=sshd.service
Before=systemd-user-sessions.service
Conflicts=shutdown.target
Here's networkd unit deps:
[Unit]
Description=Network Service
Documentation=man:systemd-networkd.service(8)
ConditionCapability=CAP_NET_ADMIN
DefaultDependencies=no
# dbus.service can be dropped once on kdbus, and systemd-udevd.service can be
# dropped once tuntap is moved to netlink
After=systemd-udevd.service dbus.service network-pre.target
systemd-sysusers.service systemd-sysctl.service
Before=network.target multi-user.target shutdown.target
Conflicts=shutdown.target
Wants=network.target
# On kdbus systems we pull in the busname explicitly, because it
# carries policy that allows the daemon to acquire its name.
Wants=org.freedesktop.network1.busname
After=org.freedesktop.network1.busname
And a critical-chain output:
root@snap-test7:~# systemd-analyze critical-chain systemd-networkd
Failed to get ID: Unit name systemd-networkd is not valid.
The time after the unit is active or started is printed after the "@"
character.
The time the unit takes to start is printed after the "+" character.
root@snap-test7:~# systemd-analyze critical-chain systemd-networkd.service
The time after the unit is active or started is printed after the "@"
character.
The time the unit takes to start is printed after the "+" character.
systemd-networkd.service +440ms
└─dbus.service @11.461s
└─basic.target @11.403s
└─sockets.target @11.401s
└─dbus.socket @11.398s
└─cloud-init.service @10.127s +1.266s
└─networking.service @9.305s +799ms
└─network-pre.target @9.295s
└─cloud-init-local.service @3.822s +5.469s
└─local-fs.target @3.813s
└─run-cgmanager-fs.mount @12.687s
└─local-fs-pre.target @1.393s
└─systemd-tmpfiles-setup-dev.service @1.116s +195ms
└─kmod-static-nodes.service @887ms +193ms
└─system.slice @783ms
└─-.slice @721ms
cloud-init would need networkd to run at or before 'networking.service'
so it can raise networking to then find and use network-based
datasources.
# grep systemd /usr/share/snappy/dpkg.list
ii libnss-resolve:amd64 229-4ubuntu11
amd64 nss module to resolve names via systemd-resolved
ii libpam-systemd:amd64 229-4ubuntu11
amd64 system and service manager - PAM module
ii libsystemd0:amd64 229-4ubuntu11
amd64 systemd utility library
ii systemd 229-4ubuntu11
amd64 system and service manager
ii systemd-sysv 229-4ubuntu11
amd64 system and service manager - SysV links
# grep cloud-init /usr/share/snappy/dpkg.list
ii cloud-init
0.7.8-201610260005-gf7a5756-0ubuntu1~trunk~ubuntu16.04.1 all Init
scripts for cloud instances
-
SRU INFORMATION FOR systemd
===========================
- Fix: For xenial it is sufficient to drop systemd-networkd's
After=dbus.service (https://github.com/systemd/systemd/commit/5f004d1e32)
+ Fix: For xenial it is sufficient to drop systemd-networkd's
After=dbus.service (https://github.com/systemd/systemd/commit/5f004d1e32) and
drop the useless org.freedesktop.network1.busname unit (which is always
"condition failed" as there is no kdbus, but it moves systemd-network.service
after sockets.target which is too late for cloud-init).
Regression potential: Low. networkd is not widely being used outside of
netplan/snappy in xenial. Running it before dbus.service is running has two
consequences:
- - It cannot immediately expose its D-Bus status interface. But it will retry
every 5 s until that succeeds, so the D-Bus status interface will continue to
work. (see test case)
- - If a DHCP response with a hostname or timezone is received before
dbus.service is running, it cannot talk to systemd-hostnamed/systemd-timedated
to set these properties (if enabled). However, this is broken in xenial anyway
as it fails on polkit permissions (this and retrying this configuration after
D-Bus is up has been fixed in upstream master now).
+ - It cannot immediately expose its D-Bus status interface. But it will retry
every 5 s until that succeeds, so the D-Bus status interface will continue to
work. (see test case)
+ - If a DHCP response with a hostname or timezone is received before
dbus.service is running, it cannot talk to systemd-hostnamed/systemd-timedated
to set these properties (if enabled). However, this is broken in xenial anyway
as it fails on polkit permissions (this and retrying this configuration after
D-Bus is up has been fixed in upstream master now).
Test case:
- - Install nplan, set up a netplan configuration and remove
/etc/network/interfaces.
- - Upgrade to the proposed packages.
- - Ensure that the network is still functional and "busctl" shows
org.freedesktop.network1, i. e. networkd successfully connected to the bus.
- - Check if systemd-networkd.service starts before dbus.service; if not, you
can force it with "sudo systemctl edit systemd-networkd.service" and
- [Unit]
- Before=sysinit.target
+ - Install nplan, set up a netplan configuration and remove
/etc/network/interfaces.
+ - Upgrade to the proposed packages.
+ - Ensure that the network is still functional and "busctl" shows
org.freedesktop.network1, i. e. networkd successfully connected to the bus.
+ - Check the journal that systemd-networkd.service starts before
dbus.service, which should usually be the case with this fix. Check "journalctl
-b" for "Started Network Service." vs. "Started D-Bus System Message Bus."
- (This is effectively what cloud-init.service will do soon.)
+ If it repeatedly starts the other way around, you can force it with "sudo
systemctl edit systemd-networkd.service" and
+ [Unit]
+ Before=sysinit.target
+
+ (This is effectively what cloud-init.service will do soon.)
** Description changed:
Ubuntu Core 16 images using cloud-init fail to function when the
DataSource is over the network (Like OpenStack) as networking is not yet
available when cloud-init.service runs.
cloud-init service unit deps look like this:
[Unit]
Description=Initial cloud-init job (metadata service crawler)
DefaultDependencies=no
Wants=cloud-init-local.service
Wants=local-fs.target
Wants=sshd-keygen.service
Wants=sshd.service
After=cloud-init-local.service
After=networking.service
Requires=networking.service
Before=basic.target
Before=dbus.socket
Before=network-online.target
Before=sshd-keygen.service
Before=sshd.service
Before=systemd-user-sessions.service
Conflicts=shutdown.target
Here's networkd unit deps:
[Unit]
Description=Network Service
Documentation=man:systemd-networkd.service(8)
ConditionCapability=CAP_NET_ADMIN
DefaultDependencies=no
# dbus.service can be dropped once on kdbus, and systemd-udevd.service can be
# dropped once tuntap is moved to netlink
After=systemd-udevd.service dbus.service network-pre.target
systemd-sysusers.service systemd-sysctl.service
Before=network.target multi-user.target shutdown.target
Conflicts=shutdown.target
Wants=network.target
# On kdbus systems we pull in the busname explicitly, because it
# carries policy that allows the daemon to acquire its name.
Wants=org.freedesktop.network1.busname
After=org.freedesktop.network1.busname
And a critical-chain output:
root@snap-test7:~# systemd-analyze critical-chain systemd-networkd
Failed to get ID: Unit name systemd-networkd is not valid.
The time after the unit is active or started is printed after the "@"
character.
The time the unit takes to start is printed after the "+" character.
root@snap-test7:~# systemd-analyze critical-chain systemd-networkd.service
The time after the unit is active or started is printed after the "@"
character.
The time the unit takes to start is printed after the "+" character.
systemd-networkd.service +440ms
└─dbus.service @11.461s
└─basic.target @11.403s
└─sockets.target @11.401s
└─dbus.socket @11.398s
└─cloud-init.service @10.127s +1.266s
└─networking.service @9.305s +799ms
└─network-pre.target @9.295s
└─cloud-init-local.service @3.822s +5.469s
└─local-fs.target @3.813s
└─run-cgmanager-fs.mount @12.687s
└─local-fs-pre.target @1.393s
└─systemd-tmpfiles-setup-dev.service @1.116s +195ms
└─kmod-static-nodes.service @887ms +193ms
└─system.slice @783ms
└─-.slice @721ms
cloud-init would need networkd to run at or before 'networking.service'
so it can raise networking to then find and use network-based
datasources.
# grep systemd /usr/share/snappy/dpkg.list
ii libnss-resolve:amd64 229-4ubuntu11
amd64 nss module to resolve names via systemd-resolved
ii libpam-systemd:amd64 229-4ubuntu11
amd64 system and service manager - PAM module
ii libsystemd0:amd64 229-4ubuntu11
amd64 systemd utility library
ii systemd 229-4ubuntu11
amd64 system and service manager
ii systemd-sysv 229-4ubuntu11
amd64 system and service manager - SysV links
# grep cloud-init /usr/share/snappy/dpkg.list
ii cloud-init
0.7.8-201610260005-gf7a5756-0ubuntu1~trunk~ubuntu16.04.1 all Init
scripts for cloud instances
SRU INFORMATION FOR systemd
===========================
Fix: For xenial it is sufficient to drop systemd-networkd's
After=dbus.service (https://github.com/systemd/systemd/commit/5f004d1e32) and
drop the useless org.freedesktop.network1.busname unit (which is always
"condition failed" as there is no kdbus, but it moves systemd-network.service
after sockets.target which is too late for cloud-init).
Regression potential: Low. networkd is not widely being used outside of
netplan/snappy in xenial. Running it before dbus.service is running has two
consequences:
- It cannot immediately expose its D-Bus status interface. But it will retry
every 5 s until that succeeds, so the D-Bus status interface will continue to
work. (see test case)
- If a DHCP response with a hostname or timezone is received before
dbus.service is running, it cannot talk to systemd-hostnamed/systemd-timedated
to set these properties (if enabled). However, this is broken in xenial anyway
as it fails on polkit permissions (this and retrying this configuration after
D-Bus is up has been fixed in upstream master now).
+ As for removing the "*.busname" units: kdbus has never been part of any
+ distribiution, there had just been some experimental DKMS package in
+ some PPA for it. It's dead as an upstream project, so by dropping the
+ *.busname unit(s) from xenial there should be no practical effect as
+ these should always not start with "condition failed".
+
Test case:
- Install nplan, set up a netplan configuration and remove
/etc/network/interfaces.
- Upgrade to the proposed packages.
- Ensure that the network is still functional and "busctl" shows
org.freedesktop.network1, i. e. networkd successfully connected to the bus.
- Check the journal that systemd-networkd.service starts before
dbus.service, which should usually be the case with this fix. Check "journalctl
-b" for "Started Network Service." vs. "Started D-Bus System Message Bus."
- If it repeatedly starts the other way around, you can force it with "sudo
systemctl edit systemd-networkd.service" and
+ If it repeatedly starts the other way around, you can force it with "sudo
systemctl edit systemd-networkd.service" and
[Unit]
Before=sysinit.target
(This is effectively what cloud-init.service will do soon.)
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1636912
Title:
systemd-networkd runs too late for cloud-init.service (net)
To manage notifications about this bug go to:
https://bugs.launchpad.net/systemd/+bug/1636912/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs