From 05947befcec9afb83b9ce48d613ff372c63e2ed1 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 29 Apr 2013 21:11:37 -0300 Subject: [PATCH] units: add an easy-to-use unit template file systemd-nspawn@.service for running containers as system services --- Makefile.am | 4 +++- src/nspawn/nspawn.c | 18 ++++++++++++------ units/.gitignore | 1 + units/systemd-nspawn@.service.in | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 units/systemd-nspawn@.service.in 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