[Bug 1575572] Re: apache2 fails to start if installed via cloud config (on Xenial)
Martin Pitt
martin.pitt at ubuntu.com
Fri Apr 29 09:17:34 UTC 2016
For the record, even after fixing this, installing packages from current
cloud-init will still not be 100% reliable in its current form.
The design problem here is that cloud-init runs *in* the boot sequence,
i. e. in the transaction where default.target and its dependencies get
started. You can't place/start new services into the boot dependency
tree (i. e. dependencies of default.target) while default.target is
still being started. Any new service which wants to start needs to wait
until after the initial boot happens, and will then start afterwards.
invoke-rc.d has some code to deal with that situation, to avoid
deadlocks: You can't run the blocking "systemctl start" in a postinst
that you run within the boot sequence -- you can at most try to start it
without any dependencies and in non-blocking mode, which is why invoke-
rc.d has this code:
# avoid deadlocks during bootup and shutdown from units/hooks
# which call "invoke-rc.d service reload" and similar, since
# the synchronous wait plus systemd's normal behaviour of
# transactionally processing all dependencies first easily
# causes dependency loops
if ! OUT=$(systemctl is-system-running 2>/dev/null) && [ "$OUT" != "degraded" ]; then
sctl_args="--job-mode=ignore-dependencies"
fi
This was mostly added for things like /etc/network/ifup.d/ scripts that
start stuff, to avoid getting deadlocks on boot. But it would apply here
too.
For the most part this should work fine, unless apache expects that any
of its dependencies actually get started in that situation (they can't).
But if you *do* install a package with an init.d script or service that
has dependencies that are not already running, they will *not* be
started.
This behaviour of installing packages or configuring your system while
the system isn't booted yet might also bite you in other cases (it
certainly bit me a number of cases). Maybe we should discuss how to move
that after the boot? I do that in https://git.launchpad.net/~ubuntu-
release/+git/autopkgtest-cloud/tree/tools/armf-lxd-slave.userdata but
this doesn't look very pretty.
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to systemd in Ubuntu.
https://bugs.launchpad.net/bugs/1575572
Title:
apache2 fails to start if installed via cloud config (on Xenial)
Status in cloud-init package in Ubuntu:
Confirmed
Status in init-system-helpers package in Ubuntu:
In Progress
Status in systemd package in Ubuntu:
Won't Fix
Bug description:
Using the following cloud config, apache2 will fail to start on
installation on Xenial:
#cloud-config
packages:
- apache2
See for example:
$ gcloud compute instances create xenial-$(date +%y%m%d-%H%M) --image ubuntu-1604-xenial-v20160420c --image-project ubuntu-os-cloud --metadata-from-file user-data=cloud-config
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
xenial-160427-1050 europe-west1-d n1-standard-1 10.240.0.7 104.155.86.94 RUNNING
$ ssh ubuntu at 104.155.86.94 systemctl status apache2.service
● apache2.service - LSB: Apache2 web server
Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/cloud-init/+bug/1575572/+subscriptions
More information about the foundations-bugs
mailing list