]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/main.c
792b316c61b8e980fec719dee453c69da1723046
[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 <stdio.h>
23 #include <errno.h>
24 #include <string.h>
25 #include <unistd.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <getopt.h>
29 #include <signal.h>
30 #include <sys/wait.h>
31 #include <fcntl.h>
32 #include <sys/prctl.h>
33 #include <sys/mount.h>
34
35 #ifdef HAVE_VALGRIND_VALGRIND_H
36 #include <valgrind/valgrind.h>
37 #endif
38 #ifdef HAVE_SECCOMP
39 #include <seccomp.h>
40 #endif
41
42 #include "sd-daemon.h"
43 #include "sd-messages.h"
44 #include "sd-bus.h"
45 #include "manager.h"
46 #include "log.h"
47 #include "load-fragment.h"
48 #include "fdset.h"
49 #include "special.h"
50 #include "conf-parser.h"
51 #include "missing.h"
52 #include "label.h"
53 #include "pager.h"
54 #include "build.h"
55 #include "strv.h"
56 #include "def.h"
57 #include "virt.h"
58 #include "architecture.h"
59 #include "watchdog.h"
60 #include "path-util.h"
61 #include "switch-root.h"
62 #include "capability.h"
63 #include "killall.h"
64 #include "env-util.h"
65 #include "clock-util.h"
66 #include "fileio.h"
67 #include "dbus-manager.h"
68 #include "bus-error.h"
69 #include "bus-util.h"
70
71 #include "mount-setup.h"
72 #include "loopback-setup.h"
73 #include "hostname-setup.h"
74 #include "machine-id-setup.h"
75 #include "selinux-setup.h"
76 #include "ima-setup.h"
77 #include "smack-setup.h"
78 #ifdef HAVE_KMOD
79 #include "kmod-setup.h"
80 #endif
81
82 static enum {
83 ACTION_RUN,
84 ACTION_HELP,
85 ACTION_VERSION,
86 ACTION_TEST,
87 ACTION_DUMP_CONFIGURATION_ITEMS,
88 ACTION_DONE
89 } arg_action = ACTION_RUN;
90 static char *arg_default_unit = NULL;
91 static SystemdRunningAs arg_running_as = _SYSTEMD_RUNNING_AS_INVALID;
92 static bool arg_dump_core = true;
93 static bool arg_crash_shell = false;
94 static int arg_crash_chvt = -1;
95 static bool arg_confirm_spawn = false;
96 static ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
97 static bool arg_switched_root = false;
98 static int arg_no_pager = -1;
99 static char ***arg_join_controllers = NULL;
100 static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
101 static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
102 static usec_t arg_default_restart_usec = DEFAULT_RESTART_USEC;
103 static usec_t arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
104 static usec_t arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
105 static usec_t arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
106 static unsigned arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
107 static usec_t arg_runtime_watchdog = 0;
108 static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
109 static char **arg_default_environment = NULL;
110 static struct rlimit *arg_default_rlimit[_RLIMIT_MAX] = {};
111 static uint64_t arg_capability_bounding_set_drop = 0;
112 static nsec_t arg_timer_slack_nsec = NSEC_INFINITY;
113 static usec_t arg_default_timer_accuracy_usec = 1 * USEC_PER_MINUTE;
114 static Set* arg_syscall_archs = NULL;
115 static FILE* arg_serialization = NULL;
116 static bool arg_default_cpu_accounting = false;
117 static bool arg_default_blockio_accounting = false;
118 static bool arg_default_memory_accounting = false;
119
120 static void nop_handler(int sig) {}
121
122 static void pager_open_if_enabled(void) {
123
124 if (arg_no_pager <= 0)
125 return;
126
127 pager_open(false);
128 }
129
130 noreturn static void crash(int sig) {
131
132 if (getpid() != 1)
133 /* Pass this on immediately, if this is not PID 1 */
134 raise(sig);
135 else if (!arg_dump_core)
136 log_error("Caught <%s>, not dumping core.", signal_to_string(sig));
137 else {
138 struct sigaction sa = {
139 .sa_handler = nop_handler,
140 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
141 };
142 pid_t pid;
143
144 /* We want to wait for the core process, hence let's enable SIGCHLD */
145 sigaction(SIGCHLD, &sa, NULL);
146
147 pid = fork();
148 if (pid < 0)
149 log_error("Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig));
150
151 else if (pid == 0) {
152 struct rlimit rl = {};
153
154 /* Enable default signal handler for core dump */
155 zero(sa);
156 sa.sa_handler = SIG_DFL;
157 sigaction(sig, &sa, NULL);
158
159 /* Don't limit the core dump size */
160 rl.rlim_cur = RLIM_INFINITY;
161 rl.rlim_max = RLIM_INFINITY;
162 setrlimit(RLIMIT_CORE, &rl);
163
164 /* Just to be sure... */
165 chdir("/");
166
167 /* Raise the signal again */
168 raise(sig);
169
170 assert_not_reached("We shouldn't be here...");
171 _exit(1);
172
173 } else {
174 siginfo_t status;
175 int r;
176
177 /* Order things nicely. */
178 r = wait_for_terminate(pid, &status);
179 if (r < 0)
180 log_error("Caught <%s>, waitpid() failed: %s", signal_to_string(sig), strerror(-r));
181 else if (status.si_code != CLD_DUMPED)
182 log_error("Caught <%s>, core dump failed.", signal_to_string(sig));
183 else
184 log_error("Caught <%s>, dumped core as pid "PID_FMT".", signal_to_string(sig), pid);
185 }
186 }
187
188 if (arg_crash_chvt)
189 chvt(arg_crash_chvt);
190
191 if (arg_crash_shell) {
192 struct sigaction sa = {
193 .sa_handler = SIG_IGN,
194 .sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART,
195 };
196 pid_t pid;
197
198 log_info("Executing crash shell in 10s...");
199 sleep(10);
200
201 /* Let the kernel reap children for us */
202 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
203
204 pid = fork();
205 if (pid < 0)
206 log_error("Failed to fork off crash shell: %m");
207 else if (pid == 0) {
208 make_console_stdio();
209 execl("/bin/sh", "/bin/sh", NULL);
210
211 log_error("execl() failed: %m");
212 _exit(1);
213 }
214
215 log_info("Successfully spawned crash shell as pid "PID_FMT".", pid);
216 }
217
218 log_info("Freezing execution.");
219 freeze();
220 }
221
222 static void install_crash_handler(void) {
223 struct sigaction sa = {
224 .sa_handler = crash,
225 .sa_flags = SA_NODEFER,
226 };
227
228 sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
229 }
230
231 static int console_setup(void) {
232 _cleanup_close_ int tty_fd = -1;
233 int r;
234
235 tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
236 if (tty_fd < 0) {
237 log_error("Failed to open /dev/console: %s", strerror(-tty_fd));
238 return tty_fd;
239 }
240
241 /* We don't want to force text mode. plymouth may be showing
242 * pictures already from initrd. */
243 r = reset_terminal_fd(tty_fd, false);
244 if (r < 0) {
245 log_error("Failed to reset /dev/console: %s", strerror(-r));
246 return r;
247 }
248
249 return 0;
250 }
251
252 static int set_default_unit(const char *u) {
253 char *c;
254
255 assert(u);
256
257 c = strdup(u);
258 if (!c)
259 return -ENOMEM;
260
261 free(arg_default_unit);
262 arg_default_unit = c;
263
264 return 0;
265 }
266
267 static int parse_proc_cmdline_item(const char *key, const char *value) {
268
269 static const char * const rlmap[] = {
270 "emergency", SPECIAL_EMERGENCY_TARGET,
271 "-b", SPECIAL_EMERGENCY_TARGET,
272 "single", SPECIAL_RESCUE_TARGET,
273 "-s", SPECIAL_RESCUE_TARGET,
274 "s", SPECIAL_RESCUE_TARGET,
275 "S", SPECIAL_RESCUE_TARGET,
276 "1", SPECIAL_RESCUE_TARGET,
277 "2", SPECIAL_RUNLEVEL2_TARGET,
278 "3", SPECIAL_RUNLEVEL3_TARGET,
279 "4", SPECIAL_RUNLEVEL4_TARGET,
280 "5", SPECIAL_RUNLEVEL5_TARGET,
281 };
282 int r;
283
284 assert(key);
285
286 if (streq(key, "systemd.unit") && value) {
287
288 if (!in_initrd())
289 return set_default_unit(value);
290
291 } else if (streq(key, "rd.systemd.unit") && value) {
292
293 if (in_initrd())
294 return set_default_unit(value);
295
296 } else if (streq(key, "systemd.dump_core") && value) {
297
298 r = parse_boolean(value);
299 if (r < 0)
300 log_warning("Failed to parse dump core switch %s. Ignoring.", value);
301 else
302 arg_dump_core = r;
303
304 } else if (streq(key, "systemd.crash_shell") && value) {
305
306 r = parse_boolean(value);
307 if (r < 0)
308 log_warning("Failed to parse crash shell switch %s. Ignoring.", value);
309 else
310 arg_crash_shell = r;
311
312 } else if (streq(key, "systemd.crash_chvt") && value) {
313
314 if (safe_atoi(value, &r) < 0)
315 log_warning("Failed to parse crash chvt switch %s. Ignoring.", value);
316 else
317 arg_crash_chvt = r;
318
319 } else if (streq(key, "systemd.confirm_spawn") && value) {
320
321 r = parse_boolean(value);
322 if (r < 0)
323 log_warning("Failed to parse confirm spawn switch %s. Ignoring.", value);
324 else
325 arg_confirm_spawn = r;
326
327 } else if (streq(key, "systemd.show_status") && value) {
328
329 r = parse_show_status(value, &arg_show_status);
330 if (r < 0)
331 log_warning("Failed to parse show status switch %s. Ignoring.", value);
332
333 } else if (streq(key, "systemd.default_standard_output") && value) {
334
335 r = exec_output_from_string(value);
336 if (r < 0)
337 log_warning("Failed to parse default standard output switch %s. Ignoring.", value);
338 else
339 arg_default_std_output = r;
340
341 } else if (streq(key, "systemd.default_standard_error") && value) {
342
343 r = exec_output_from_string(value);
344 if (r < 0)
345 log_warning("Failed to parse default standard error switch %s. Ignoring.", value);
346 else
347 arg_default_std_error = r;
348
349 } else if (streq(key, "systemd.setenv") && value) {
350
351 if (env_assignment_is_valid(value)) {
352 char **env;
353
354 env = strv_env_set(arg_default_environment, value);
355 if (env)
356 arg_default_environment = env;
357 else
358 log_warning("Setting environment variable '%s' failed, ignoring: %s", value, strerror(ENOMEM));
359 } else
360 log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
361
362 } else if (streq(key, "quiet") && !value) {
363
364 log_set_max_level(LOG_NOTICE);
365
366 if (arg_show_status == _SHOW_STATUS_UNSET)
367 arg_show_status = SHOW_STATUS_AUTO;
368
369 } else if (streq(key, "debug") && !value) {
370
371 /* Note that log_parse_environment() handles 'debug'
372 * too, and sets the log level to LOG_DEBUG. */
373
374 if (detect_container(NULL) > 0)
375 log_set_target(LOG_TARGET_CONSOLE);
376
377 } else if (!in_initrd() && !value) {
378 unsigned i;
379
380 /* SysV compatibility */
381 for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
382 if (streq(key, rlmap[i]))
383 return set_default_unit(rlmap[i+1]);
384 }
385
386 return 0;
387 }
388
389 #define DEFINE_SETTER(name, func, descr) \
390 static int name(const char *unit, \
391 const char *filename, \
392 unsigned line, \
393 const char *section, \
394 unsigned section_line, \
395 const char *lvalue, \
396 int ltype, \
397 const char *rvalue, \
398 void *data, \
399 void *userdata) { \
400 \
401 int r; \
402 \
403 assert(filename); \
404 assert(lvalue); \
405 assert(rvalue); \
406 \
407 r = func(rvalue); \
408 if (r < 0) \
409 log_syntax(unit, LOG_ERR, filename, line, -r, \
410 "Invalid " descr "'%s': %s", \
411 rvalue, strerror(-r)); \
412 \
413 return 0; \
414 }
415
416 DEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level")
417 DEFINE_SETTER(config_parse_target, log_set_target_from_string, "target")
418 DEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" )
419 DEFINE_SETTER(config_parse_location, log_show_location_from_string, "location")
420
421 static int config_parse_cpu_affinity2(
422 const char *unit,
423 const char *filename,
424 unsigned line,
425 const char *section,
426 unsigned section_line,
427 const char *lvalue,
428 int ltype,
429 const char *rvalue,
430 void *data,
431 void *userdata) {
432
433 const char *word, *state;
434 size_t l;
435 cpu_set_t *c = NULL;
436 unsigned ncpus = 0;
437
438 assert(filename);
439 assert(lvalue);
440 assert(rvalue);
441
442 FOREACH_WORD_QUOTED(word, l, rvalue, state) {
443 char *t;
444 int r;
445 unsigned cpu;
446
447 if (!(t = strndup(word, l)))
448 return log_oom();
449
450 r = safe_atou(t, &cpu);
451 free(t);
452
453 if (!c)
454 if (!(c = cpu_set_malloc(&ncpus)))
455 return log_oom();
456
457 if (r < 0 || cpu >= ncpus) {
458 log_syntax(unit, LOG_ERR, filename, line, -r,
459 "Failed to parse CPU affinity '%s'", rvalue);
460 CPU_FREE(c);
461 return -EBADMSG;
462 }
463
464 CPU_SET_S(cpu, CPU_ALLOC_SIZE(ncpus), c);
465 }
466 if (!isempty(state))
467 log_syntax(unit, LOG_ERR, filename, line, EINVAL,
468 "Trailing garbage, ignoring.");
469
470 if (c) {
471 if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
472 log_warning_unit(unit, "Failed to set CPU affinity: %m");
473
474 CPU_FREE(c);
475 }
476
477 return 0;
478 }
479
480 static int config_parse_show_status(
481 const char* unit,
482 const char *filename,
483 unsigned line,
484 const char *section,
485 unsigned section_line,
486 const char *lvalue,
487 int ltype,
488 const char *rvalue,
489 void *data,
490 void *userdata) {
491
492 int k;
493 ShowStatus *b = data;
494
495 assert(filename);
496 assert(lvalue);
497 assert(rvalue);
498 assert(data);
499
500 k = parse_show_status(rvalue, b);
501 if (k < 0) {
502 log_syntax(unit, LOG_ERR, filename, line, -k,
503 "Failed to parse show status setting, ignoring: %s", rvalue);
504 return 0;
505 }
506
507 return 0;
508 }
509
510 static void strv_free_free(char ***l) {
511 char ***i;
512
513 if (!l)
514 return;
515
516 for (i = l; *i; i++)
517 strv_free(*i);
518
519 free(l);
520 }
521
522 static void free_join_controllers(void) {
523 strv_free_free(arg_join_controllers);
524 arg_join_controllers = NULL;
525 }
526
527 static int config_parse_join_controllers(const char *unit,
528 const char *filename,
529 unsigned line,
530 const char *section,
531 unsigned section_line,
532 const char *lvalue,
533 int ltype,
534 const char *rvalue,
535 void *data,
536 void *userdata) {
537
538 unsigned n = 0;
539 const char *word, *state;
540 size_t length;
541
542 assert(filename);
543 assert(lvalue);
544 assert(rvalue);
545
546 free_join_controllers();
547
548 FOREACH_WORD_QUOTED(word, length, rvalue, state) {
549 char *s, **l;
550
551 s = strndup(word, length);
552 if (!s)
553 return log_oom();
554
555 l = strv_split(s, ",");
556 free(s);
557
558 strv_uniq(l);
559
560 if (strv_length(l) <= 1) {
561 strv_free(l);
562 continue;
563 }
564
565 if (!arg_join_controllers) {
566 arg_join_controllers = new(char**, 2);
567 if (!arg_join_controllers) {
568 strv_free(l);
569 return log_oom();
570 }
571
572 arg_join_controllers[0] = l;
573 arg_join_controllers[1] = NULL;
574
575 n = 1;
576 } else {
577 char ***a;
578 char ***t;
579
580 t = new0(char**, n+2);
581 if (!t) {
582 strv_free(l);
583 return log_oom();
584 }
585
586 n = 0;
587
588 for (a = arg_join_controllers; *a; a++) {
589
590 if (strv_overlap(*a, l)) {
591 if (strv_extend_strv(&l, *a) < 0) {
592 strv_free(l);
593 strv_free_free(t);
594 return log_oom();
595 }
596
597 } else {
598 char **c;
599
600 c = strv_copy(*a);
601 if (!c) {
602 strv_free(l);
603 strv_free_free(t);
604 return log_oom();
605 }
606
607 t[n++] = c;
608 }
609 }
610
611 t[n++] = strv_uniq(l);
612
613 strv_free_free(arg_join_controllers);
614 arg_join_controllers = t;
615 }
616 }
617 if (!isempty(state))
618 log_syntax(unit, LOG_ERR, filename, line, EINVAL,
619 "Trailing garbage, ignoring.");
620
621 return 0;
622 }
623
624 static int parse_config_file(void) {
625
626 const ConfigTableItem items[] = {
627 { "Manager", "LogLevel", config_parse_level2, 0, NULL },
628 { "Manager", "LogTarget", config_parse_target, 0, NULL },
629 { "Manager", "LogColor", config_parse_color, 0, NULL },
630 { "Manager", "LogLocation", config_parse_location, 0, NULL },
631 { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
632 { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
633 { "Manager", "ShowStatus", config_parse_show_status, 0, &arg_show_status },
634 { "Manager", "CrashChVT", config_parse_int, 0, &arg_crash_chvt },
635 { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
636 { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
637 { "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog },
638 { "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog },
639 { "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
640 #ifdef HAVE_SECCOMP
641 { "Manager", "SystemCallArchitectures", config_parse_syscall_archs, 0, &arg_syscall_archs },
642 #endif
643 { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
644 { "Manager", "DefaultTimerAccuracySec", config_parse_sec, 0, &arg_default_timer_accuracy_usec },
645 { "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
646 { "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
647 { "Manager", "DefaultTimeoutStartSec", config_parse_sec, 0, &arg_default_timeout_start_usec },
648 { "Manager", "DefaultTimeoutStopSec", config_parse_sec, 0, &arg_default_timeout_stop_usec },
649 { "Manager", "DefaultRestartSec", config_parse_sec, 0, &arg_default_restart_usec },
650 { "Manager", "DefaultStartLimitInterval", config_parse_sec, 0, &arg_default_start_limit_interval },
651 { "Manager", "DefaultStartLimitBurst", config_parse_unsigned, 0, &arg_default_start_limit_burst },
652 { "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment },
653 { "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU] },
654 { "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE] },
655 { "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA] },
656 { "Manager", "DefaultLimitSTACK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_STACK] },
657 { "Manager", "DefaultLimitCORE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CORE] },
658 { "Manager", "DefaultLimitRSS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RSS] },
659 { "Manager", "DefaultLimitNOFILE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NOFILE] },
660 { "Manager", "DefaultLimitAS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_AS] },
661 { "Manager", "DefaultLimitNPROC", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NPROC] },
662 { "Manager", "DefaultLimitMEMLOCK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MEMLOCK] },
663 { "Manager", "DefaultLimitLOCKS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_LOCKS] },
664 { "Manager", "DefaultLimitSIGPENDING", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_SIGPENDING] },
665 { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MSGQUEUE] },
666 { "Manager", "DefaultLimitNICE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NICE] },
667 { "Manager", "DefaultLimitRTPRIO", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTPRIO] },
668 { "Manager", "DefaultLimitRTTIME", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTTIME] },
669 { "Manager", "DefaultCPUAccounting", config_parse_bool, 0, &arg_default_cpu_accounting },
670 { "Manager", "DefaultBlockIOAccounting", config_parse_bool, 0, &arg_default_blockio_accounting },
671 { "Manager", "DefaultMemoryAccounting", config_parse_bool, 0, &arg_default_memory_accounting },
672 {}
673 };
674
675 const char *fn;
676
677 fn = arg_running_as == SYSTEMD_SYSTEM ? PKGSYSCONFDIR "/system.conf" : PKGSYSCONFDIR "/user.conf";
678 config_parse(NULL, fn, NULL,
679 "Manager\0",
680 config_item_table_lookup, items,
681 false, false, true, NULL);
682
683 return 0;
684 }
685
686 static int parse_argv(int argc, char *argv[]) {
687
688 enum {
689 ARG_LOG_LEVEL = 0x100,
690 ARG_LOG_TARGET,
691 ARG_LOG_COLOR,
692 ARG_LOG_LOCATION,
693 ARG_UNIT,
694 ARG_SYSTEM,
695 ARG_USER,
696 ARG_TEST,
697 ARG_NO_PAGER,
698 ARG_VERSION,
699 ARG_DUMP_CONFIGURATION_ITEMS,
700 ARG_DUMP_CORE,
701 ARG_CRASH_SHELL,
702 ARG_CONFIRM_SPAWN,
703 ARG_SHOW_STATUS,
704 ARG_DESERIALIZE,
705 ARG_SWITCHED_ROOT,
706 ARG_DEFAULT_STD_OUTPUT,
707 ARG_DEFAULT_STD_ERROR
708 };
709
710 static const struct option options[] = {
711 { "log-level", required_argument, NULL, ARG_LOG_LEVEL },
712 { "log-target", required_argument, NULL, ARG_LOG_TARGET },
713 { "log-color", optional_argument, NULL, ARG_LOG_COLOR },
714 { "log-location", optional_argument, NULL, ARG_LOG_LOCATION },
715 { "unit", required_argument, NULL, ARG_UNIT },
716 { "system", no_argument, NULL, ARG_SYSTEM },
717 { "user", no_argument, NULL, ARG_USER },
718 { "test", no_argument, NULL, ARG_TEST },
719 { "no-pager", no_argument, NULL, ARG_NO_PAGER },
720 { "help", no_argument, NULL, 'h' },
721 { "version", no_argument, NULL, ARG_VERSION },
722 { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS },
723 { "dump-core", optional_argument, NULL, ARG_DUMP_CORE },
724 { "crash-shell", optional_argument, NULL, ARG_CRASH_SHELL },
725 { "confirm-spawn", optional_argument, NULL, ARG_CONFIRM_SPAWN },
726 { "show-status", optional_argument, NULL, ARG_SHOW_STATUS },
727 { "deserialize", required_argument, NULL, ARG_DESERIALIZE },
728 { "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
729 { "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
730 { "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
731 {}
732 };
733
734 int c, r;
735
736 assert(argc >= 1);
737 assert(argv);
738
739 if (getpid() == 1)
740 opterr = 0;
741
742 while ((c = getopt_long(argc, argv, "hDbsz:", options, NULL)) >= 0)
743
744 switch (c) {
745
746 case ARG_LOG_LEVEL:
747 r = log_set_max_level_from_string(optarg);
748 if (r < 0) {
749 log_error("Failed to parse log level %s.", optarg);
750 return r;
751 }
752
753 break;
754
755 case ARG_LOG_TARGET:
756 r = log_set_target_from_string(optarg);
757 if (r < 0) {
758 log_error("Failed to parse log target %s.", optarg);
759 return r;
760 }
761
762 break;
763
764 case ARG_LOG_COLOR:
765
766 if (optarg) {
767 r = log_show_color_from_string(optarg);
768 if (r < 0) {
769 log_error("Failed to parse log color setting %s.", optarg);
770 return r;
771 }
772 } else
773 log_show_color(true);
774
775 break;
776
777 case ARG_LOG_LOCATION:
778 if (optarg) {
779 r = log_show_location_from_string(optarg);
780 if (r < 0) {
781 log_error("Failed to parse log location setting %s.", optarg);
782 return r;
783 }
784 } else
785 log_show_location(true);
786
787 break;
788
789 case ARG_DEFAULT_STD_OUTPUT:
790 r = exec_output_from_string(optarg);
791 if (r < 0) {
792 log_error("Failed to parse default standard output setting %s.", optarg);
793 return r;
794 } else
795 arg_default_std_output = r;
796 break;
797
798 case ARG_DEFAULT_STD_ERROR:
799 r = exec_output_from_string(optarg);
800 if (r < 0) {
801 log_error("Failed to parse default standard error output setting %s.", optarg);
802 return r;
803 } else
804 arg_default_std_error = r;
805 break;
806
807 case ARG_UNIT:
808
809 r = set_default_unit(optarg);
810 if (r < 0) {
811 log_error("Failed to set default unit %s: %s", optarg, strerror(-r));
812 return r;
813 }
814
815 break;
816
817 case ARG_SYSTEM:
818 arg_running_as = SYSTEMD_SYSTEM;
819 break;
820
821 case ARG_USER:
822 arg_running_as = SYSTEMD_USER;
823 break;
824
825 case ARG_TEST:
826 arg_action = ACTION_TEST;
827 if (arg_no_pager < 0)
828 arg_no_pager = true;
829 break;
830
831 case ARG_NO_PAGER:
832 arg_no_pager = true;
833 break;
834
835 case ARG_VERSION:
836 arg_action = ACTION_VERSION;
837 break;
838
839 case ARG_DUMP_CONFIGURATION_ITEMS:
840 arg_action = ACTION_DUMP_CONFIGURATION_ITEMS;
841 break;
842
843 case ARG_DUMP_CORE:
844 r = optarg ? parse_boolean(optarg) : 1;
845 if (r < 0) {
846 log_error("Failed to parse dump core boolean %s.", optarg);
847 return r;
848 }
849 arg_dump_core = r;
850 break;
851
852 case ARG_CRASH_SHELL:
853 r = optarg ? parse_boolean(optarg) : 1;
854 if (r < 0) {
855 log_error("Failed to parse crash shell boolean %s.", optarg);
856 return r;
857 }
858 arg_crash_shell = r;
859 break;
860
861 case ARG_CONFIRM_SPAWN:
862 r = optarg ? parse_boolean(optarg) : 1;
863 if (r < 0) {
864 log_error("Failed to parse confirm spawn boolean %s.", optarg);
865 return r;
866 }
867 arg_confirm_spawn = r;
868 break;
869
870 case ARG_SHOW_STATUS:
871 if (optarg) {
872 r = parse_show_status(optarg, &arg_show_status);
873 if (r < 0) {
874 log_error("Failed to parse show status boolean %s.", optarg);
875 return r;
876 }
877 } else
878 arg_show_status = SHOW_STATUS_YES;
879 break;
880
881 case ARG_DESERIALIZE: {
882 int fd;
883 FILE *f;
884
885 r = safe_atoi(optarg, &fd);
886 if (r < 0 || fd < 0) {
887 log_error("Failed to parse deserialize option %s.", optarg);
888 return r < 0 ? r : -EINVAL;
889 }
890
891 fd_cloexec(fd, true);
892
893 f = fdopen(fd, "r");
894 if (!f) {
895 log_error("Failed to open serialization fd: %m");
896 return -errno;
897 }
898
899 if (arg_serialization)
900 fclose(arg_serialization);
901
902 arg_serialization = f;
903
904 break;
905 }
906
907 case ARG_SWITCHED_ROOT:
908 arg_switched_root = true;
909 break;
910
911 case 'h':
912 arg_action = ACTION_HELP;
913 if (arg_no_pager < 0)
914 arg_no_pager = true;
915 break;
916
917 case 'D':
918 log_set_max_level(LOG_DEBUG);
919 break;
920
921 case 'b':
922 case 's':
923 case 'z':
924 /* Just to eat away the sysvinit kernel
925 * cmdline args without getopt() error
926 * messages that we'll parse in
927 * parse_proc_cmdline_word() or ignore. */
928
929 case '?':
930 if (getpid() != 1)
931 return -EINVAL;
932 else
933 return 0;
934
935 default:
936 assert_not_reached("Unhandled option code.");
937 }
938
939 if (optind < argc && getpid() != 1) {
940 /* Hmm, when we aren't run as init system
941 * let's complain about excess arguments */
942
943 log_error("Excess arguments.");
944 return -EINVAL;
945 }
946
947 return 0;
948 }
949
950 static int help(void) {
951
952 printf("%s [OPTIONS...]\n\n"
953 "Starts up and maintains the system or user services.\n\n"
954 " -h --help Show this help\n"
955 " --test Determine startup sequence, dump it and exit\n"
956 " --no-pager Do not pipe output into a pager\n"
957 " --dump-configuration-items Dump understood unit configuration items\n"
958 " --unit=UNIT Set default unit\n"
959 " --system Run a system instance, even if PID != 1\n"
960 " --user Run a user instance\n"
961 " --dump-core[=0|1] Dump core on crash\n"
962 " --crash-shell[=0|1] Run shell on crash\n"
963 " --confirm-spawn[=0|1] Ask for confirmation when spawning processes\n"
964 " --show-status[=0|1] Show status updates on the console during bootup\n"
965 " --log-target=TARGET Set log target (console, journal, kmsg, journal-or-kmsg, null)\n"
966 " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
967 " --log-color[=0|1] Highlight important log messages\n"
968 " --log-location[=0|1] Include code location in log messages\n"
969 " --default-standard-output= Set default standard output for services\n"
970 " --default-standard-error= Set default standard error output for services\n",
971 program_invocation_short_name);
972
973 return 0;
974 }
975
976 static int version(void) {
977 puts(PACKAGE_STRING);
978 puts(SYSTEMD_FEATURES);
979
980 return 0;
981 }
982
983 static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching_root) {
984 FILE *f = NULL;
985 FDSet *fds = NULL;
986 int r;
987
988 assert(m);
989 assert(_f);
990 assert(_fds);
991
992 r = manager_open_serialization(m, &f);
993 if (r < 0) {
994 log_error("Failed to create serialization file: %s", strerror(-r));
995 goto fail;
996 }
997
998 /* Make sure nothing is really destructed when we shut down */
999 m->n_reloading ++;
1000 bus_manager_send_reloading(m, true);
1001
1002 fds = fdset_new();
1003 if (!fds) {
1004 r = -ENOMEM;
1005 log_error("Failed to allocate fd set: %s", strerror(-r));
1006 goto fail;
1007 }
1008
1009 r = manager_serialize(m, f, fds, switching_root);
1010 if (r < 0) {
1011 log_error("Failed to serialize state: %s", strerror(-r));
1012 goto fail;
1013 }
1014
1015 if (fseeko(f, 0, SEEK_SET) < 0) {
1016 log_error("Failed to rewind serialization fd: %m");
1017 goto fail;
1018 }
1019
1020 r = fd_cloexec(fileno(f), false);
1021 if (r < 0) {
1022 log_error("Failed to disable O_CLOEXEC for serialization: %s", strerror(-r));
1023 goto fail;
1024 }
1025
1026 r = fdset_cloexec(fds, false);
1027 if (r < 0) {
1028 log_error("Failed to disable O_CLOEXEC for serialization fds: %s", strerror(-r));
1029 goto fail;
1030 }
1031
1032 *_f = f;
1033 *_fds = fds;
1034
1035 return 0;
1036
1037 fail:
1038 fdset_free(fds);
1039
1040 if (f)
1041 fclose(f);
1042
1043 return r;
1044 }
1045
1046 static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
1047 struct rlimit nl;
1048 int r;
1049
1050 assert(saved_rlimit);
1051
1052 /* Save the original RLIMIT_NOFILE so that we can reset it
1053 * later when transitioning from the initrd to the main
1054 * systemd or suchlike. */
1055 if (getrlimit(RLIMIT_NOFILE, saved_rlimit) < 0) {
1056 log_error("Reading RLIMIT_NOFILE failed: %m");
1057 return -errno;
1058 }
1059
1060 /* Make sure forked processes get the default kernel setting */
1061 if (!arg_default_rlimit[RLIMIT_NOFILE]) {
1062 struct rlimit *rl;
1063
1064 rl = newdup(struct rlimit, saved_rlimit, 1);
1065 if (!rl)
1066 return log_oom();
1067
1068 arg_default_rlimit[RLIMIT_NOFILE] = rl;
1069 }
1070
1071 /* Bump up the resource limit for ourselves substantially */
1072 nl.rlim_cur = nl.rlim_max = 64*1024;
1073 r = setrlimit_closest(RLIMIT_NOFILE, &nl);
1074 if (r < 0) {
1075 log_error("Setting RLIMIT_NOFILE failed: %s", strerror(-r));
1076 return r;
1077 }
1078
1079 return 0;
1080 }
1081
1082 static void test_mtab(void) {
1083
1084 static const char ok[] =
1085 "/proc/self/mounts\0"
1086 "/proc/mounts\0"
1087 "../proc/self/mounts\0"
1088 "../proc/mounts\0";
1089
1090 _cleanup_free_ char *p = NULL;
1091 int r;
1092
1093 /* Check that /etc/mtab is a symlink to the right place or
1094 * non-existing. But certainly not a file, or a symlink to
1095 * some weird place... */
1096
1097 r = readlink_malloc("/etc/mtab", &p);
1098 if (r == -ENOENT)
1099 return;
1100 if (r >= 0 && nulstr_contains(ok, p))
1101 return;
1102
1103 log_warning("/etc/mtab is not a symlink or not pointing to /proc/self/mounts. "
1104 "This is not supported anymore. "
1105 "Please make sure to replace this file by a symlink to avoid incorrect or misleading mount(8) output.");
1106 }
1107
1108 static void test_usr(void) {
1109
1110 /* Check that /usr is not a separate fs */
1111
1112 if (dir_is_empty("/usr") <= 0)
1113 return;
1114
1115 log_warning("/usr appears to be on its own filesytem and is not already mounted. This is not a supported setup. "
1116 "Some things will probably break (sometimes even silently) in mysterious ways. "
1117 "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
1118 }
1119
1120 static int initialize_join_controllers(void) {
1121 /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
1122 * + "net_prio". We'd like to add "cpuset" to the mix, but
1123 * "cpuset" does't really work for groups with no initialized
1124 * attributes. */
1125
1126 arg_join_controllers = new(char**, 3);
1127 if (!arg_join_controllers)
1128 return -ENOMEM;
1129
1130 arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL);
1131 arg_join_controllers[1] = strv_new("net_cls", "net_prio", NULL);
1132 arg_join_controllers[2] = NULL;
1133
1134 if (!arg_join_controllers[0] || !arg_join_controllers[1]) {
1135 free_join_controllers();
1136 return -ENOMEM;
1137 }
1138
1139 return 0;
1140 }
1141
1142 static int enforce_syscall_archs(Set *archs) {
1143 #ifdef HAVE_SECCOMP
1144 scmp_filter_ctx *seccomp;
1145 Iterator i;
1146 void *id;
1147 int r;
1148
1149 seccomp = seccomp_init(SCMP_ACT_ALLOW);
1150 if (!seccomp)
1151 return log_oom();
1152
1153 SET_FOREACH(id, arg_syscall_archs, i) {
1154 r = seccomp_arch_add(seccomp, PTR_TO_UINT32(id) - 1);
1155 if (r == -EEXIST)
1156 continue;
1157 if (r < 0) {
1158 log_error("Failed to add architecture to seccomp: %s", strerror(-r));
1159 goto finish;
1160 }
1161 }
1162
1163 r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
1164 if (r < 0) {
1165 log_error("Failed to unset NO_NEW_PRIVS: %s", strerror(-r));
1166 goto finish;
1167 }
1168
1169 r = seccomp_load(seccomp);
1170 if (r < 0)
1171 log_error("Failed to add install architecture seccomp: %s", strerror(-r));
1172
1173 finish:
1174 seccomp_release(seccomp);
1175 return r;
1176 #else
1177 return 0;
1178 #endif
1179 }
1180
1181 static int status_welcome(void) {
1182 _cleanup_free_ char *pretty_name = NULL, *ansi_color = NULL;
1183 int r;
1184
1185 r = parse_env_file("/etc/os-release", NEWLINE,
1186 "PRETTY_NAME", &pretty_name,
1187 "ANSI_COLOR", &ansi_color,
1188 NULL);
1189 if (r == -ENOENT) {
1190 r = parse_env_file("/usr/lib/os-release", NEWLINE,
1191 "PRETTY_NAME", &pretty_name,
1192 "ANSI_COLOR", &ansi_color,
1193 NULL);
1194 }
1195
1196 if (r < 0 && r != -ENOENT)
1197 log_warning("Failed to read os-release file: %s", strerror(-r));
1198
1199 return status_printf(NULL, false, false,
1200 "\nWelcome to \x1B[%sm%s\x1B[0m!\n",
1201 isempty(ansi_color) ? "1" : ansi_color,
1202 isempty(pretty_name) ? "Linux" : pretty_name);
1203 }
1204
1205 static int write_container_id(void) {
1206 const char *c;
1207
1208 c = getenv("container");
1209 if (isempty(c))
1210 return 0;
1211
1212 return write_string_file("/run/systemd/container", c);
1213 }
1214
1215 int main(int argc, char *argv[]) {
1216 Manager *m = NULL;
1217 int r, retval = EXIT_FAILURE;
1218 usec_t before_startup, after_startup;
1219 char timespan[FORMAT_TIMESPAN_MAX];
1220 FDSet *fds = NULL;
1221 bool reexecute = false;
1222 const char *shutdown_verb = NULL;
1223 dual_timestamp initrd_timestamp = { 0ULL, 0ULL };
1224 dual_timestamp userspace_timestamp = { 0ULL, 0ULL };
1225 dual_timestamp kernel_timestamp = { 0ULL, 0ULL };
1226 dual_timestamp security_start_timestamp = { 0ULL, 0ULL };
1227 dual_timestamp security_finish_timestamp = { 0ULL, 0ULL };
1228 static char systemd[] = "systemd";
1229 bool skip_setup = false;
1230 unsigned j;
1231 bool loaded_policy = false;
1232 bool arm_reboot_watchdog = false;
1233 bool queue_default_job = false;
1234 bool empty_etc = false;
1235 char *switch_root_dir = NULL, *switch_root_init = NULL;
1236 static struct rlimit saved_rlimit_nofile = { 0, 0 };
1237
1238 #ifdef HAVE_SYSV_COMPAT
1239 if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
1240 /* This is compatibility support for SysV, where
1241 * calling init as a user is identical to telinit. */
1242
1243 errno = -ENOENT;
1244 execv(SYSTEMCTL_BINARY_PATH, argv);
1245 log_error("Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
1246 return 1;
1247 }
1248 #endif
1249
1250 dual_timestamp_from_monotonic(&kernel_timestamp, 0);
1251 dual_timestamp_get(&userspace_timestamp);
1252
1253 /* Determine if this is a reexecution or normal bootup. We do
1254 * the full command line parsing much later, so let's just
1255 * have a quick peek here. */
1256 if (strv_find(argv+1, "--deserialize"))
1257 skip_setup = true;
1258
1259 /* If we have switched root, do all the special setup
1260 * things */
1261 if (strv_find(argv+1, "--switched-root"))
1262 skip_setup = false;
1263
1264 /* If we get started via the /sbin/init symlink then we are
1265 called 'init'. After a subsequent reexecution we are then
1266 called 'systemd'. That is confusing, hence let's call us
1267 systemd right-away. */
1268 program_invocation_short_name = systemd;
1269 prctl(PR_SET_NAME, systemd);
1270
1271 saved_argv = argv;
1272 saved_argc = argc;
1273
1274 log_show_color(isatty(STDERR_FILENO) > 0);
1275 log_set_upgrade_syslog_to_journal(true);
1276
1277 /* Disable the umask logic */
1278 if (getpid() == 1)
1279 umask(0);
1280
1281 if (getpid() == 1 && detect_container(NULL) <= 0) {
1282
1283 /* Running outside of a container as PID 1 */
1284 arg_running_as = SYSTEMD_SYSTEM;
1285 make_null_stdio();
1286 log_set_target(LOG_TARGET_KMSG);
1287 log_open();
1288
1289 if (in_initrd())
1290 initrd_timestamp = userspace_timestamp;
1291
1292 if (!skip_setup) {
1293 mount_setup_early();
1294 dual_timestamp_get(&security_start_timestamp);
1295 if (selinux_setup(&loaded_policy) < 0)
1296 goto finish;
1297 if (ima_setup() < 0)
1298 goto finish;
1299 if (smack_setup(&loaded_policy) < 0)
1300 goto finish;
1301 dual_timestamp_get(&security_finish_timestamp);
1302 }
1303
1304 if (label_init(NULL) < 0)
1305 goto finish;
1306
1307 if (!skip_setup) {
1308 if (clock_is_localtime() > 0) {
1309 int min;
1310
1311 /*
1312 * The very first call of settimeofday() also does a time warp in the kernel.
1313 *
1314 * In the rtc-in-local time mode, we set the kernel's timezone, and rely on
1315 * external tools to take care of maintaining the RTC and do all adjustments.
1316 * This matches the behavior of Windows, which leaves the RTC alone if the
1317 * registry tells that the RTC runs in UTC.
1318 */
1319 r = clock_set_timezone(&min);
1320 if (r < 0)
1321 log_error("Failed to apply local time delta, ignoring: %s", strerror(-r));
1322 else
1323 log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
1324 } else if (!in_initrd()) {
1325 /*
1326 * Do a dummy very first call to seal the kernel's time warp magic.
1327 *
1328 * Do not call this this from inside the initrd. The initrd might not
1329 * carry /etc/adjtime with LOCAL, but the real system could be set up
1330 * that way. In such case, we need to delay the time-warp or the sealing
1331 * until we reach the real system.
1332 *
1333 * Do no set the kernel's timezone. The concept of local time cannot
1334 * be supported reliably, the time will jump or be incorrect at every daylight
1335 * saving time change. All kernel local time concepts will be treated
1336 * as UTC that way.
1337 */
1338 clock_reset_timewarp();
1339 }
1340 }
1341
1342 /* Set the default for later on, but don't actually
1343 * open the logs like this for now. Note that if we
1344 * are transitioning from the initrd there might still
1345 * be journal fd open, and we shouldn't attempt
1346 * opening that before we parsed /proc/cmdline which
1347 * might redirect output elsewhere. */
1348 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1349
1350 } else if (getpid() == 1) {
1351 /* Running inside a container, as PID 1 */
1352 arg_running_as = SYSTEMD_SYSTEM;
1353 log_set_target(LOG_TARGET_CONSOLE);
1354 log_close_console(); /* force reopen of /dev/console */
1355 log_open();
1356
1357 /* For the later on, see above... */
1358 log_set_target(LOG_TARGET_JOURNAL);
1359
1360 /* clear the kernel timestamp,
1361 * because we are in a container */
1362 kernel_timestamp.monotonic = 0ULL;
1363 kernel_timestamp.realtime = 0ULL;
1364
1365 } else {
1366 /* Running as user instance */
1367 arg_running_as = SYSTEMD_USER;
1368 log_set_target(LOG_TARGET_AUTO);
1369 log_open();
1370
1371 /* clear the kernel timestamp,
1372 * because we are not PID 1 */
1373 kernel_timestamp.monotonic = 0ULL;
1374 kernel_timestamp.realtime = 0ULL;
1375 }
1376
1377 /* Initialize default unit */
1378 r = set_default_unit(SPECIAL_DEFAULT_TARGET);
1379 if (r < 0) {
1380 log_error("Failed to set default unit %s: %s", SPECIAL_DEFAULT_TARGET, strerror(-r));
1381 goto finish;
1382 }
1383
1384 r = initialize_join_controllers();
1385 if (r < 0)
1386 goto finish;
1387
1388 /* Mount /proc, /sys and friends, so that /proc/cmdline and
1389 * /proc/$PID/fd is available. */
1390 if (getpid() == 1) {
1391 r = mount_setup(loaded_policy);
1392 if (r < 0)
1393 goto finish;
1394 }
1395
1396 /* Reset all signal handlers. */
1397 assert_se(reset_all_signal_handlers() == 0);
1398
1399 ignore_signals(SIGNALS_IGNORE, -1);
1400
1401 if (parse_config_file() < 0)
1402 goto finish;
1403
1404 if (arg_running_as == SYSTEMD_SYSTEM)
1405 if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
1406 goto finish;
1407
1408 /* Note that this also parses bits from the kernel command
1409 * line, including "debug". */
1410 log_parse_environment();
1411
1412 if (parse_argv(argc, argv) < 0)
1413 goto finish;
1414
1415 if (arg_action == ACTION_TEST &&
1416 geteuid() == 0) {
1417 log_error("Don't run test mode as root.");
1418 goto finish;
1419 }
1420
1421 if (arg_running_as == SYSTEMD_USER &&
1422 arg_action == ACTION_RUN &&
1423 sd_booted() <= 0) {
1424 log_error("Trying to run as user instance, but the system has not been booted with systemd.");
1425 goto finish;
1426 }
1427
1428 if (arg_running_as == SYSTEMD_SYSTEM &&
1429 arg_action == ACTION_RUN &&
1430 running_in_chroot() > 0) {
1431 log_error("Cannot be run in a chroot() environment.");
1432 goto finish;
1433 }
1434
1435 if (arg_action == ACTION_TEST)
1436 skip_setup = true;
1437
1438 pager_open_if_enabled();
1439
1440 if (arg_action == ACTION_HELP) {
1441 retval = help();
1442 goto finish;
1443 } else if (arg_action == ACTION_VERSION) {
1444 retval = version();
1445 goto finish;
1446 } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) {
1447 unit_dump_config_items(stdout);
1448 retval = EXIT_SUCCESS;
1449 goto finish;
1450 } else if (arg_action == ACTION_DONE) {
1451 retval = EXIT_SUCCESS;
1452 goto finish;
1453 }
1454
1455 if (arg_running_as == SYSTEMD_USER &&
1456 !getenv("XDG_RUNTIME_DIR")) {
1457 log_error("Trying to run as user instance, but $XDG_RUNTIME_DIR is not set.");
1458 goto finish;
1459 }
1460
1461 assert_se(arg_action == ACTION_RUN || arg_action == ACTION_TEST);
1462
1463 /* Close logging fds, in order not to confuse fdset below */
1464 log_close();
1465
1466 /* Remember open file descriptors for later deserialization */
1467 r = fdset_new_fill(&fds);
1468 if (r < 0) {
1469 log_error("Failed to allocate fd set: %s", strerror(-r));
1470 goto finish;
1471 } else
1472 fdset_cloexec(fds, true);
1473
1474 if (arg_serialization)
1475 assert_se(fdset_remove(fds, fileno(arg_serialization)) >= 0);
1476
1477 if (arg_running_as == SYSTEMD_SYSTEM)
1478 /* Become a session leader if we aren't one yet. */
1479 setsid();
1480
1481 /* Move out of the way, so that we won't block unmounts */
1482 assert_se(chdir("/") == 0);
1483
1484 /* Reset the console, but only if this is really init and we
1485 * are freshly booted */
1486 if (arg_running_as == SYSTEMD_SYSTEM && arg_action == ACTION_RUN) {
1487
1488 /* If we are init, we connect stdin/stdout/stderr to
1489 * /dev/null and make sure we don't have a controlling
1490 * tty. */
1491 release_terminal();
1492
1493 if (getpid() == 1 && !skip_setup)
1494 console_setup();
1495 }
1496
1497 /* Open the logging devices, if possible and necessary */
1498 log_open();
1499
1500 if (arg_show_status == _SHOW_STATUS_UNSET)
1501 arg_show_status = SHOW_STATUS_YES;
1502
1503 /* Make sure we leave a core dump without panicing the
1504 * kernel. */
1505 if (getpid() == 1) {
1506 install_crash_handler();
1507
1508 r = mount_cgroup_controllers(arg_join_controllers);
1509 if (r < 0)
1510 goto finish;
1511 }
1512
1513 if (arg_running_as == SYSTEMD_SYSTEM) {
1514 const char *virtualization = NULL;
1515
1516 log_info(PACKAGE_STRING " running in %ssystem mode. (" SYSTEMD_FEATURES ")",
1517 arg_action == ACTION_TEST ? "test " : "" );
1518
1519 detect_virtualization(&virtualization);
1520 if (virtualization)
1521 log_info("Detected virtualization '%s'.", virtualization);
1522
1523 write_container_id();
1524
1525 log_info("Detected architecture '%s'.", architecture_to_string(uname_architecture()));
1526
1527 if (in_initrd())
1528 log_info("Running in initial RAM disk.");
1529
1530 /* Let's check whether /etc is already populated. We
1531 * don't actually really check for that, but use
1532 * /etc/machine-id as flag file. This allows container
1533 * managers and installers to provision a couple of
1534 * files already. If the container manager wants to
1535 * provision the machine ID itself it should pass
1536 * $container_uuid to PID 1.*/
1537
1538 empty_etc = access("/etc/machine-id", F_OK) < 0;
1539 if (empty_etc)
1540 log_info("Running with unpopulated /etc.");
1541 } else {
1542 _cleanup_free_ char *t;
1543
1544 t = uid_to_name(getuid());
1545 log_debug(PACKAGE_STRING " running in %suser mode for user "UID_FMT"/%s. (" SYSTEMD_FEATURES ")",
1546 arg_action == ACTION_TEST ? " test" : "", getuid(), t);
1547 }
1548
1549 if (arg_running_as == SYSTEMD_SYSTEM && !skip_setup) {
1550 if (arg_show_status > 0 || plymouth_running())
1551 status_welcome();
1552
1553 #ifdef HAVE_KMOD
1554 kmod_setup();
1555 #endif
1556 hostname_setup();
1557 machine_id_setup(NULL);
1558 loopback_setup();
1559
1560 test_mtab();
1561 test_usr();
1562 }
1563
1564 if (arg_running_as == SYSTEMD_SYSTEM && arg_runtime_watchdog > 0)
1565 watchdog_set_timeout(&arg_runtime_watchdog);
1566
1567 if (arg_timer_slack_nsec != NSEC_INFINITY)
1568 if (prctl(PR_SET_TIMERSLACK, arg_timer_slack_nsec) < 0)
1569 log_error("Failed to adjust timer slack: %m");
1570
1571 if (arg_capability_bounding_set_drop) {
1572 r = capability_bounding_set_drop_usermode(arg_capability_bounding_set_drop);
1573 if (r < 0) {
1574 log_error("Failed to drop capability bounding set of usermode helpers: %s", strerror(-r));
1575 goto finish;
1576 }
1577 r = capability_bounding_set_drop(arg_capability_bounding_set_drop, true);
1578 if (r < 0) {
1579 log_error("Failed to drop capability bounding set: %s", strerror(-r));
1580 goto finish;
1581 }
1582 }
1583
1584 if (arg_syscall_archs) {
1585 r = enforce_syscall_archs(arg_syscall_archs);
1586 if (r < 0)
1587 goto finish;
1588 }
1589
1590 if (arg_running_as == SYSTEMD_USER) {
1591 /* Become reaper of our children */
1592 if (prctl(PR_SET_CHILD_SUBREAPER, 1) < 0) {
1593 log_warning("Failed to make us a subreaper: %m");
1594 if (errno == EINVAL)
1595 log_info("Perhaps the kernel version is too old (< 3.4?)");
1596 }
1597 }
1598
1599 if (arg_running_as == SYSTEMD_SYSTEM) {
1600 bump_rlimit_nofile(&saved_rlimit_nofile);
1601
1602 if (empty_etc) {
1603 r = unit_file_preset_all(UNIT_FILE_SYSTEM, false, NULL, UNIT_FILE_PRESET_FULL, false, NULL, 0);
1604 if (r < 0)
1605 log_warning("Failed to populate /etc with preset unit settings, ignoring: %s", strerror(-r));
1606 else
1607 log_info("Populated /etc with preset unit settings.");
1608 }
1609 }
1610
1611 r = manager_new(arg_running_as, arg_action == ACTION_TEST, &m);
1612 if (r < 0) {
1613 log_error("Failed to allocate manager object: %s", strerror(-r));
1614 goto finish;
1615 }
1616
1617 m->confirm_spawn = arg_confirm_spawn;
1618 m->default_timer_accuracy_usec = arg_default_timer_accuracy_usec;
1619 m->default_std_output = arg_default_std_output;
1620 m->default_std_error = arg_default_std_error;
1621 m->default_restart_usec = arg_default_restart_usec;
1622 m->default_timeout_start_usec = arg_default_timeout_start_usec;
1623 m->default_timeout_stop_usec = arg_default_timeout_stop_usec;
1624 m->default_start_limit_interval = arg_default_start_limit_interval;
1625 m->default_start_limit_burst = arg_default_start_limit_burst;
1626 m->default_cpu_accounting = arg_default_cpu_accounting;
1627 m->default_blockio_accounting = arg_default_blockio_accounting;
1628 m->default_memory_accounting = arg_default_memory_accounting;
1629 m->runtime_watchdog = arg_runtime_watchdog;
1630 m->shutdown_watchdog = arg_shutdown_watchdog;
1631 m->userspace_timestamp = userspace_timestamp;
1632 m->kernel_timestamp = kernel_timestamp;
1633 m->initrd_timestamp = initrd_timestamp;
1634 m->security_start_timestamp = security_start_timestamp;
1635 m->security_finish_timestamp = security_finish_timestamp;
1636
1637 manager_set_default_rlimits(m, arg_default_rlimit);
1638 manager_environment_add(m, NULL, arg_default_environment);
1639 manager_set_show_status(m, arg_show_status);
1640 manager_set_first_boot(m, empty_etc);
1641
1642 /* Remember whether we should queue the default job */
1643 queue_default_job = !arg_serialization || arg_switched_root;
1644
1645 before_startup = now(CLOCK_MONOTONIC);
1646
1647 r = manager_startup(m, arg_serialization, fds);
1648 if (r < 0)
1649 log_error("Failed to fully start up daemon: %s", strerror(-r));
1650
1651 /* This will close all file descriptors that were opened, but
1652 * not claimed by any unit. */
1653 fdset_free(fds);
1654 fds = NULL;
1655
1656 if (arg_serialization) {
1657 fclose(arg_serialization);
1658 arg_serialization = NULL;
1659 }
1660
1661 if (queue_default_job) {
1662 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1663 Unit *target = NULL;
1664 Job *default_unit_job;
1665
1666 log_debug("Activating default unit: %s", arg_default_unit);
1667
1668 r = manager_load_unit(m, arg_default_unit, NULL, &error, &target);
1669 if (r < 0)
1670 log_error("Failed to load default target: %s", bus_error_message(&error, r));
1671 else if (target->load_state == UNIT_ERROR || target->load_state == UNIT_NOT_FOUND)
1672 log_error("Failed to load default target: %s", strerror(-target->load_error));
1673 else if (target->load_state == UNIT_MASKED)
1674 log_error("Default target masked.");
1675
1676 if (!target || target->load_state != UNIT_LOADED) {
1677 log_info("Trying to load rescue target...");
1678
1679 r = manager_load_unit(m, SPECIAL_RESCUE_TARGET, NULL, &error, &target);
1680 if (r < 0) {
1681 log_error("Failed to load rescue target: %s", bus_error_message(&error, r));
1682 goto finish;
1683 } else if (target->load_state == UNIT_ERROR || target->load_state == UNIT_NOT_FOUND) {
1684 log_error("Failed to load rescue target: %s", strerror(-target->load_error));
1685 goto finish;
1686 } else if (target->load_state == UNIT_MASKED) {
1687 log_error("Rescue target masked.");
1688 goto finish;
1689 }
1690 }
1691
1692 assert(target->load_state == UNIT_LOADED);
1693
1694 if (arg_action == ACTION_TEST) {
1695 printf("-> By units:\n");
1696 manager_dump_units(m, stdout, "\t");
1697 }
1698
1699 r = manager_add_job(m, JOB_START, target, JOB_ISOLATE, false, &error, &default_unit_job);
1700 if (r == -EPERM) {
1701 log_debug("Default target could not be isolated, starting instead: %s", bus_error_message(&error, r));
1702
1703 r = manager_add_job(m, JOB_START, target, JOB_REPLACE, false, &error, &default_unit_job);
1704 if (r < 0) {
1705 log_error("Failed to start default target: %s", bus_error_message(&error, r));
1706 goto finish;
1707 }
1708 } else if (r < 0) {
1709 log_error("Failed to isolate default target: %s", bus_error_message(&error, r));
1710 goto finish;
1711 }
1712
1713 m->default_unit_job_id = default_unit_job->id;
1714
1715 after_startup = now(CLOCK_MONOTONIC);
1716 log_full(arg_action == ACTION_TEST ? LOG_INFO : LOG_DEBUG,
1717 "Loaded units and determined initial transaction in %s.",
1718 format_timespan(timespan, sizeof(timespan), after_startup - before_startup, 0));
1719
1720 if (arg_action == ACTION_TEST) {
1721 printf("-> By jobs:\n");
1722 manager_dump_jobs(m, stdout, "\t");
1723 retval = EXIT_SUCCESS;
1724 goto finish;
1725 }
1726 }
1727
1728 for (;;) {
1729 r = manager_loop(m);
1730 if (r < 0) {
1731 log_error("Failed to run mainloop: %s", strerror(-r));
1732 goto finish;
1733 }
1734
1735 switch (m->exit_code) {
1736
1737 case MANAGER_EXIT:
1738 retval = EXIT_SUCCESS;
1739 log_debug("Exit.");
1740 goto finish;
1741
1742 case MANAGER_RELOAD:
1743 log_info("Reloading.");
1744 r = manager_reload(m);
1745 if (r < 0)
1746 log_error("Failed to reload: %s", strerror(-r));
1747 break;
1748
1749 case MANAGER_REEXECUTE:
1750
1751 if (prepare_reexecute(m, &arg_serialization, &fds, false) < 0)
1752 goto finish;
1753
1754 reexecute = true;
1755 log_notice("Reexecuting.");
1756 goto finish;
1757
1758 case MANAGER_SWITCH_ROOT:
1759 /* Steal the switch root parameters */
1760 switch_root_dir = m->switch_root;
1761 switch_root_init = m->switch_root_init;
1762 m->switch_root = m->switch_root_init = NULL;
1763
1764 if (!switch_root_init)
1765 if (prepare_reexecute(m, &arg_serialization, &fds, true) < 0)
1766 goto finish;
1767
1768 reexecute = true;
1769 log_notice("Switching root.");
1770 goto finish;
1771
1772 case MANAGER_REBOOT:
1773 case MANAGER_POWEROFF:
1774 case MANAGER_HALT:
1775 case MANAGER_KEXEC: {
1776 static const char * const table[_MANAGER_EXIT_CODE_MAX] = {
1777 [MANAGER_REBOOT] = "reboot",
1778 [MANAGER_POWEROFF] = "poweroff",
1779 [MANAGER_HALT] = "halt",
1780 [MANAGER_KEXEC] = "kexec"
1781 };
1782
1783 assert_se(shutdown_verb = table[m->exit_code]);
1784 arm_reboot_watchdog = m->exit_code == MANAGER_REBOOT;
1785
1786 log_notice("Shutting down.");
1787 goto finish;
1788 }
1789
1790 default:
1791 assert_not_reached("Unknown exit code.");
1792 }
1793 }
1794
1795 finish:
1796 pager_close();
1797
1798 if (m) {
1799 manager_free(m);
1800 m = NULL;
1801 }
1802
1803 for (j = 0; j < ELEMENTSOF(arg_default_rlimit); j++) {
1804 free(arg_default_rlimit[j]);
1805 arg_default_rlimit[j] = NULL;
1806 }
1807
1808 free(arg_default_unit);
1809 arg_default_unit = NULL;
1810
1811 free_join_controllers();
1812
1813 strv_free(arg_default_environment);
1814 arg_default_environment = NULL;
1815
1816 set_free(arg_syscall_archs);
1817 arg_syscall_archs = NULL;
1818
1819 label_finish();
1820
1821 if (reexecute) {
1822 const char **args;
1823 unsigned i, args_size;
1824 sigset_t ss;
1825
1826 /* Close and disarm the watchdog, so that the new
1827 * instance can reinitialize it, but doesn't get
1828 * rebooted while we do that */
1829 watchdog_close(true);
1830
1831 /* Reset the RLIMIT_NOFILE to the kernel default, so
1832 * that the new systemd can pass the kernel default to
1833 * its child processes */
1834 if (saved_rlimit_nofile.rlim_cur > 0)
1835 setrlimit(RLIMIT_NOFILE, &saved_rlimit_nofile);
1836
1837 if (switch_root_dir) {
1838 /* Kill all remaining processes from the
1839 * initrd, but don't wait for them, so that we
1840 * can handle the SIGCHLD for them after
1841 * deserializing. */
1842 broadcast_signal(SIGTERM, false, true);
1843
1844 /* And switch root */
1845 r = switch_root(switch_root_dir);
1846 if (r < 0)
1847 log_error("Failed to switch root, ignoring: %s", strerror(-r));
1848 }
1849
1850 args_size = MAX(6, argc+1);
1851 args = newa(const char*, args_size);
1852
1853 if (!switch_root_init) {
1854 char sfd[16];
1855
1856 /* First try to spawn ourselves with the right
1857 * path, and with full serialization. We do
1858 * this only if the user didn't specify an
1859 * explicit init to spawn. */
1860
1861 assert(arg_serialization);
1862 assert(fds);
1863
1864 snprintf(sfd, sizeof(sfd), "%i", fileno(arg_serialization));
1865 char_array_0(sfd);
1866
1867 i = 0;
1868 args[i++] = SYSTEMD_BINARY_PATH;
1869 if (switch_root_dir)
1870 args[i++] = "--switched-root";
1871 args[i++] = arg_running_as == SYSTEMD_SYSTEM ? "--system" : "--user";
1872 args[i++] = "--deserialize";
1873 args[i++] = sfd;
1874 args[i++] = NULL;
1875
1876 /* do not pass along the environment we inherit from the kernel or initrd */
1877 if (switch_root_dir)
1878 clearenv();
1879
1880 assert(i <= args_size);
1881 execv(args[0], (char* const*) args);
1882 }
1883
1884 /* Try the fallback, if there is any, without any
1885 * serialization. We pass the original argv[] and
1886 * envp[]. (Well, modulo the ordering changes due to
1887 * getopt() in argv[], and some cleanups in envp[],
1888 * but let's hope that doesn't matter.) */
1889
1890 if (arg_serialization) {
1891 fclose(arg_serialization);
1892 arg_serialization = NULL;
1893 }
1894
1895 if (fds) {
1896 fdset_free(fds);
1897 fds = NULL;
1898 }
1899
1900 /* Reopen the console */
1901 make_console_stdio();
1902
1903 for (j = 1, i = 1; j < (unsigned) argc; j++)
1904 args[i++] = argv[j];
1905 args[i++] = NULL;
1906 assert(i <= args_size);
1907
1908 /* reenable any blocked signals, especially important
1909 * if we switch from initial ramdisk to init=... */
1910 reset_all_signal_handlers();
1911
1912 assert_se(sigemptyset(&ss) == 0);
1913 assert_se(sigprocmask(SIG_SETMASK, &ss, NULL) == 0);
1914
1915 if (switch_root_init) {
1916 args[0] = switch_root_init;
1917 execv(args[0], (char* const*) args);
1918 log_warning("Failed to execute configured init, trying fallback: %m");
1919 }
1920
1921 args[0] = "/sbin/init";
1922 execv(args[0], (char* const*) args);
1923
1924 if (errno == ENOENT) {
1925 log_warning("No /sbin/init, trying fallback");
1926
1927 args[0] = "/bin/sh";
1928 args[1] = NULL;
1929 execv(args[0], (char* const*) args);
1930 log_error("Failed to execute /bin/sh, giving up: %m");
1931 } else
1932 log_warning("Failed to execute /sbin/init, giving up: %m");
1933 }
1934
1935 if (arg_serialization) {
1936 fclose(arg_serialization);
1937 arg_serialization = NULL;
1938 }
1939
1940 if (fds) {
1941 fdset_free(fds);
1942 fds = NULL;
1943 }
1944
1945 #ifdef HAVE_VALGRIND_VALGRIND_H
1946 /* If we are PID 1 and running under valgrind, then let's exit
1947 * here explicitly. valgrind will only generate nice output on
1948 * exit(), not on exec(), hence let's do the former not the
1949 * latter here. */
1950 if (getpid() == 1 && RUNNING_ON_VALGRIND)
1951 return 0;
1952 #endif
1953
1954 if (shutdown_verb) {
1955 char log_level[DECIMAL_STR_MAX(int) + 1];
1956 const char* command_line[9] = {
1957 SYSTEMD_SHUTDOWN_BINARY_PATH,
1958 shutdown_verb,
1959 "--log-level", log_level,
1960 "--log-target",
1961 };
1962 unsigned pos = 5;
1963 _cleanup_strv_free_ char **env_block = NULL;
1964
1965 assert(command_line[pos] == NULL);
1966 env_block = strv_copy(environ);
1967
1968 snprintf(log_level, sizeof(log_level), "%d", log_get_max_level());
1969
1970 switch (log_get_target()) {
1971 case LOG_TARGET_KMSG:
1972 case LOG_TARGET_JOURNAL_OR_KMSG:
1973 case LOG_TARGET_SYSLOG_OR_KMSG:
1974 command_line[pos++] = "kmsg";
1975 break;
1976
1977 case LOG_TARGET_CONSOLE:
1978 default:
1979 command_line[pos++] = "console";
1980 break;
1981 };
1982
1983 if (log_get_show_color())
1984 command_line[pos++] = "--log-color";
1985
1986 if (log_get_show_location())
1987 command_line[pos++] = "--log-location";
1988
1989 assert(pos < ELEMENTSOF(command_line));
1990
1991 if (arm_reboot_watchdog && arg_shutdown_watchdog > 0) {
1992 char *e;
1993
1994 /* If we reboot let's set the shutdown
1995 * watchdog and tell the shutdown binary to
1996 * repeatedly ping it */
1997 watchdog_set_timeout(&arg_shutdown_watchdog);
1998 watchdog_close(false);
1999
2000 /* Tell the binary how often to ping, ignore failure */
2001 if (asprintf(&e, "WATCHDOG_USEC="USEC_FMT, arg_shutdown_watchdog) > 0)
2002 strv_push(&env_block, e);
2003 } else
2004 watchdog_close(true);
2005
2006 /* Avoid the creation of new processes forked by the
2007 * kernel; at this point, we will not listen to the
2008 * signals anyway */
2009 if (detect_container(NULL) <= 0)
2010 cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER);
2011
2012 execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block);
2013 log_error("Failed to execute shutdown binary, %s: %m",
2014 getpid() == 1 ? "freezing" : "quitting");
2015 }
2016
2017 if (getpid() == 1)
2018 freeze();
2019
2020 return retval;
2021 }