units: add an easy-to-use unit template file systemd-nspawn@.service for running containers as system services

This commit is contained in:
Lennart Poettering 2013-04-29 21:11:37 -03:00
parent 0df2d38abf
commit 05947befce
4 changed files with 34 additions and 7 deletions

View file

@ -442,7 +442,8 @@ nodist_systemunit_DATA = \
units/initrd-parse-etc.service \ units/initrd-parse-etc.service \
units/initrd-cleanup.service \ units/initrd-cleanup.service \
units/initrd-udevadm-cleanup-db.service \ units/initrd-udevadm-cleanup-db.service \
units/initrd-switch-root.service units/initrd-switch-root.service \
units/systemd-nspawn@.service
dist_userunit_DATA = \ dist_userunit_DATA = \
units/user/default.target \ units/user/default.target \
@ -489,6 +490,7 @@ EXTRA_DIST += \
units/initrd-cleanup.service.in \ units/initrd-cleanup.service.in \
units/initrd-udevadm-cleanup-db.service.in \ units/initrd-udevadm-cleanup-db.service.in \
units/initrd-switch-root.service.in \ units/initrd-switch-root.service.in \
units/systemd-nspawn@.service.in \
introspect.awk introspect.awk
CLEANFILES += \ CLEANFILES += \

View file

@ -1231,9 +1231,13 @@ int main(int argc, char *argv[]) {
log_parse_environment(); log_parse_environment();
log_open(); log_open();
r = parse_argv(argc, argv); k = parse_argv(argc, argv);
if (r <= 0) if (k < 0)
goto finish; goto finish;
else if (k == 0) {
r = EXIT_SUCCESS;
goto finish;
}
if (arg_directory) { if (arg_directory) {
char *p; char *p;
@ -1321,8 +1325,8 @@ int main(int argc, char *argv[]) {
goto finish; goto finish;
} }
r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, newcg, false); k = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, newcg, true);
if (r <= 0 && r != -ENOENT) { if (k <= 0 && k != -ENOENT) {
log_error("Container already running."); log_error("Container already running.");
free(newcg); free(newcg);
@ -1366,6 +1370,8 @@ int main(int argc, char *argv[]) {
goto finish; goto finish;
} }
sd_notify(0, "READY=1");
assert_se(sigemptyset(&mask) == 0); assert_se(sigemptyset(&mask) == 0);
sigset_add_many(&mask, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, -1); sigset_add_many(&mask, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, -1);
assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0); assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0);
@ -1701,8 +1707,8 @@ int main(int argc, char *argv[]) {
if (saved_attr_valid) if (saved_attr_valid)
tcsetattr(STDIN_FILENO, TCSANOW, &saved_attr); tcsetattr(STDIN_FILENO, TCSANOW, &saved_attr);
r = wait_for_terminate(pid, &status); k = wait_for_terminate(pid, &status);
if (r < 0) { if (k < 0) {
r = EXIT_FAILURE; r = EXIT_FAILURE;
break; break;
} }

1
units/.gitignore vendored
View file

@ -57,3 +57,4 @@
/initrd-parse-etc.service /initrd-parse-etc.service
/initrd-switch-root.service /initrd-switch-root.service
/initrd-udevadm-cleanup-db.service /initrd-udevadm-cleanup-db.service
/systemd-nspawn@.service

View file

@ -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