9c1e04d0fa
This the patch implements a notificaiton mechanism from the init process in the container to systemd-nspawn. The switch --notify-ready=yes configures systemd-nspawn to wait the "READY=1" message from the init process in the container to send its own to systemd. --notify-ready=no is equivalent to the previous behavior before this patch, systemd-nspawn notifies systemd with a "READY=1" message when the container is created. This notificaiton mechanism uses socket file with path relative to the contanier "/run/systemd/nspawn/notify". The default values it --notify-ready=no. It is also possible to configure this mechanism from the .nspawn files using NotifyReady. This parameter takes the same options of the command line switch. Before this patch, systemd-nspawn notifies "ready" after the inner child was created, regardless the status of the service running inside it. Now, with --notify-ready=yes, systemd-nspawn notifies when the service is ready. This is really useful when there are dependencies between different contaniers. Fixes https://github.com/systemd/systemd/issues/1369 Based on the work from https://github.com/systemd/systemd/pull/3022 Testing: Boot a OS inside a container with systemd-nspawn. Note: modify the commands accordingly with your filesystem. 1. Create a filesystem where you can boot an OS. 2. sudo systemd-nspawn -D ${HOME}/distros/fedora-23/ sh 2.1. Create the unit file /etc/systemd/system/sleep.service inside the container (You can use the example below) 2.2. systemdctl enable sleep 2.3 exit 3. sudo systemd-run --service-type=notify --unit=notify-test ${HOME}/systemd/systemd-nspawn --notify-ready=yes -D ${HOME}/distros/fedora-23/ -b 4. In a different shell run "systemctl status notify-test" When using --notify-ready=yes the service status is "activating" for 20 seconds before being set to "active (running)". Instead, using --notify-ready=no the service status is marked "active (running)" quickly, without waiting for the 20 seconds. This patch was also test with --private-users=yes, you can test it just adding it at the end of the command at point 3. ------ sleep.service ------ [Unit] Description=sleep After=network.target [Service] Type=oneshot ExecStart=/bin/sleep 20 [Install] WantedBy=multi-user.target ------------ end ------------ |
||
---|---|---|
.. | ||
.gitignore | ||
Makefile | ||
nspawn-cgroup.c | ||
nspawn-cgroup.h | ||
nspawn-expose-ports.c | ||
nspawn-expose-ports.h | ||
nspawn-gperf.gperf | ||
nspawn-mount.c | ||
nspawn-mount.h | ||
nspawn-network.c | ||
nspawn-network.h | ||
nspawn-patch-uid.c | ||
nspawn-patch-uid.h | ||
nspawn-register.c | ||
nspawn-register.h | ||
nspawn-seccomp.c | ||
nspawn-seccomp.h | ||
nspawn-settings.c | ||
nspawn-settings.h | ||
nspawn-setuid.c | ||
nspawn-setuid.h | ||
nspawn-stub-pid1.c | ||
nspawn-stub-pid1.h | ||
nspawn.c | ||
test-patch-uid.c |