summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-04-29 21:11:37 -0300
committerLennart Poettering <lennart@poettering.net>2013-04-30 08:36:02 -0300
commit05947befcec9afb83b9ce48d613ff372c63e2ed1 (patch)
tree3c54249a6203ae370340b22dbef3cb0bed1c9042
parent0df2d38abfc787f40149072340d79b4f7b682a24 (diff)
units: add an easy-to-use unit template file systemd-nspawn@.service for running containers as system services
-rw-r--r--Makefile.am4
-rw-r--r--src/nspawn/nspawn.c18
-rw-r--r--units/.gitignore1
-rw-r--r--units/systemd-nspawn@.service.in18
4 files changed, 34 insertions, 7 deletions
diff --git a/Makefile.am b/Makefile.am
index ff70223395..9e0f5fb20e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -442,7 +442,8 @@ nodist_systemunit_DATA = \
units/initrd-parse-etc.service \
units/initrd-cleanup.service \
units/initrd-udevadm-cleanup-db.service \
- units/initrd-switch-root.service
+ units/initrd-switch-root.service \
+ units/systemd-nspawn@.service
dist_userunit_DATA = \
units/user/default.target \
@@ -489,6 +490,7 @@ EXTRA_DIST += \
units/initrd-cleanup.service.in \
units/initrd-udevadm-cleanup-db.service.in \
units/initrd-switch-root.service.in \
+ units/systemd-nspawn@.service.in \
introspect.awk
CLEANFILES += \
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index 0a46313636..d772b478fd 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -1231,9 +1231,13 @@ int main(int argc, char *argv[]) {
log_parse_environment();
log_open();
- r = parse_argv(argc, argv);
- if (r <= 0)
+ k = parse_argv(argc, argv);
+ if (k < 0)
goto finish;
+ else if (k == 0) {
+ r = EXIT_SUCCESS;
+ goto finish;
+ }
if (arg_directory) {
char *p;
@@ -1321,8 +1325,8 @@ int main(int argc, char *argv[]) {
goto finish;
}
- r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, newcg, false);
- if (r <= 0 && r != -ENOENT) {
+ k = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, newcg, true);
+ if (k <= 0 && k != -ENOENT) {
log_error("Container already running.");
free(newcg);
@@ -1366,6 +1370,8 @@ int main(int argc, char *argv[]) {
goto finish;
}
+ sd_notify(0, "READY=1");
+
assert_se(sigemptyset(&mask) == 0);
sigset_add_many(&mask, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, -1);
assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0);
@@ -1701,8 +1707,8 @@ int main(int argc, char *argv[]) {
if (saved_attr_valid)
tcsetattr(STDIN_FILENO, TCSANOW, &saved_attr);
- r = wait_for_terminate(pid, &status);
- if (r < 0) {
+ k = wait_for_terminate(pid, &status);
+ if (k < 0) {
r = EXIT_FAILURE;
break;
}
diff --git a/units/.gitignore b/units/.gitignore
index d2f3eb40d6..606d947634 100644
--- a/units/.gitignore
+++ b/units/.gitignore
@@ -57,3 +57,4 @@
/initrd-parse-etc.service
/initrd-switch-root.service
/initrd-udevadm-cleanup-db.service
+/systemd-nspawn@.service
diff --git a/units/systemd-nspawn@.service.in b/units/systemd-nspawn@.service.in
new file mode 100644
index 0000000000..c0d5886f88
--- /dev/null
+++ b/units/systemd-nspawn@.service.in
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Container %i
+Documentation=man:systemd-nspawn(1)
+
+[Service]
+ExecStart=@bindir@/systemd-nspawn -bjD /var/lib/container/%i
+ControlGroup=%R/machine/%i.nspawn cpu:/
+Type=notify
+
+[Install]
+Also=multi-user.target