]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/main.c
main: allow system wide limits for services
[thirdparty/systemd.git] / src / core / main.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <dbus/dbus.h>
23
24 #include <stdio.h>
25 #include <errno.h>
26 #include <string.h>
27 #include <unistd.h>
28 #include <sys/types.h>
29 #include <sys/stat.h>
30 #include <getopt.h>
31 #include <signal.h>
32 #include <sys/wait.h>
33 #include <fcntl.h>
34 #include <sys/prctl.h>
35 #include <sys/mount.h>
36
37 #include "manager.h"
38 #include "log.h"
39 #include "load-fragment.h"
40 #include "fdset.h"
41 #include "special.h"
42 #include "conf-parser.h"
43 #include "bus-errors.h"
44 #include "missing.h"
45 #include "label.h"
46 #include "build.h"
47 #include "strv.h"
48 #include "def.h"
49 #include "virt.h"
50 #include "watchdog.h"
51 #include "path-util.h"
52 #include "switch-root.h"
53
54 #include "mount-setup.h"
55 #include "loopback-setup.h"
56 #include "kmod-setup.h"
57 #include "hostname-setup.h"
58 #include "machine-id-setup.h"
59 #include "locale-setup.h"
60 #include "hwclock.h"
61 #include "selinux-setup.h"
62 #include "ima-setup.h"
63
64 static enum {
65 ACTION_RUN,
66 ACTION_HELP,
67 ACTION_TEST,
68 ACTION_DUMP_CONFIGURATION_ITEMS,
69 ACTION_DONE
70 } arg_action = ACTION_RUN;
71
72 static char *arg_default_unit = NULL;
73 static ManagerRunningAs arg_running_as = _MANAGER_RUNNING_AS_INVALID;
74
75 static bool arg_dump_core = true;
76 static bool arg_crash_shell = false;
77 static int arg_crash_chvt = -1;
78 static bool arg_confirm_spawn = false;
79 static bool arg_show_status = true;
80 #ifdef HAVE_SYSV_COMPAT
81 static bool arg_sysv_console = true;
82 #endif
83 static char **arg_default_controllers = NULL;
84 static char ***arg_join_controllers = NULL;
85 static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
86 static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
87 static usec_t arg_runtime_watchdog = 0;
88 static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
89 static struct rlimit *arg_default_rlimit[RLIMIT_NLIMITS] = {};
90
91 static FILE* serialization = NULL;
92
93 static void nop_handler(int sig) {
94 }
95
96 _noreturn_ static void crash(int sig) {
97
98 if (!arg_dump_core)
99 log_error("Caught <%s>, not dumping core.", signal_to_string(sig));
100 else {
101 struct sigaction sa;
102 pid_t pid;
103
104 /* We want to wait for the core process, hence let's enable SIGCHLD */
105 zero(sa);
106 sa.sa_handler = nop_handler;
107 sa.sa_flags = SA_NOCLDSTOP|SA_RESTART;
108 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
109
110 if ((pid = fork()) < 0)
111 log_error("Caught <%s>, cannot fork for core dump: %s", signal_to_string(sig), strerror(errno));
112
113 else if (pid == 0) {
114 struct rlimit rl;
115
116 /* Enable default signal handler for core dump */
117 zero(sa);
118 sa.sa_handler = SIG_DFL;
119 assert_se(sigaction(sig, &sa, NULL) == 0);
120
121 /* Don't limit the core dump size */
122 zero(rl);
123 rl.rlim_cur = RLIM_INFINITY;
124 rl.rlim_max = RLIM_INFINITY;
125 setrlimit(RLIMIT_CORE, &rl);
126
127 /* Just to be sure... */
128 assert_se(chdir("/") == 0);
129
130 /* Raise the signal again */
131 raise(sig);
132
133 assert_not_reached("We shouldn't be here...");
134 _exit(1);
135
136 } else {
137 siginfo_t status;
138 int r;
139
140 /* Order things nicely. */
141 if ((r = wait_for_terminate(pid, &status)) < 0)
142 log_error("Caught <%s>, waitpid() failed: %s", signal_to_string(sig), strerror(-r));
143 else if (status.si_code != CLD_DUMPED)
144 log_error("Caught <%s>, core dump failed.", signal_to_string(sig));
145 else
146 log_error("Caught <%s>, dumped core as pid %lu.", signal_to_string(sig), (unsigned long) pid);
147 }
148 }
149
150 if (arg_crash_chvt)
151 chvt(arg_crash_chvt);
152
153 if (arg_crash_shell) {
154 struct sigaction sa;
155 pid_t pid;
156
157 log_info("Executing crash shell in 10s...");
158 sleep(10);
159
160 /* Let the kernel reap children for us */
161 zero(sa);
162 sa.sa_handler = SIG_IGN;
163 sa.sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART;
164 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
165
166 if ((pid = fork()) < 0)
167 log_error("Failed to fork off crash shell: %s", strerror(errno));
168 else if (pid == 0) {
169 int fd, r;
170
171 if ((fd = acquire_terminal("/dev/console", false, true, true)) < 0)
172 log_error("Failed to acquire terminal: %s", strerror(-fd));
173 else if ((r = make_stdio(fd)) < 0)
174 log_error("Failed to duplicate terminal fd: %s", strerror(-r));
175
176 execl("/bin/sh", "/bin/sh", NULL);
177
178 log_error("execl() failed: %s", strerror(errno));
179 _exit(1);
180 }
181
182 log_info("Successfully spawned crash shell as pid %lu.", (unsigned long) pid);
183 }
184
185 log_info("Freezing execution.");
186 freeze();
187 }
188
189 static void install_crash_handler(void) {
190 struct sigaction sa;
191
192 zero(sa);
193
194 sa.sa_handler = crash;
195 sa.sa_flags = SA_NODEFER;
196
197 sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
198 }
199
200 static int console_setup(bool do_reset) {
201 int tty_fd, r;
202
203 /* If we are init, we connect stdin/stdout/stderr to /dev/null
204 * and make sure we don't have a controlling tty. */
205
206 release_terminal();
207
208 if (!do_reset)
209 return 0;
210
211 tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
212 if (tty_fd < 0) {
213 log_error("Failed to open /dev/console: %s", strerror(-tty_fd));
214 return -tty_fd;
215 }
216
217 /* We don't want to force text mode.
218 * plymouth may be showing pictures already from initrd. */
219 r = reset_terminal_fd(tty_fd, false);
220 if (r < 0)
221 log_error("Failed to reset /dev/console: %s", strerror(-r));
222
223 close_nointr_nofail(tty_fd);
224 return r;
225 }
226
227 static int set_default_unit(const char *u) {
228 char *c;
229
230 assert(u);
231
232 if (!(c = strdup(u)))
233 return -ENOMEM;
234
235 free(arg_default_unit);
236 arg_default_unit = c;
237 return 0;
238 }
239
240 static int parse_proc_cmdline_word(const char *word) {
241
242 static const char * const rlmap[] = {
243 "emergency", SPECIAL_EMERGENCY_TARGET,
244 "-b", SPECIAL_EMERGENCY_TARGET,
245 "single", SPECIAL_RESCUE_TARGET,
246 "-s", SPECIAL_RESCUE_TARGET,
247 "s", SPECIAL_RESCUE_TARGET,
248 "S", SPECIAL_RESCUE_TARGET,
249 "1", SPECIAL_RESCUE_TARGET,
250 "2", SPECIAL_RUNLEVEL2_TARGET,
251 "3", SPECIAL_RUNLEVEL3_TARGET,
252 "4", SPECIAL_RUNLEVEL4_TARGET,
253 "5", SPECIAL_RUNLEVEL5_TARGET,
254 };
255
256 assert(word);
257
258 if (startswith(word, "systemd.unit="))
259 return set_default_unit(word + 13);
260
261 else if (startswith(word, "systemd.log_target=")) {
262
263 if (log_set_target_from_string(word + 19) < 0)
264 log_warning("Failed to parse log target %s. Ignoring.", word + 19);
265
266 } else if (startswith(word, "systemd.log_level=")) {
267
268 if (log_set_max_level_from_string(word + 18) < 0)
269 log_warning("Failed to parse log level %s. Ignoring.", word + 18);
270
271 } else if (startswith(word, "systemd.log_color=")) {
272
273 if (log_show_color_from_string(word + 18) < 0)
274 log_warning("Failed to parse log color setting %s. Ignoring.", word + 18);
275
276 } else if (startswith(word, "systemd.log_location=")) {
277
278 if (log_show_location_from_string(word + 21) < 0)
279 log_warning("Failed to parse log location setting %s. Ignoring.", word + 21);
280
281 } else if (startswith(word, "systemd.dump_core=")) {
282 int r;
283
284 if ((r = parse_boolean(word + 18)) < 0)
285 log_warning("Failed to parse dump core switch %s. Ignoring.", word + 18);
286 else
287 arg_dump_core = r;
288
289 } else if (startswith(word, "systemd.crash_shell=")) {
290 int r;
291
292 if ((r = parse_boolean(word + 20)) < 0)
293 log_warning("Failed to parse crash shell switch %s. Ignoring.", word + 20);
294 else
295 arg_crash_shell = r;
296
297 } else if (startswith(word, "systemd.confirm_spawn=")) {
298 int r;
299
300 if ((r = parse_boolean(word + 22)) < 0)
301 log_warning("Failed to parse confirm spawn switch %s. Ignoring.", word + 22);
302 else
303 arg_confirm_spawn = r;
304
305 } else if (startswith(word, "systemd.crash_chvt=")) {
306 int k;
307
308 if (safe_atoi(word + 19, &k) < 0)
309 log_warning("Failed to parse crash chvt switch %s. Ignoring.", word + 19);
310 else
311 arg_crash_chvt = k;
312
313 } else if (startswith(word, "systemd.show_status=")) {
314 int r;
315
316 if ((r = parse_boolean(word + 20)) < 0)
317 log_warning("Failed to parse show status switch %s. Ignoring.", word + 20);
318 else
319 arg_show_status = r;
320 } else if (startswith(word, "systemd.default_standard_output=")) {
321 int r;
322
323 if ((r = exec_output_from_string(word + 32)) < 0)
324 log_warning("Failed to parse default standard output switch %s. Ignoring.", word + 32);
325 else
326 arg_default_std_output = r;
327 } else if (startswith(word, "systemd.default_standard_error=")) {
328 int r;
329
330 if ((r = exec_output_from_string(word + 31)) < 0)
331 log_warning("Failed to parse default standard error switch %s. Ignoring.", word + 31);
332 else
333 arg_default_std_error = r;
334 } else if (startswith(word, "systemd.setenv=")) {
335 char *cenv, *eq;
336 int r;
337
338 cenv = strdup(word + 15);
339 if (!cenv)
340 return -ENOMEM;
341
342 eq = strchr(cenv, '=');
343 if (!eq) {
344 r = unsetenv(cenv);
345 if (r < 0)
346 log_warning("unsetenv failed %s. Ignoring.", strerror(errno));
347 } else {
348 *eq = 0;
349 r = setenv(cenv, eq + 1, 1);
350 if (r < 0)
351 log_warning("setenv failed %s. Ignoring.", strerror(errno));
352 }
353 free(cenv);
354 #ifdef HAVE_SYSV_COMPAT
355 } else if (startswith(word, "systemd.sysv_console=")) {
356 int r;
357
358 if ((r = parse_boolean(word + 21)) < 0)
359 log_warning("Failed to parse SysV console switch %s. Ignoring.", word + 20);
360 else
361 arg_sysv_console = r;
362 #endif
363
364 } else if (startswith(word, "systemd.")) {
365
366 log_warning("Unknown kernel switch %s. Ignoring.", word);
367
368 log_info("Supported kernel switches:\n"
369 "systemd.unit=UNIT Default unit to start\n"
370 "systemd.dump_core=0|1 Dump core on crash\n"
371 "systemd.crash_shell=0|1 Run shell on crash\n"
372 "systemd.crash_chvt=N Change to VT #N on crash\n"
373 "systemd.confirm_spawn=0|1 Confirm every process spawn\n"
374 "systemd.show_status=0|1 Show status updates on the console during bootup\n"
375 #ifdef HAVE_SYSV_COMPAT
376 "systemd.sysv_console=0|1 Connect output of SysV scripts to console\n"
377 #endif
378 "systemd.log_target=console|kmsg|journal|journal-or-kmsg|syslog|syslog-or-kmsg|null\n"
379 " Log target\n"
380 "systemd.log_level=LEVEL Log level\n"
381 "systemd.log_color=0|1 Highlight important log messages\n"
382 "systemd.log_location=0|1 Include code location in log messages\n"
383 "systemd.default_standard_output=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
384 " Set default log output for services\n"
385 "systemd.default_standard_error=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
386 " Set default log error output for services\n");
387
388 } else if (streq(word, "quiet")) {
389 arg_show_status = false;
390 #ifdef HAVE_SYSV_COMPAT
391 arg_sysv_console = false;
392 #endif
393 } else {
394 unsigned i;
395
396 /* SysV compatibility */
397 for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
398 if (streq(word, rlmap[i]))
399 return set_default_unit(rlmap[i+1]);
400 }
401
402 return 0;
403 }
404
405 static int config_parse_level2(
406 const char *filename,
407 unsigned line,
408 const char *section,
409 const char *lvalue,
410 int ltype,
411 const char *rvalue,
412 void *data,
413 void *userdata) {
414
415 assert(filename);
416 assert(lvalue);
417 assert(rvalue);
418
419 log_set_max_level_from_string(rvalue);
420 return 0;
421 }
422
423 static int config_parse_target(
424 const char *filename,
425 unsigned line,
426 const char *section,
427 const char *lvalue,
428 int ltype,
429 const char *rvalue,
430 void *data,
431 void *userdata) {
432
433 assert(filename);
434 assert(lvalue);
435 assert(rvalue);
436
437 log_set_target_from_string(rvalue);
438 return 0;
439 }
440
441 static int config_parse_color(
442 const char *filename,
443 unsigned line,
444 const char *section,
445 const char *lvalue,
446 int ltype,
447 const char *rvalue,
448 void *data,
449 void *userdata) {
450
451 assert(filename);
452 assert(lvalue);
453 assert(rvalue);
454
455 log_show_color_from_string(rvalue);
456 return 0;
457 }
458
459 static int config_parse_location(
460 const char *filename,
461 unsigned line,
462 const char *section,
463 const char *lvalue,
464 int ltype,
465 const char *rvalue,
466 void *data,
467 void *userdata) {
468
469 assert(filename);
470 assert(lvalue);
471 assert(rvalue);
472
473 log_show_location_from_string(rvalue);
474 return 0;
475 }
476
477 static int config_parse_cpu_affinity2(
478 const char *filename,
479 unsigned line,
480 const char *section,
481 const char *lvalue,
482 int ltype,
483 const char *rvalue,
484 void *data,
485 void *userdata) {
486
487 char *w;
488 size_t l;
489 char *state;
490 cpu_set_t *c = NULL;
491 unsigned ncpus = 0;
492
493 assert(filename);
494 assert(lvalue);
495 assert(rvalue);
496
497 FOREACH_WORD_QUOTED(w, l, rvalue, state) {
498 char *t;
499 int r;
500 unsigned cpu;
501
502 if (!(t = strndup(w, l)))
503 return -ENOMEM;
504
505 r = safe_atou(t, &cpu);
506 free(t);
507
508 if (!c)
509 if (!(c = cpu_set_malloc(&ncpus)))
510 return -ENOMEM;
511
512 if (r < 0 || cpu >= ncpus) {
513 log_error("[%s:%u] Failed to parse CPU affinity: %s", filename, line, rvalue);
514 CPU_FREE(c);
515 return -EBADMSG;
516 }
517
518 CPU_SET_S(cpu, CPU_ALLOC_SIZE(ncpus), c);
519 }
520
521 if (c) {
522 if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
523 log_warning("Failed to set CPU affinity: %m");
524
525 CPU_FREE(c);
526 }
527
528 return 0;
529 }
530
531 static void strv_free_free(char ***l) {
532 char ***i;
533
534 if (!l)
535 return;
536
537 for (i = l; *i; i++)
538 strv_free(*i);
539
540 free(l);
541 }
542
543 static void free_join_controllers(void) {
544 if (!arg_join_controllers)
545 return;
546
547 strv_free_free(arg_join_controllers);
548 arg_join_controllers = NULL;
549 }
550
551 static int config_parse_join_controllers(
552 const char *filename,
553 unsigned line,
554 const char *section,
555 const char *lvalue,
556 int ltype,
557 const char *rvalue,
558 void *data,
559 void *userdata) {
560
561 unsigned n = 0;
562 char *state, *w;
563 size_t length;
564
565 assert(filename);
566 assert(lvalue);
567 assert(rvalue);
568
569 free_join_controllers();
570
571 FOREACH_WORD_QUOTED(w, length, rvalue, state) {
572 char *s, **l;
573
574 s = strndup(w, length);
575 if (!s)
576 return -ENOMEM;
577
578 l = strv_split(s, ",");
579 free(s);
580
581 strv_uniq(l);
582
583 if (strv_length(l) <= 1) {
584 strv_free(l);
585 continue;
586 }
587
588 if (!arg_join_controllers) {
589 arg_join_controllers = new(char**, 2);
590 if (!arg_join_controllers) {
591 strv_free(l);
592 return -ENOMEM;
593 }
594
595 arg_join_controllers[0] = l;
596 arg_join_controllers[1] = NULL;
597
598 n = 1;
599 } else {
600 char ***a;
601 char ***t;
602
603 t = new0(char**, n+2);
604 if (!t) {
605 strv_free(l);
606 return -ENOMEM;
607 }
608
609 n = 0;
610
611 for (a = arg_join_controllers; *a; a++) {
612
613 if (strv_overlap(*a, l)) {
614 char **c;
615
616 c = strv_merge(*a, l);
617 if (!c) {
618 strv_free(l);
619 strv_free_free(t);
620 return -ENOMEM;
621 }
622
623 strv_free(l);
624 l = c;
625 } else {
626 char **c;
627
628 c = strv_copy(*a);
629 if (!c) {
630 strv_free(l);
631 strv_free_free(t);
632 return -ENOMEM;
633 }
634
635 t[n++] = c;
636 }
637 }
638
639 t[n++] = strv_uniq(l);
640
641 strv_free_free(arg_join_controllers);
642 arg_join_controllers = t;
643 }
644 }
645
646 return 0;
647 }
648
649 static int parse_config_file(void) {
650
651 const ConfigTableItem items[] = {
652 { "Manager", "LogLevel", config_parse_level2, 0, NULL },
653 { "Manager", "LogTarget", config_parse_target, 0, NULL },
654 { "Manager", "LogColor", config_parse_color, 0, NULL },
655 { "Manager", "LogLocation", config_parse_location, 0, NULL },
656 { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
657 { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
658 { "Manager", "ShowStatus", config_parse_bool, 0, &arg_show_status },
659 #ifdef HAVE_SYSV_COMPAT
660 { "Manager", "SysVConsole", config_parse_bool, 0, &arg_sysv_console },
661 #endif
662 { "Manager", "CrashChVT", config_parse_int, 0, &arg_crash_chvt },
663 { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
664 { "Manager", "DefaultControllers", config_parse_strv, 0, &arg_default_controllers },
665 { "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
666 { "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
667 { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
668 { "Manager", "RuntimeWatchdogSec", config_parse_usec, 0, &arg_runtime_watchdog },
669 { "Manager", "ShutdownWatchdogSec", config_parse_usec, 0, &arg_shutdown_watchdog },
670 { "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU]},
671 { "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE]},
672 { "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA]},
673 { "Manager", "DefaultLimitSTACK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_STACK]},
674 { "Manager", "DefaultLimitCORE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CORE]},
675 { "Manager", "DefaultLimitRSS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RSS]},
676 { "Manager", "DefaultLimitNOFILE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NOFILE]},
677 { "Manager", "DefaultLimitAS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_AS]},
678 { "Manager", "DefaultLimitNPROC", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NPROC]},
679 { "Manager", "DefaultLimitMEMLOCK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MEMLOCK]},
680 { "Manager", "DefaultLimitLOCKS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_LOCKS]},
681 { "Manager", "DefaultLimitSIGPENDING",config_parse_limit, 0, &arg_default_rlimit[RLIMIT_SIGPENDING]},
682 { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MSGQUEUE]},
683 { "Manager", "DefaultLimitNICE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NICE]},
684 { "Manager", "DefaultLimitRTPRIO", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTPRIO]},
685 { "Manager", "DefaultLimitRTTIME", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTTIME]},
686 { NULL, NULL, NULL, 0, NULL }
687 };
688
689 FILE *f;
690 const char *fn;
691 int r;
692
693 fn = arg_running_as == MANAGER_SYSTEM ? SYSTEM_CONFIG_FILE : USER_CONFIG_FILE;
694 f = fopen(fn, "re");
695 if (!f) {
696 if (errno == ENOENT)
697 return 0;
698
699 log_warning("Failed to open configuration file '%s': %m", fn);
700 return 0;
701 }
702
703 r = config_parse(fn, f, "Manager\0", config_item_table_lookup, (void*) items, false, NULL);
704 if (r < 0)
705 log_warning("Failed to parse configuration file: %s", strerror(-r));
706
707 fclose(f);
708
709 return 0;
710 }
711
712 static int parse_proc_cmdline(void) {
713 char *line, *w, *state;
714 int r;
715 size_t l;
716
717 /* Don't read /proc/cmdline if we are in a container, since
718 * that is only relevant for the host system */
719 if (detect_container(NULL) > 0)
720 return 0;
721
722 if ((r = read_one_line_file("/proc/cmdline", &line)) < 0) {
723 log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
724 return 0;
725 }
726
727 FOREACH_WORD_QUOTED(w, l, line, state) {
728 char *word;
729
730 if (!(word = strndup(w, l))) {
731 r = -ENOMEM;
732 goto finish;
733 }
734
735 r = parse_proc_cmdline_word(word);
736 free(word);
737
738 if (r < 0)
739 goto finish;
740 }
741
742 r = 0;
743
744 finish:
745 free(line);
746 return r;
747 }
748
749 static int parse_argv(int argc, char *argv[]) {
750
751 enum {
752 ARG_LOG_LEVEL = 0x100,
753 ARG_LOG_TARGET,
754 ARG_LOG_COLOR,
755 ARG_LOG_LOCATION,
756 ARG_UNIT,
757 ARG_SYSTEM,
758 ARG_USER,
759 ARG_TEST,
760 ARG_DUMP_CONFIGURATION_ITEMS,
761 ARG_DUMP_CORE,
762 ARG_CRASH_SHELL,
763 ARG_CONFIRM_SPAWN,
764 ARG_SHOW_STATUS,
765 ARG_SYSV_CONSOLE,
766 ARG_DESERIALIZE,
767 ARG_SWITCHED_ROOT,
768 ARG_INTROSPECT,
769 ARG_DEFAULT_STD_OUTPUT,
770 ARG_DEFAULT_STD_ERROR
771 };
772
773 static const struct option options[] = {
774 { "log-level", required_argument, NULL, ARG_LOG_LEVEL },
775 { "log-target", required_argument, NULL, ARG_LOG_TARGET },
776 { "log-color", optional_argument, NULL, ARG_LOG_COLOR },
777 { "log-location", optional_argument, NULL, ARG_LOG_LOCATION },
778 { "unit", required_argument, NULL, ARG_UNIT },
779 { "system", no_argument, NULL, ARG_SYSTEM },
780 { "user", no_argument, NULL, ARG_USER },
781 { "test", no_argument, NULL, ARG_TEST },
782 { "help", no_argument, NULL, 'h' },
783 { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS },
784 { "dump-core", optional_argument, NULL, ARG_DUMP_CORE },
785 { "crash-shell", optional_argument, NULL, ARG_CRASH_SHELL },
786 { "confirm-spawn", optional_argument, NULL, ARG_CONFIRM_SPAWN },
787 { "show-status", optional_argument, NULL, ARG_SHOW_STATUS },
788 #ifdef HAVE_SYSV_COMPAT
789 { "sysv-console", optional_argument, NULL, ARG_SYSV_CONSOLE },
790 #endif
791 { "deserialize", required_argument, NULL, ARG_DESERIALIZE },
792 { "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
793 { "introspect", optional_argument, NULL, ARG_INTROSPECT },
794 { "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
795 { "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
796 { NULL, 0, NULL, 0 }
797 };
798
799 int c, r;
800
801 assert(argc >= 1);
802 assert(argv);
803
804 if (getpid() == 1)
805 opterr = 0;
806
807 while ((c = getopt_long(argc, argv, "hDbsz:", options, NULL)) >= 0)
808
809 switch (c) {
810
811 case ARG_LOG_LEVEL:
812 if ((r = log_set_max_level_from_string(optarg)) < 0) {
813 log_error("Failed to parse log level %s.", optarg);
814 return r;
815 }
816
817 break;
818
819 case ARG_LOG_TARGET:
820
821 if ((r = log_set_target_from_string(optarg)) < 0) {
822 log_error("Failed to parse log target %s.", optarg);
823 return r;
824 }
825
826 break;
827
828 case ARG_LOG_COLOR:
829
830 if (optarg) {
831 if ((r = log_show_color_from_string(optarg)) < 0) {
832 log_error("Failed to parse log color setting %s.", optarg);
833 return r;
834 }
835 } else
836 log_show_color(true);
837
838 break;
839
840 case ARG_LOG_LOCATION:
841
842 if (optarg) {
843 if ((r = log_show_location_from_string(optarg)) < 0) {
844 log_error("Failed to parse log location setting %s.", optarg);
845 return r;
846 }
847 } else
848 log_show_location(true);
849
850 break;
851
852 case ARG_DEFAULT_STD_OUTPUT:
853
854 if ((r = exec_output_from_string(optarg)) < 0) {
855 log_error("Failed to parse default standard output setting %s.", optarg);
856 return r;
857 } else
858 arg_default_std_output = r;
859 break;
860
861 case ARG_DEFAULT_STD_ERROR:
862
863 if ((r = exec_output_from_string(optarg)) < 0) {
864 log_error("Failed to parse default standard error output setting %s.", optarg);
865 return r;
866 } else
867 arg_default_std_error = r;
868 break;
869
870 case ARG_UNIT:
871
872 if ((r = set_default_unit(optarg)) < 0) {
873 log_error("Failed to set default unit %s: %s", optarg, strerror(-r));
874 return r;
875 }
876
877 break;
878
879 case ARG_SYSTEM:
880 arg_running_as = MANAGER_SYSTEM;
881 break;
882
883 case ARG_USER:
884 arg_running_as = MANAGER_USER;
885 break;
886
887 case ARG_TEST:
888 arg_action = ACTION_TEST;
889 break;
890
891 case ARG_DUMP_CONFIGURATION_ITEMS:
892 arg_action = ACTION_DUMP_CONFIGURATION_ITEMS;
893 break;
894
895 case ARG_DUMP_CORE:
896 r = optarg ? parse_boolean(optarg) : 1;
897 if (r < 0) {
898 log_error("Failed to parse dump core boolean %s.", optarg);
899 return r;
900 }
901 arg_dump_core = r;
902 break;
903
904 case ARG_CRASH_SHELL:
905 r = optarg ? parse_boolean(optarg) : 1;
906 if (r < 0) {
907 log_error("Failed to parse crash shell boolean %s.", optarg);
908 return r;
909 }
910 arg_crash_shell = r;
911 break;
912
913 case ARG_CONFIRM_SPAWN:
914 r = optarg ? parse_boolean(optarg) : 1;
915 if (r < 0) {
916 log_error("Failed to parse confirm spawn boolean %s.", optarg);
917 return r;
918 }
919 arg_confirm_spawn = r;
920 break;
921
922 case ARG_SHOW_STATUS:
923 r = optarg ? parse_boolean(optarg) : 1;
924 if (r < 0) {
925 log_error("Failed to parse show status boolean %s.", optarg);
926 return r;
927 }
928 arg_show_status = r;
929 break;
930
931 #ifdef HAVE_SYSV_COMPAT
932 case ARG_SYSV_CONSOLE:
933 r = optarg ? parse_boolean(optarg) : 1;
934 if (r < 0) {
935 log_error("Failed to parse SysV console boolean %s.", optarg);
936 return r;
937 }
938 arg_sysv_console = r;
939 break;
940 #endif
941
942 case ARG_DESERIALIZE: {
943 int fd;
944 FILE *f;
945
946 if ((r = safe_atoi(optarg, &fd)) < 0 || fd < 0) {
947 log_error("Failed to parse deserialize option %s.", optarg);
948 return r;
949 }
950
951 if (!(f = fdopen(fd, "r"))) {
952 log_error("Failed to open serialization fd: %m");
953 return r;
954 }
955
956 if (serialization)
957 fclose(serialization);
958
959 serialization = f;
960
961 break;
962 }
963
964 case ARG_SWITCHED_ROOT:
965 /* Nothing special yet */
966 break;
967
968 case ARG_INTROSPECT: {
969 const char * const * i = NULL;
970
971 for (i = bus_interface_table; *i; i += 2)
972 if (!optarg || streq(i[0], optarg)) {
973 fputs(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE
974 "<node>\n", stdout);
975 fputs(i[1], stdout);
976 fputs("</node>\n", stdout);
977
978 if (optarg)
979 break;
980 }
981
982 if (!i[0] && optarg)
983 log_error("Unknown interface %s.", optarg);
984
985 arg_action = ACTION_DONE;
986 break;
987 }
988
989 case 'h':
990 arg_action = ACTION_HELP;
991 break;
992
993 case 'D':
994 log_set_max_level(LOG_DEBUG);
995 break;
996
997 case 'b':
998 case 's':
999 case 'z':
1000 /* Just to eat away the sysvinit kernel
1001 * cmdline args without getopt() error
1002 * messages that we'll parse in
1003 * parse_proc_cmdline_word() or ignore. */
1004
1005 case '?':
1006 default:
1007 if (getpid() != 1) {
1008 log_error("Unknown option code %c", c);
1009 return -EINVAL;
1010 }
1011
1012 break;
1013 }
1014
1015 if (optind < argc && getpid() != 1) {
1016 /* Hmm, when we aren't run as init system
1017 * let's complain about excess arguments */
1018
1019 log_error("Excess arguments.");
1020 return -EINVAL;
1021 }
1022
1023 if (detect_container(NULL) > 0) {
1024 char **a;
1025
1026 /* All /proc/cmdline arguments the kernel didn't
1027 * understand it passed to us. We're not really
1028 * interested in that usually since /proc/cmdline is
1029 * more interesting and complete. With one exception:
1030 * if we are run in a container /proc/cmdline is not
1031 * relevant for the container, hence we rely on argv[]
1032 * instead. */
1033
1034 for (a = argv; a < argv + argc; a++)
1035 if ((r = parse_proc_cmdline_word(*a)) < 0)
1036 return r;
1037 }
1038
1039 return 0;
1040 }
1041
1042 static int help(void) {
1043
1044 printf("%s [OPTIONS...]\n\n"
1045 "Starts up and maintains the system or user services.\n\n"
1046 " -h --help Show this help\n"
1047 " --test Determine startup sequence, dump it and exit\n"
1048 " --dump-configuration-items Dump understood unit configuration items\n"
1049 " --introspect[=INTERFACE] Extract D-Bus interface data\n"
1050 " --unit=UNIT Set default unit\n"
1051 " --system Run a system instance, even if PID != 1\n"
1052 " --user Run a user instance\n"
1053 " --dump-core[=0|1] Dump core on crash\n"
1054 " --crash-shell[=0|1] Run shell on crash\n"
1055 " --confirm-spawn[=0|1] Ask for confirmation when spawning processes\n"
1056 " --show-status[=0|1] Show status updates on the console during bootup\n"
1057 #ifdef HAVE_SYSV_COMPAT
1058 " --sysv-console[=0|1] Connect output of SysV scripts to console\n"
1059 #endif
1060 " --log-target=TARGET Set log target (console, journal, syslog, kmsg, journal-or-kmsg, syslog-or-kmsg, null)\n"
1061 " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
1062 " --log-color[=0|1] Highlight important log messages\n"
1063 " --log-location[=0|1] Include code location in log messages\n"
1064 " --default-standard-output= Set default standard output for services\n"
1065 " --default-standard-error= Set default standard error output for services\n",
1066 program_invocation_short_name);
1067
1068 return 0;
1069 }
1070
1071 static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds) {
1072 FILE *f = NULL;
1073 FDSet *fds = NULL;
1074 int r;
1075
1076 assert(m);
1077 assert(_f);
1078 assert(_fds);
1079
1080 /* Make sure nothing is really destructed when we shut down */
1081 m->n_reloading ++;
1082
1083 if ((r = manager_open_serialization(m, &f)) < 0) {
1084 log_error("Failed to create serialization file: %s", strerror(-r));
1085 goto fail;
1086 }
1087
1088 if (!(fds = fdset_new())) {
1089 r = -ENOMEM;
1090 log_error("Failed to allocate fd set: %s", strerror(-r));
1091 goto fail;
1092 }
1093
1094 if ((r = manager_serialize(m, f, fds)) < 0) {
1095 log_error("Failed to serialize state: %s", strerror(-r));
1096 goto fail;
1097 }
1098
1099 if (fseeko(f, 0, SEEK_SET) < 0) {
1100 log_error("Failed to rewind serialization fd: %m");
1101 goto fail;
1102 }
1103
1104 if ((r = fd_cloexec(fileno(f), false)) < 0) {
1105 log_error("Failed to disable O_CLOEXEC for serialization: %s", strerror(-r));
1106 goto fail;
1107 }
1108
1109 if ((r = fdset_cloexec(fds, false)) < 0) {
1110 log_error("Failed to disable O_CLOEXEC for serialization fds: %s", strerror(-r));
1111 goto fail;
1112 }
1113
1114 *_f = f;
1115 *_fds = fds;
1116
1117 return 0;
1118
1119 fail:
1120 fdset_free(fds);
1121
1122 if (f)
1123 fclose(f);
1124
1125 return r;
1126 }
1127
1128 static struct dual_timestamp* parse_initrd_timestamp(struct dual_timestamp *t) {
1129 const char *e;
1130 unsigned long long a, b;
1131
1132 assert(t);
1133
1134 e = getenv("RD_TIMESTAMP");
1135 if (!e)
1136 return NULL;
1137
1138 if (sscanf(e, "%llu %llu", &a, &b) != 2)
1139 return NULL;
1140
1141 t->realtime = (usec_t) a;
1142 t->monotonic = (usec_t) b;
1143
1144 return t;
1145 }
1146
1147 static void test_mtab(void) {
1148 char *p;
1149
1150 /* Check that /etc/mtab is a symlink */
1151
1152 if (readlink_malloc("/etc/mtab", &p) >= 0) {
1153 bool b;
1154
1155 b = streq(p, "/proc/self/mounts") || streq(p, "/proc/mounts");
1156 free(p);
1157
1158 if (b)
1159 return;
1160 }
1161
1162 log_warning("/etc/mtab is not a symlink or not pointing to /proc/self/mounts. "
1163 "This is not supported anymore. "
1164 "Please make sure to replace this file by a symlink to avoid incorrect or misleading mount(8) output.");
1165 }
1166
1167 static void test_usr(void) {
1168
1169 /* Check that /usr is not a separate fs */
1170
1171 if (dir_is_empty("/usr") <= 0)
1172 return;
1173
1174 log_warning("/usr appears to be on its own filesytem and is not already mounted. This is not a supported setup. "
1175 "Some things will probably break (sometimes even silently) in mysterious ways. "
1176 "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
1177 }
1178
1179 static void test_cgroups(void) {
1180
1181 if (access("/proc/cgroups", F_OK) >= 0)
1182 return;
1183
1184 log_warning("CONFIG_CGROUPS was not set when your kernel was compiled. "
1185 "Systems without control groups are not supported. "
1186 "We will now sleep for 10s, and then continue boot-up. "
1187 "Expect breakage and please do not file bugs. "
1188 "Instead fix your kernel and enable CONFIG_CGROUPS. "
1189 "Consult http://0pointer.de/blog/projects/cgroups-vs-cgroups.html for more information.");
1190
1191 sleep(10);
1192 }
1193
1194 int main(int argc, char *argv[]) {
1195 Manager *m = NULL;
1196 int r, retval = EXIT_FAILURE;
1197 usec_t before_startup, after_startup;
1198 char timespan[FORMAT_TIMESPAN_MAX];
1199 FDSet *fds = NULL;
1200 bool reexecute = false;
1201 const char *shutdown_verb = NULL;
1202 dual_timestamp initrd_timestamp = { 0ULL, 0ULL };
1203 static char systemd[] = "systemd";
1204 bool skip_setup = false;
1205 int j;
1206 bool loaded_policy = false;
1207 bool arm_reboot_watchdog = false;
1208 char *switch_root_dir = NULL, *switch_root_init = NULL;
1209
1210 #ifdef HAVE_SYSV_COMPAT
1211 if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
1212 /* This is compatibility support for SysV, where
1213 * calling init as a user is identical to telinit. */
1214
1215 errno = -ENOENT;
1216 execv(SYSTEMCTL_BINARY_PATH, argv);
1217 log_error("Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
1218 return 1;
1219 }
1220 #endif
1221
1222 /* Determine if this is a reexecution or normal bootup. We do
1223 * the full command line parsing much later, so let's just
1224 * have a quick peek here. */
1225 for (j = 1; j < argc; j++)
1226 if (streq(argv[j], "--deserialize")) {
1227 skip_setup = true;
1228 break;
1229 }
1230
1231 /* If we have switched root, do all the special setup
1232 * things */
1233 for (j = 1; j < argc; j++)
1234 if (streq(argv[j], "--switched-root")) {
1235 skip_setup = false;
1236 break;
1237 }
1238
1239 /* If we get started via the /sbin/init symlink then we are
1240 called 'init'. After a subsequent reexecution we are then
1241 called 'systemd'. That is confusing, hence let's call us
1242 systemd right-away. */
1243 program_invocation_short_name = systemd;
1244 prctl(PR_SET_NAME, systemd);
1245
1246 saved_argv = argv;
1247 saved_argc = argc;
1248
1249 log_show_color(isatty(STDERR_FILENO) > 0);
1250 log_show_location(false);
1251 log_set_max_level(LOG_INFO);
1252
1253 if (getpid() == 1) {
1254 if (in_initrd()) {
1255 char *rd_timestamp = NULL;
1256
1257 dual_timestamp_get(&initrd_timestamp);
1258 asprintf(&rd_timestamp, "%llu %llu",
1259 (unsigned long long) initrd_timestamp.realtime,
1260 (unsigned long long) initrd_timestamp.monotonic);
1261 if (rd_timestamp) {
1262 setenv("RD_TIMESTAMP", rd_timestamp, 1);
1263 free(rd_timestamp);
1264 }
1265 }
1266
1267 arg_running_as = MANAGER_SYSTEM;
1268 log_set_target(detect_container(NULL) > 0 ? LOG_TARGET_JOURNAL : LOG_TARGET_JOURNAL_OR_KMSG);
1269
1270 if (!skip_setup) {
1271 if (selinux_setup(&loaded_policy) < 0)
1272 goto finish;
1273 if (ima_setup() < 0)
1274 goto finish;
1275 }
1276
1277 log_open();
1278
1279 if (label_init(NULL) < 0)
1280 goto finish;
1281
1282 if (!skip_setup)
1283 if (hwclock_is_localtime() > 0) {
1284 int min;
1285
1286 r = hwclock_apply_localtime_delta(&min);
1287 if (r < 0)
1288 log_error("Failed to apply local time delta, ignoring: %s", strerror(-r));
1289 else
1290 log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
1291 }
1292
1293 } else {
1294 arg_running_as = MANAGER_USER;
1295 log_set_target(LOG_TARGET_AUTO);
1296 log_open();
1297 }
1298
1299 /* Initialize default unit */
1300 if (set_default_unit(SPECIAL_DEFAULT_TARGET) < 0)
1301 goto finish;
1302
1303 /* By default, mount "cpu" and "cpuacct" together */
1304 arg_join_controllers = new(char**, 2);
1305 if (!arg_join_controllers)
1306 goto finish;
1307
1308 arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL);
1309 arg_join_controllers[1] = NULL;
1310
1311 if (!arg_join_controllers[0])
1312 goto finish;
1313
1314 /* Mount /proc, /sys and friends, so that /proc/cmdline and
1315 * /proc/$PID/fd is available. */
1316 if (geteuid() == 0 && !getenv("SYSTEMD_SKIP_API_MOUNTS")) {
1317 r = mount_setup(loaded_policy);
1318 if (r < 0)
1319 goto finish;
1320 }
1321
1322 /* Reset all signal handlers. */
1323 assert_se(reset_all_signal_handlers() == 0);
1324
1325 /* If we are init, we can block sigkill. Yay. */
1326 ignore_signals(SIGNALS_IGNORE, -1);
1327
1328 if (parse_config_file() < 0)
1329 goto finish;
1330
1331 if (arg_running_as == MANAGER_SYSTEM)
1332 if (parse_proc_cmdline() < 0)
1333 goto finish;
1334
1335 log_parse_environment();
1336
1337 if (parse_argv(argc, argv) < 0)
1338 goto finish;
1339
1340 if (arg_action == ACTION_TEST && geteuid() == 0) {
1341 log_error("Don't run test mode as root.");
1342 goto finish;
1343 }
1344
1345 if (arg_running_as == MANAGER_SYSTEM &&
1346 arg_action == ACTION_RUN &&
1347 running_in_chroot() > 0) {
1348 log_error("Cannot be run in a chroot() environment.");
1349 goto finish;
1350 }
1351
1352 if (arg_action == ACTION_HELP) {
1353 retval = help();
1354 goto finish;
1355 } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) {
1356 unit_dump_config_items(stdout);
1357 retval = EXIT_SUCCESS;
1358 goto finish;
1359 } else if (arg_action == ACTION_DONE) {
1360 retval = EXIT_SUCCESS;
1361 goto finish;
1362 }
1363
1364 assert_se(arg_action == ACTION_RUN || arg_action == ACTION_TEST);
1365
1366 /* Close logging fds, in order not to confuse fdset below */
1367 log_close();
1368
1369 /* Remember open file descriptors for later deserialization */
1370 if (serialization) {
1371 r = fdset_new_fill(&fds);
1372 if (r < 0) {
1373 log_error("Failed to allocate fd set: %s", strerror(-r));
1374 goto finish;
1375 }
1376
1377 assert_se(fdset_remove(fds, fileno(serialization)) >= 0);
1378 } else
1379 close_all_fds(NULL, 0);
1380
1381 /* Set up PATH unless it is already set */
1382 setenv("PATH",
1383 #ifdef HAVE_SPLIT_USR
1384 "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
1385 #else
1386 "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin",
1387 #endif
1388 arg_running_as == MANAGER_SYSTEM);
1389
1390 if (arg_running_as == MANAGER_SYSTEM) {
1391 /* Parse the data passed to us. We leave this
1392 * variables set, but the manager later on will not
1393 * pass them on to our children. */
1394 if (!in_initrd())
1395 parse_initrd_timestamp(&initrd_timestamp);
1396
1397 /* Unset some environment variables passed in from the
1398 * kernel that don't really make sense for us. */
1399 unsetenv("HOME");
1400 unsetenv("TERM");
1401
1402 /* When we are invoked by a shell, these might be set,
1403 * but make little sense to pass on */
1404 unsetenv("PWD");
1405 unsetenv("SHLVL");
1406 unsetenv("_");
1407
1408 /* When we are invoked by a chroot-like tool such as
1409 * nspawn, these might be set, but make little sense
1410 * to pass on */
1411 unsetenv("USER");
1412 unsetenv("LOGNAME");
1413
1414 /* All other variables are left as is, so that clients
1415 * can still read them via /proc/1/environ */
1416 }
1417
1418 /* Move out of the way, so that we won't block unmounts */
1419 assert_se(chdir("/") == 0);
1420
1421 if (arg_running_as == MANAGER_SYSTEM) {
1422 /* Become a session leader if we aren't one yet. */
1423 setsid();
1424
1425 /* Disable the umask logic */
1426 umask(0);
1427 }
1428
1429 /* Make sure D-Bus doesn't fiddle with the SIGPIPE handlers */
1430 dbus_connection_set_change_sigpipe(FALSE);
1431
1432 /* Reset the console, but only if this is really init and we
1433 * are freshly booted */
1434 if (arg_running_as == MANAGER_SYSTEM && arg_action == ACTION_RUN) {
1435 console_setup(getpid() == 1 && !skip_setup);
1436 make_null_stdio();
1437 }
1438
1439 /* Open the logging devices, if possible and necessary */
1440 log_open();
1441
1442 /* Make sure we leave a core dump without panicing the
1443 * kernel. */
1444 if (getpid() == 1)
1445 install_crash_handler();
1446
1447 if (geteuid() == 0 && !getenv("SYSTEMD_SKIP_API_MOUNTS")) {
1448 r = mount_cgroup_controllers(arg_join_controllers);
1449 if (r < 0)
1450 goto finish;
1451 }
1452
1453 log_full(arg_running_as == MANAGER_SYSTEM ? LOG_INFO : LOG_DEBUG,
1454 PACKAGE_STRING " running in %s mode. (" SYSTEMD_FEATURES "; " DISTRIBUTION ")", manager_running_as_to_string(arg_running_as));
1455
1456 if (arg_running_as == MANAGER_SYSTEM && !skip_setup) {
1457 locale_setup();
1458
1459 if (arg_show_status || plymouth_running())
1460 status_welcome();
1461
1462 kmod_setup();
1463 hostname_setup();
1464 machine_id_setup();
1465 loopback_setup();
1466
1467 test_mtab();
1468 test_usr();
1469 test_cgroups();
1470 }
1471
1472 if (arg_running_as == MANAGER_SYSTEM && arg_runtime_watchdog > 0)
1473 watchdog_set_timeout(&arg_runtime_watchdog);
1474
1475 r = manager_new(arg_running_as, &m);
1476 if (r < 0) {
1477 log_error("Failed to allocate manager object: %s", strerror(-r));
1478 goto finish;
1479 }
1480
1481 m->confirm_spawn = arg_confirm_spawn;
1482 #ifdef HAVE_SYSV_COMPAT
1483 m->sysv_console = arg_sysv_console;
1484 #endif
1485 m->default_std_output = arg_default_std_output;
1486 m->default_std_error = arg_default_std_error;
1487 m->runtime_watchdog = arg_runtime_watchdog;
1488 m->shutdown_watchdog = arg_shutdown_watchdog;
1489
1490 manager_set_default_rlimits(m, arg_default_rlimit);
1491
1492 if (dual_timestamp_is_set(&initrd_timestamp))
1493 m->initrd_timestamp = initrd_timestamp;
1494
1495 if (arg_default_controllers)
1496 manager_set_default_controllers(m, arg_default_controllers);
1497
1498 manager_set_show_status(m, arg_show_status);
1499
1500 before_startup = now(CLOCK_MONOTONIC);
1501
1502 r = manager_startup(m, serialization, fds);
1503 if (r < 0)
1504 log_error("Failed to fully start up daemon: %s", strerror(-r));
1505
1506 if (fds) {
1507 /* This will close all file descriptors that were opened, but
1508 * not claimed by any unit. */
1509
1510 fdset_free(fds);
1511 fds = NULL;
1512 }
1513
1514 if (serialization) {
1515 fclose(serialization);
1516 serialization = NULL;
1517 } else {
1518 DBusError error;
1519 Unit *target = NULL;
1520 Job *default_unit_job;
1521
1522 dbus_error_init(&error);
1523
1524 log_debug("Activating default unit: %s", arg_default_unit);
1525
1526 r = manager_load_unit(m, arg_default_unit, NULL, &error, &target);
1527 if (r < 0) {
1528 log_error("Failed to load default target: %s", bus_error(&error, r));
1529 dbus_error_free(&error);
1530 } else if (target->load_state == UNIT_ERROR)
1531 log_error("Failed to load default target: %s", strerror(-target->load_error));
1532 else if (target->load_state == UNIT_MASKED)
1533 log_error("Default target masked.");
1534
1535 if (!target || target->load_state != UNIT_LOADED) {
1536 log_info("Trying to load rescue target...");
1537
1538 r = manager_load_unit(m, SPECIAL_RESCUE_TARGET, NULL, &error, &target);
1539 if (r < 0) {
1540 log_error("Failed to load rescue target: %s", bus_error(&error, r));
1541 dbus_error_free(&error);
1542 goto finish;
1543 } else if (target->load_state == UNIT_ERROR) {
1544 log_error("Failed to load rescue target: %s", strerror(-target->load_error));
1545 goto finish;
1546 } else if (target->load_state == UNIT_MASKED) {
1547 log_error("Rescue target masked.");
1548 goto finish;
1549 }
1550 }
1551
1552 assert(target->load_state == UNIT_LOADED);
1553
1554 if (arg_action == ACTION_TEST) {
1555 printf("-> By units:\n");
1556 manager_dump_units(m, stdout, "\t");
1557 }
1558
1559 r = manager_add_job(m, JOB_START, target, JOB_REPLACE, false, &error, &default_unit_job);
1560 if (r < 0) {
1561 log_error("Failed to start default target: %s", bus_error(&error, r));
1562 dbus_error_free(&error);
1563 goto finish;
1564 }
1565 m->default_unit_job_id = default_unit_job->id;
1566
1567 after_startup = now(CLOCK_MONOTONIC);
1568 log_full(arg_action == ACTION_TEST ? LOG_INFO : LOG_DEBUG,
1569 "Loaded units and determined initial transaction in %s.",
1570 format_timespan(timespan, sizeof(timespan), after_startup - before_startup));
1571
1572 if (arg_action == ACTION_TEST) {
1573 printf("-> By jobs:\n");
1574 manager_dump_jobs(m, stdout, "\t");
1575 retval = EXIT_SUCCESS;
1576 goto finish;
1577 }
1578 }
1579
1580 for (;;) {
1581 r = manager_loop(m);
1582 if (r < 0) {
1583 log_error("Failed to run mainloop: %s", strerror(-r));
1584 goto finish;
1585 }
1586
1587 switch (m->exit_code) {
1588
1589 case MANAGER_EXIT:
1590 retval = EXIT_SUCCESS;
1591 log_debug("Exit.");
1592 goto finish;
1593
1594 case MANAGER_RELOAD:
1595 log_info("Reloading.");
1596 r = manager_reload(m);
1597 if (r < 0)
1598 log_error("Failed to reload: %s", strerror(-r));
1599 break;
1600
1601 case MANAGER_REEXECUTE:
1602
1603 if (prepare_reexecute(m, &serialization, &fds) < 0)
1604 goto finish;
1605
1606 reexecute = true;
1607 log_notice("Reexecuting.");
1608 goto finish;
1609
1610 case MANAGER_SWITCH_ROOT:
1611 /* Steal the switch root parameters */
1612 switch_root_dir = m->switch_root;
1613 switch_root_init = m->switch_root_init;
1614 m->switch_root = m->switch_root_init = NULL;
1615
1616 if (!switch_root_init)
1617 if (prepare_reexecute(m, &serialization, &fds) < 0)
1618 goto finish;
1619
1620 reexecute = true;
1621 log_notice("Switching root.");
1622 goto finish;
1623
1624 case MANAGER_REBOOT:
1625 case MANAGER_POWEROFF:
1626 case MANAGER_HALT:
1627 case MANAGER_KEXEC: {
1628 static const char * const table[_MANAGER_EXIT_CODE_MAX] = {
1629 [MANAGER_REBOOT] = "reboot",
1630 [MANAGER_POWEROFF] = "poweroff",
1631 [MANAGER_HALT] = "halt",
1632 [MANAGER_KEXEC] = "kexec"
1633 };
1634
1635 assert_se(shutdown_verb = table[m->exit_code]);
1636 arm_reboot_watchdog = m->exit_code == MANAGER_REBOOT;
1637
1638 log_notice("Shutting down.");
1639 goto finish;
1640 }
1641
1642 default:
1643 assert_not_reached("Unknown exit code.");
1644 }
1645 }
1646
1647 finish:
1648 if (m)
1649 manager_free(m);
1650
1651 for (j = 0; j < RLIMIT_NLIMITS; j++)
1652 free (arg_default_rlimit[j]);
1653
1654 free(arg_default_unit);
1655 strv_free(arg_default_controllers);
1656 free_join_controllers();
1657
1658 dbus_shutdown();
1659 label_finish();
1660
1661 if (reexecute) {
1662 const char **args;
1663 unsigned i, args_size;
1664
1665 /* Close and disarm the watchdog, so that the new
1666 * instance can reinitialize it, but doesn't get
1667 * rebooted while we do that */
1668 watchdog_close(true);
1669
1670 if (switch_root_dir) {
1671 r = switch_root(switch_root_dir);
1672 if (r < 0)
1673 log_error("Failed to switch root, ignoring: %s", strerror(-r));
1674 }
1675
1676 args_size = MAX(6, argc+1);
1677 args = newa(const char*, args_size);
1678
1679 if (!switch_root_init) {
1680 char sfd[16];
1681
1682 /* First try to spawn ourselves with the right
1683 * path, and with full serialization. We do
1684 * this only if the user didn't specify an
1685 * explicit init to spawn. */
1686
1687 assert(serialization);
1688 assert(fds);
1689
1690 snprintf(sfd, sizeof(sfd), "%i", fileno(serialization));
1691 char_array_0(sfd);
1692
1693 i = 0;
1694 args[i++] = SYSTEMD_BINARY_PATH;
1695 if (switch_root_dir)
1696 args[i++] = "--switched-root";
1697 args[i++] = arg_running_as == MANAGER_SYSTEM ? "--system" : "--user";
1698 args[i++] = "--deserialize";
1699 args[i++] = sfd;
1700 args[i++] = NULL;
1701
1702 assert(i <= args_size);
1703 execv(args[0], (char* const*) args);
1704 }
1705
1706 /* Try the fallback, if there is any, without any
1707 * serialization. We pass the original argv[] and
1708 * envp[]. (Well, modulo the ordering changes due to
1709 * getopt() in argv[], and some cleanups in envp[],
1710 * but let's hope that doesn't matter.) */
1711
1712 if (serialization) {
1713 fclose(serialization);
1714 serialization = NULL;
1715 }
1716
1717 if (fds) {
1718 fdset_free(fds);
1719 fds = NULL;
1720 }
1721
1722 for (j = 1, i = 1; j < argc; j++)
1723 args[i++] = argv[j];
1724 args[i++] = NULL;
1725 assert(i <= args_size);
1726
1727 if (switch_root_init) {
1728 args[0] = switch_root_init;
1729 execv(args[0], (char* const*) args);
1730 log_warning("Failed to execute configured init, trying fallback: %m");
1731 }
1732
1733 args[0] = "/sbin/init";
1734 execv(args[0], (char* const*) args);
1735
1736 log_warning("Failed to execute /sbin/init, trying fallback: %m");
1737
1738 args[0] = "/bin/sh";
1739 args[1] = NULL;
1740 execv(args[0], (char* const*) args);
1741 log_error("Failed to execute /bin/sh, giving up: %m");
1742 }
1743
1744 if (serialization)
1745 fclose(serialization);
1746
1747 if (fds)
1748 fdset_free(fds);
1749
1750 if (shutdown_verb) {
1751 const char * command_line[] = {
1752 SYSTEMD_SHUTDOWN_BINARY_PATH,
1753 shutdown_verb,
1754 NULL
1755 };
1756 char **env_block;
1757
1758 if (arm_reboot_watchdog && arg_shutdown_watchdog > 0) {
1759 char e[32];
1760
1761 /* If we reboot let's set the shutdown
1762 * watchdog and tell the shutdown binary to
1763 * repeatedly ping it */
1764 watchdog_set_timeout(&arg_shutdown_watchdog);
1765 watchdog_close(false);
1766
1767 /* Tell the binary how often to ping */
1768 snprintf(e, sizeof(e), "WATCHDOG_USEC=%llu", (unsigned long long) arg_shutdown_watchdog);
1769 char_array_0(e);
1770
1771 env_block = strv_append(environ, e);
1772 } else {
1773 env_block = strv_copy(environ);
1774 watchdog_close(true);
1775 }
1776
1777 execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block);
1778 free(env_block);
1779 log_error("Failed to execute shutdown binary, freezing: %m");
1780 }
1781
1782 if (getpid() == 1)
1783 freeze();
1784
1785 return retval;
1786 }