1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
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.
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.
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/>.
28 #include <sys/mount.h>
29 #include <sys/prctl.h>
30 #include <sys/reboot.h>
36 #ifdef HAVE_VALGRIND_VALGRIND_H
37 #include <valgrind/valgrind.h>
40 #include "sd-daemon.h"
43 #include "alloc-util.h"
44 #include "architecture.h"
46 #include "bus-error.h"
48 #include "capability-util.h"
49 #include "clock-util.h"
50 #include "conf-parser.h"
51 #include "cpu-set-util.h"
52 #include "dbus-manager.h"
58 #include "formats-util.h"
60 #include "hostname-setup.h"
61 #include "ima-setup.h"
63 #include "kmod-setup.h"
64 #include "load-fragment.h"
66 #include "loopback-setup.h"
67 #include "machine-id-setup.h"
70 #include "mount-setup.h"
72 #include "parse-util.h"
73 #include "proc-cmdline.h"
74 #include "process-util.h"
75 #include "rlimit-util.h"
76 #include "selinux-setup.h"
77 #include "selinux-util.h"
78 #include "signal-util.h"
79 #include "smack-setup.h"
81 #include "stat-util.h"
82 #include "stdio-util.h"
84 #include "switch-root.h"
85 #include "terminal-util.h"
86 #include "user-util.h"
95 ACTION_DUMP_CONFIGURATION_ITEMS
,
97 } arg_action
= ACTION_RUN
;
98 static char *arg_default_unit
= NULL
;
99 static ManagerRunningAs arg_running_as
= _MANAGER_RUNNING_AS_INVALID
;
100 static bool arg_dump_core
= true;
101 static int arg_crash_chvt
= -1;
102 static bool arg_crash_shell
= false;
103 static bool arg_crash_reboot
= false;
104 static bool arg_confirm_spawn
= false;
105 static ShowStatus arg_show_status
= _SHOW_STATUS_UNSET
;
106 static bool arg_switched_root
= false;
107 static int arg_no_pager
= -1;
108 static char ***arg_join_controllers
= NULL
;
109 static ExecOutput arg_default_std_output
= EXEC_OUTPUT_JOURNAL
;
110 static ExecOutput arg_default_std_error
= EXEC_OUTPUT_INHERIT
;
111 static usec_t arg_default_restart_usec
= DEFAULT_RESTART_USEC
;
112 static usec_t arg_default_timeout_start_usec
= DEFAULT_TIMEOUT_USEC
;
113 static usec_t arg_default_timeout_stop_usec
= DEFAULT_TIMEOUT_USEC
;
114 static usec_t arg_default_start_limit_interval
= DEFAULT_START_LIMIT_INTERVAL
;
115 static unsigned arg_default_start_limit_burst
= DEFAULT_START_LIMIT_BURST
;
116 static usec_t arg_runtime_watchdog
= 0;
117 static usec_t arg_shutdown_watchdog
= 10 * USEC_PER_MINUTE
;
118 static char **arg_default_environment
= NULL
;
119 static struct rlimit
*arg_default_rlimit
[_RLIMIT_MAX
] = {};
120 static uint64_t arg_capability_bounding_set_drop
= 0;
121 static nsec_t arg_timer_slack_nsec
= NSEC_INFINITY
;
122 static usec_t arg_default_timer_accuracy_usec
= 1 * USEC_PER_MINUTE
;
123 static Set
* arg_syscall_archs
= NULL
;
124 static FILE* arg_serialization
= NULL
;
125 static bool arg_default_cpu_accounting
= false;
126 static bool arg_default_blockio_accounting
= false;
127 static bool arg_default_memory_accounting
= false;
128 static bool arg_default_tasks_accounting
= false;
130 static void pager_open_if_enabled(void) {
132 if (arg_no_pager
<= 0)
138 noreturn
static void freeze_or_reboot(void) {
140 if (arg_crash_reboot
) {
141 log_notice("Rebooting in 10s...");
144 log_notice("Rebooting now...");
145 (void) reboot(RB_AUTOBOOT
);
146 log_emergency_errno(errno
, "Failed to reboot: %m");
149 log_emergency("Freezing execution.");
153 noreturn
static void crash(int sig
) {
158 /* Pass this on immediately, if this is not PID 1 */
160 else if (!arg_dump_core
)
161 log_emergency("Caught <%s>, not dumping core.", signal_to_string(sig
));
163 sa
= (struct sigaction
) {
164 .sa_handler
= nop_signal_handler
,
165 .sa_flags
= SA_NOCLDSTOP
|SA_RESTART
,
168 /* We want to wait for the core process, hence let's enable SIGCHLD */
169 (void) sigaction(SIGCHLD
, &sa
, NULL
);
171 pid
= raw_clone(SIGCHLD
, NULL
);
173 log_emergency_errno(errno
, "Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig
));
176 .rlim_cur
= RLIM_INFINITY
,
177 .rlim_max
= RLIM_INFINITY
,
180 /* Enable default signal handler for core dump */
181 sa
= (struct sigaction
) {
182 .sa_handler
= SIG_DFL
,
184 (void) sigaction(sig
, &sa
, NULL
);
186 /* Don't limit the core dump size */
187 (void) setrlimit(RLIMIT_CORE
, &rl
);
189 /* Just to be sure... */
192 /* Raise the signal again */
194 (void) kill(pid
, sig
); /* raise() would kill the parent */
196 assert_not_reached("We shouldn't be here...");
202 /* Order things nicely. */
203 r
= wait_for_terminate(pid
, &status
);
205 log_emergency_errno(r
, "Caught <%s>, waitpid() failed: %m", signal_to_string(sig
));
206 else if (status
.si_code
!= CLD_DUMPED
)
207 log_emergency("Caught <%s>, core dump failed (child "PID_FMT
", code=%s, status=%i/%s).",
208 signal_to_string(sig
),
209 pid
, sigchld_code_to_string(status
.si_code
),
211 strna(status
.si_code
== CLD_EXITED
212 ? exit_status_to_string(status
.si_status
, EXIT_STATUS_FULL
)
213 : signal_to_string(status
.si_status
)));
215 log_emergency("Caught <%s>, dumped core as pid "PID_FMT
".", signal_to_string(sig
), pid
);
219 if (arg_crash_chvt
>= 0)
220 (void) chvt(arg_crash_chvt
);
222 sa
= (struct sigaction
) {
223 .sa_handler
= SIG_IGN
,
224 .sa_flags
= SA_NOCLDSTOP
|SA_NOCLDWAIT
|SA_RESTART
,
227 /* Let the kernel reap children for us */
228 (void) sigaction(SIGCHLD
, &sa
, NULL
);
230 if (arg_crash_shell
) {
231 log_notice("Executing crash shell in 10s...");
234 pid
= raw_clone(SIGCHLD
, NULL
);
236 log_emergency_errno(errno
, "Failed to fork off crash shell: %m");
239 (void) make_console_stdio();
240 (void) execle("/bin/sh", "/bin/sh", NULL
, environ
);
242 log_emergency_errno(errno
, "execle() failed: %m");
245 log_info("Spawned crash shell as PID "PID_FMT
".", pid
);
246 (void) wait_for_terminate(pid
, NULL
);
253 static void install_crash_handler(void) {
254 static const struct sigaction sa
= {
256 .sa_flags
= SA_NODEFER
, /* So that we can raise the signal again from the signal handler */
260 /* We ignore the return value here, since, we don't mind if we
261 * cannot set up a crash handler */
262 r
= sigaction_many(&sa
, SIGNALS_CRASH_HANDLER
, -1);
264 log_debug_errno(r
, "I had trouble setting up the crash handler, ignoring: %m");
267 static int console_setup(void) {
268 _cleanup_close_
int tty_fd
= -1;
271 tty_fd
= open_terminal("/dev/console", O_WRONLY
|O_NOCTTY
|O_CLOEXEC
);
273 return log_error_errno(tty_fd
, "Failed to open /dev/console: %m");
275 /* We don't want to force text mode. plymouth may be showing
276 * pictures already from initrd. */
277 r
= reset_terminal_fd(tty_fd
, false);
279 return log_error_errno(r
, "Failed to reset /dev/console: %m");
284 static int parse_crash_chvt(const char *value
) {
287 if (safe_atoi(value
, &arg_crash_chvt
) >= 0)
290 b
= parse_boolean(value
);
295 arg_crash_chvt
= 0; /* switch to where kmsg goes */
297 arg_crash_chvt
= -1; /* turn off switching */
302 static int parse_proc_cmdline_item(const char *key
, const char *value
) {
308 if (streq(key
, "systemd.unit") && value
) {
311 return free_and_strdup(&arg_default_unit
, value
);
313 } else if (streq(key
, "rd.systemd.unit") && value
) {
316 return free_and_strdup(&arg_default_unit
, value
);
318 } else if (streq(key
, "systemd.dump_core") && value
) {
320 r
= parse_boolean(value
);
322 log_warning("Failed to parse dump core switch %s. Ignoring.", value
);
326 } else if (streq(key
, "systemd.crash_chvt") && value
) {
328 if (parse_crash_chvt(value
) < 0)
329 log_warning("Failed to parse crash chvt switch %s. Ignoring.", value
);
331 } else if (streq(key
, "systemd.crash_shell") && value
) {
333 r
= parse_boolean(value
);
335 log_warning("Failed to parse crash shell switch %s. Ignoring.", value
);
339 } else if (streq(key
, "systemd.crash_reboot") && value
) {
341 r
= parse_boolean(value
);
343 log_warning("Failed to parse crash reboot switch %s. Ignoring.", value
);
345 arg_crash_reboot
= r
;
347 } else if (streq(key
, "systemd.confirm_spawn") && value
) {
349 r
= parse_boolean(value
);
351 log_warning("Failed to parse confirm spawn switch %s. Ignoring.", value
);
353 arg_confirm_spawn
= r
;
355 } else if (streq(key
, "systemd.show_status") && value
) {
357 r
= parse_show_status(value
, &arg_show_status
);
359 log_warning("Failed to parse show status switch %s. Ignoring.", value
);
361 } else if (streq(key
, "systemd.default_standard_output") && value
) {
363 r
= exec_output_from_string(value
);
365 log_warning("Failed to parse default standard output switch %s. Ignoring.", value
);
367 arg_default_std_output
= r
;
369 } else if (streq(key
, "systemd.default_standard_error") && value
) {
371 r
= exec_output_from_string(value
);
373 log_warning("Failed to parse default standard error switch %s. Ignoring.", value
);
375 arg_default_std_error
= r
;
377 } else if (streq(key
, "systemd.setenv") && value
) {
379 if (env_assignment_is_valid(value
)) {
382 env
= strv_env_set(arg_default_environment
, value
);
384 arg_default_environment
= env
;
386 log_warning_errno(ENOMEM
, "Setting environment variable '%s' failed, ignoring: %m", value
);
388 log_warning("Environment variable name '%s' is not valid. Ignoring.", value
);
390 } else if (streq(key
, "quiet") && !value
) {
392 if (arg_show_status
== _SHOW_STATUS_UNSET
)
393 arg_show_status
= SHOW_STATUS_AUTO
;
395 } else if (streq(key
, "debug") && !value
) {
397 /* Note that log_parse_environment() handles 'debug'
398 * too, and sets the log level to LOG_DEBUG. */
400 if (detect_container() > 0)
401 log_set_target(LOG_TARGET_CONSOLE
);
403 } else if (!in_initrd() && !value
) {
406 /* SysV compatibility */
407 target
= runlevel_to_target(key
);
409 return free_and_strdup(&arg_default_unit
, target
);
415 #define DEFINE_SETTER(name, func, descr) \
416 static int name(const char *unit, \
417 const char *filename, \
419 const char *section, \
420 unsigned section_line, \
421 const char *lvalue, \
423 const char *rvalue, \
435 log_syntax(unit, LOG_ERR, filename, line, r, \
436 "Invalid " descr "'%s': %m", \
442 DEFINE_SETTER(config_parse_level2
, log_set_max_level_from_string
, "log level")
443 DEFINE_SETTER(config_parse_target
, log_set_target_from_string
, "target")
444 DEFINE_SETTER(config_parse_color
, log_show_color_from_string
, "color" )
445 DEFINE_SETTER(config_parse_location
, log_show_location_from_string
, "location")
447 static int config_parse_cpu_affinity2(
449 const char *filename
,
452 unsigned section_line
,
459 _cleanup_cpu_free_ cpu_set_t
*c
= NULL
;
462 ncpus
= parse_cpu_set_and_warn(rvalue
, &c
, unit
, filename
, line
, lvalue
);
466 if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus
), c
) < 0)
467 log_warning("Failed to set CPU affinity: %m");
472 static int config_parse_show_status(
474 const char *filename
,
477 unsigned section_line
,
485 ShowStatus
*b
= data
;
492 k
= parse_show_status(rvalue
, b
);
494 log_syntax(unit
, LOG_ERR
, filename
, line
, k
, "Failed to parse show status setting, ignoring: %s", rvalue
);
501 static int config_parse_crash_chvt(
503 const char *filename
,
506 unsigned section_line
,
519 r
= parse_crash_chvt(rvalue
);
521 log_syntax(unit
, LOG_ERR
, filename
, line
, r
, "Failed to parse CrashChangeVT= setting, ignoring: %s", rvalue
);
528 static int config_parse_join_controllers(const char *unit
,
529 const char *filename
,
532 unsigned section_line
,
539 const char *whole_rvalue
= rvalue
;
546 arg_join_controllers
= strv_free_free(arg_join_controllers
);
549 _cleanup_free_
char *word
= NULL
;
553 r
= extract_first_word(&rvalue
, &word
, WHITESPACE
, EXTRACT_QUOTES
);
555 log_syntax(unit
, LOG_ERR
, filename
, line
, r
, "Invalid value for %s: %s", lvalue
, whole_rvalue
);
561 l
= strv_split(word
, ",");
566 if (strv_length(l
) <= 1) {
571 if (!arg_join_controllers
) {
572 arg_join_controllers
= new(char**, 2);
573 if (!arg_join_controllers
) {
578 arg_join_controllers
[0] = l
;
579 arg_join_controllers
[1] = NULL
;
586 t
= new0(char**, n
+2);
594 for (a
= arg_join_controllers
; *a
; a
++) {
596 if (strv_overlap(*a
, l
)) {
597 if (strv_extend_strv(&l
, *a
, false) < 0) {
617 t
[n
++] = strv_uniq(l
);
619 strv_free_free(arg_join_controllers
);
620 arg_join_controllers
= t
;
623 if (!isempty(rvalue
))
624 log_syntax(unit
, LOG_ERR
, filename
, line
, 0, "Trailing garbage, ignoring.");
629 static int parse_config_file(void) {
631 const ConfigTableItem items
[] = {
632 { "Manager", "LogLevel", config_parse_level2
, 0, NULL
},
633 { "Manager", "LogTarget", config_parse_target
, 0, NULL
},
634 { "Manager", "LogColor", config_parse_color
, 0, NULL
},
635 { "Manager", "LogLocation", config_parse_location
, 0, NULL
},
636 { "Manager", "DumpCore", config_parse_bool
, 0, &arg_dump_core
},
637 { "Manager", "CrashChVT", /* legacy */ config_parse_crash_chvt
, 0, NULL
},
638 { "Manager", "CrashChangeVT", config_parse_crash_chvt
, 0, NULL
},
639 { "Manager", "CrashShell", config_parse_bool
, 0, &arg_crash_shell
},
640 { "Manager", "CrashReboot", config_parse_bool
, 0, &arg_crash_reboot
},
641 { "Manager", "ShowStatus", config_parse_show_status
, 0, &arg_show_status
},
642 { "Manager", "CPUAffinity", config_parse_cpu_affinity2
, 0, NULL
},
643 { "Manager", "JoinControllers", config_parse_join_controllers
, 0, &arg_join_controllers
},
644 { "Manager", "RuntimeWatchdogSec", config_parse_sec
, 0, &arg_runtime_watchdog
},
645 { "Manager", "ShutdownWatchdogSec", config_parse_sec
, 0, &arg_shutdown_watchdog
},
646 { "Manager", "CapabilityBoundingSet", config_parse_bounding_set
, 0, &arg_capability_bounding_set_drop
},
648 { "Manager", "SystemCallArchitectures", config_parse_syscall_archs
, 0, &arg_syscall_archs
},
650 { "Manager", "TimerSlackNSec", config_parse_nsec
, 0, &arg_timer_slack_nsec
},
651 { "Manager", "DefaultTimerAccuracySec", config_parse_sec
, 0, &arg_default_timer_accuracy_usec
},
652 { "Manager", "DefaultStandardOutput", config_parse_output
, 0, &arg_default_std_output
},
653 { "Manager", "DefaultStandardError", config_parse_output
, 0, &arg_default_std_error
},
654 { "Manager", "DefaultTimeoutStartSec", config_parse_sec
, 0, &arg_default_timeout_start_usec
},
655 { "Manager", "DefaultTimeoutStopSec", config_parse_sec
, 0, &arg_default_timeout_stop_usec
},
656 { "Manager", "DefaultRestartSec", config_parse_sec
, 0, &arg_default_restart_usec
},
657 { "Manager", "DefaultStartLimitInterval", config_parse_sec
, 0, &arg_default_start_limit_interval
},
658 { "Manager", "DefaultStartLimitBurst", config_parse_unsigned
, 0, &arg_default_start_limit_burst
},
659 { "Manager", "DefaultEnvironment", config_parse_environ
, 0, &arg_default_environment
},
660 { "Manager", "DefaultLimitCPU", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_CPU
] },
661 { "Manager", "DefaultLimitFSIZE", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_FSIZE
] },
662 { "Manager", "DefaultLimitDATA", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_DATA
] },
663 { "Manager", "DefaultLimitSTACK", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_STACK
] },
664 { "Manager", "DefaultLimitCORE", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_CORE
] },
665 { "Manager", "DefaultLimitRSS", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_RSS
] },
666 { "Manager", "DefaultLimitNOFILE", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_NOFILE
] },
667 { "Manager", "DefaultLimitAS", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_AS
] },
668 { "Manager", "DefaultLimitNPROC", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_NPROC
] },
669 { "Manager", "DefaultLimitMEMLOCK", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_MEMLOCK
] },
670 { "Manager", "DefaultLimitLOCKS", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_LOCKS
] },
671 { "Manager", "DefaultLimitSIGPENDING", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_SIGPENDING
] },
672 { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_MSGQUEUE
] },
673 { "Manager", "DefaultLimitNICE", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_NICE
] },
674 { "Manager", "DefaultLimitRTPRIO", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_RTPRIO
] },
675 { "Manager", "DefaultLimitRTTIME", config_parse_limit
, 0, &arg_default_rlimit
[RLIMIT_RTTIME
] },
676 { "Manager", "DefaultCPUAccounting", config_parse_bool
, 0, &arg_default_cpu_accounting
},
677 { "Manager", "DefaultBlockIOAccounting", config_parse_bool
, 0, &arg_default_blockio_accounting
},
678 { "Manager", "DefaultMemoryAccounting", config_parse_bool
, 0, &arg_default_memory_accounting
},
679 { "Manager", "DefaultTasksAccounting", config_parse_bool
, 0, &arg_default_tasks_accounting
},
683 const char *fn
, *conf_dirs_nulstr
;
685 fn
= arg_running_as
== MANAGER_SYSTEM
? PKGSYSCONFDIR
"/system.conf" : PKGSYSCONFDIR
"/user.conf";
686 conf_dirs_nulstr
= arg_running_as
== MANAGER_SYSTEM
? CONF_DIRS_NULSTR("systemd/system.conf") : CONF_DIRS_NULSTR("systemd/user.conf");
687 config_parse_many(fn
, conf_dirs_nulstr
, "Manager\0",
688 config_item_table_lookup
, items
, false, NULL
);
693 static void manager_set_defaults(Manager
*m
) {
697 m
->default_timer_accuracy_usec
= arg_default_timer_accuracy_usec
;
698 m
->default_std_output
= arg_default_std_output
;
699 m
->default_std_error
= arg_default_std_error
;
700 m
->default_timeout_start_usec
= arg_default_timeout_start_usec
;
701 m
->default_timeout_stop_usec
= arg_default_timeout_stop_usec
;
702 m
->default_restart_usec
= arg_default_restart_usec
;
703 m
->default_start_limit_interval
= arg_default_start_limit_interval
;
704 m
->default_start_limit_burst
= arg_default_start_limit_burst
;
705 m
->default_cpu_accounting
= arg_default_cpu_accounting
;
706 m
->default_blockio_accounting
= arg_default_blockio_accounting
;
707 m
->default_memory_accounting
= arg_default_memory_accounting
;
708 m
->default_tasks_accounting
= arg_default_tasks_accounting
;
710 manager_set_default_rlimits(m
, arg_default_rlimit
);
711 manager_environment_add(m
, NULL
, arg_default_environment
);
714 static int parse_argv(int argc
, char *argv
[]) {
717 ARG_LOG_LEVEL
= 0x100,
727 ARG_DUMP_CONFIGURATION_ITEMS
,
736 ARG_DEFAULT_STD_OUTPUT
,
737 ARG_DEFAULT_STD_ERROR
740 static const struct option options
[] = {
741 { "log-level", required_argument
, NULL
, ARG_LOG_LEVEL
},
742 { "log-target", required_argument
, NULL
, ARG_LOG_TARGET
},
743 { "log-color", optional_argument
, NULL
, ARG_LOG_COLOR
},
744 { "log-location", optional_argument
, NULL
, ARG_LOG_LOCATION
},
745 { "unit", required_argument
, NULL
, ARG_UNIT
},
746 { "system", no_argument
, NULL
, ARG_SYSTEM
},
747 { "user", no_argument
, NULL
, ARG_USER
},
748 { "test", no_argument
, NULL
, ARG_TEST
},
749 { "no-pager", no_argument
, NULL
, ARG_NO_PAGER
},
750 { "help", no_argument
, NULL
, 'h' },
751 { "version", no_argument
, NULL
, ARG_VERSION
},
752 { "dump-configuration-items", no_argument
, NULL
, ARG_DUMP_CONFIGURATION_ITEMS
},
753 { "dump-core", optional_argument
, NULL
, ARG_DUMP_CORE
},
754 { "crash-chvt", required_argument
, NULL
, ARG_CRASH_CHVT
},
755 { "crash-shell", optional_argument
, NULL
, ARG_CRASH_SHELL
},
756 { "crash-reboot", optional_argument
, NULL
, ARG_CRASH_REBOOT
},
757 { "confirm-spawn", optional_argument
, NULL
, ARG_CONFIRM_SPAWN
},
758 { "show-status", optional_argument
, NULL
, ARG_SHOW_STATUS
},
759 { "deserialize", required_argument
, NULL
, ARG_DESERIALIZE
},
760 { "switched-root", no_argument
, NULL
, ARG_SWITCHED_ROOT
},
761 { "default-standard-output", required_argument
, NULL
, ARG_DEFAULT_STD_OUTPUT
, },
762 { "default-standard-error", required_argument
, NULL
, ARG_DEFAULT_STD_ERROR
, },
774 while ((c
= getopt_long(argc
, argv
, "hDbsz:", options
, NULL
)) >= 0)
779 r
= log_set_max_level_from_string(optarg
);
781 log_error("Failed to parse log level %s.", optarg
);
788 r
= log_set_target_from_string(optarg
);
790 log_error("Failed to parse log target %s.", optarg
);
799 r
= log_show_color_from_string(optarg
);
801 log_error("Failed to parse log color setting %s.", optarg
);
805 log_show_color(true);
809 case ARG_LOG_LOCATION
:
811 r
= log_show_location_from_string(optarg
);
813 log_error("Failed to parse log location setting %s.", optarg
);
817 log_show_location(true);
821 case ARG_DEFAULT_STD_OUTPUT
:
822 r
= exec_output_from_string(optarg
);
824 log_error("Failed to parse default standard output setting %s.", optarg
);
827 arg_default_std_output
= r
;
830 case ARG_DEFAULT_STD_ERROR
:
831 r
= exec_output_from_string(optarg
);
833 log_error("Failed to parse default standard error output setting %s.", optarg
);
836 arg_default_std_error
= r
;
841 r
= free_and_strdup(&arg_default_unit
, optarg
);
843 return log_error_errno(r
, "Failed to set default unit %s: %m", optarg
);
848 arg_running_as
= MANAGER_SYSTEM
;
852 arg_running_as
= MANAGER_USER
;
856 arg_action
= ACTION_TEST
;
857 if (arg_no_pager
< 0)
866 arg_action
= ACTION_VERSION
;
869 case ARG_DUMP_CONFIGURATION_ITEMS
:
870 arg_action
= ACTION_DUMP_CONFIGURATION_ITEMS
;
875 arg_dump_core
= true;
877 r
= parse_boolean(optarg
);
879 return log_error_errno(r
, "Failed to parse dump core boolean: %s", optarg
);
885 r
= parse_crash_chvt(optarg
);
887 return log_error_errno(r
, "Failed to parse crash virtual terminal index: %s", optarg
);
890 case ARG_CRASH_SHELL
:
892 arg_crash_shell
= true;
894 r
= parse_boolean(optarg
);
896 return log_error_errno(r
, "Failed to parse crash shell boolean: %s", optarg
);
901 case ARG_CRASH_REBOOT
:
903 arg_crash_reboot
= true;
905 r
= parse_boolean(optarg
);
907 return log_error_errno(r
, "Failed to parse crash shell boolean: %s", optarg
);
908 arg_crash_reboot
= r
;
912 case ARG_CONFIRM_SPAWN
:
913 r
= optarg
? parse_boolean(optarg
) : 1;
915 log_error("Failed to parse confirm spawn boolean %s.", optarg
);
918 arg_confirm_spawn
= r
;
921 case ARG_SHOW_STATUS
:
923 r
= parse_show_status(optarg
, &arg_show_status
);
925 log_error("Failed to parse show status boolean %s.", optarg
);
929 arg_show_status
= SHOW_STATUS_YES
;
932 case ARG_DESERIALIZE
: {
936 r
= safe_atoi(optarg
, &fd
);
937 if (r
< 0 || fd
< 0) {
938 log_error("Failed to parse deserialize option %s.", optarg
);
942 (void) fd_cloexec(fd
, true);
946 return log_error_errno(errno
, "Failed to open serialization fd: %m");
948 safe_fclose(arg_serialization
);
949 arg_serialization
= f
;
954 case ARG_SWITCHED_ROOT
:
955 arg_switched_root
= true;
959 arg_action
= ACTION_HELP
;
960 if (arg_no_pager
< 0)
965 log_set_max_level(LOG_DEBUG
);
971 /* Just to eat away the sysvinit kernel
972 * cmdline args without getopt() error
973 * messages that we'll parse in
974 * parse_proc_cmdline_word() or ignore. */
983 assert_not_reached("Unhandled option code.");
986 if (optind
< argc
&& getpid() != 1) {
987 /* Hmm, when we aren't run as init system
988 * let's complain about excess arguments */
990 log_error("Excess arguments.");
997 static int help(void) {
999 printf("%s [OPTIONS...]\n\n"
1000 "Starts up and maintains the system or user services.\n\n"
1001 " -h --help Show this help\n"
1002 " --test Determine startup sequence, dump it and exit\n"
1003 " --no-pager Do not pipe output into a pager\n"
1004 " --dump-configuration-items Dump understood unit configuration items\n"
1005 " --unit=UNIT Set default unit\n"
1006 " --system Run a system instance, even if PID != 1\n"
1007 " --user Run a user instance\n"
1008 " --dump-core[=BOOL] Dump core on crash\n"
1009 " --crash-vt=NR Change to specified VT on crash\n"
1010 " --crash-reboot[=BOOL] Reboot on crash\n"
1011 " --crash-shell[=BOOL] Run shell on crash\n"
1012 " --confirm-spawn[=BOOL] Ask for confirmation when spawning processes\n"
1013 " --show-status[=BOOL] Show status updates on the console during bootup\n"
1014 " --log-target=TARGET Set log target (console, journal, kmsg, journal-or-kmsg, null)\n"
1015 " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
1016 " --log-color[=BOOL] Highlight important log messages\n"
1017 " --log-location[=BOOL] Include code location in log messages\n"
1018 " --default-standard-output= Set default standard output for services\n"
1019 " --default-standard-error= Set default standard error output for services\n",
1020 program_invocation_short_name
);
1025 static int prepare_reexecute(Manager
*m
, FILE **_f
, FDSet
**_fds
, bool switching_root
) {
1026 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
1027 _cleanup_fclose_
FILE *f
= NULL
;
1034 r
= manager_open_serialization(m
, &f
);
1036 return log_error_errno(r
, "Failed to create serialization file: %m");
1038 /* Make sure nothing is really destructed when we shut down */
1040 bus_manager_send_reloading(m
, true);
1046 r
= manager_serialize(m
, f
, fds
, switching_root
);
1048 return log_error_errno(r
, "Failed to serialize state: %m");
1050 if (fseeko(f
, 0, SEEK_SET
) == (off_t
) -1)
1051 return log_error_errno(errno
, "Failed to rewind serialization fd: %m");
1053 r
= fd_cloexec(fileno(f
), false);
1055 return log_error_errno(r
, "Failed to disable O_CLOEXEC for serialization: %m");
1057 r
= fdset_cloexec(fds
, false);
1059 return log_error_errno(r
, "Failed to disable O_CLOEXEC for serialization fds: %m");
1070 static int bump_rlimit_nofile(struct rlimit
*saved_rlimit
) {
1074 assert(saved_rlimit
);
1076 /* Save the original RLIMIT_NOFILE so that we can reset it
1077 * later when transitioning from the initrd to the main
1078 * systemd or suchlike. */
1079 if (getrlimit(RLIMIT_NOFILE
, saved_rlimit
) < 0)
1080 return log_error_errno(errno
, "Reading RLIMIT_NOFILE failed: %m");
1082 /* Make sure forked processes get the default kernel setting */
1083 if (!arg_default_rlimit
[RLIMIT_NOFILE
]) {
1086 rl
= newdup(struct rlimit
, saved_rlimit
, 1);
1090 arg_default_rlimit
[RLIMIT_NOFILE
] = rl
;
1093 /* Bump up the resource limit for ourselves substantially */
1094 nl
.rlim_cur
= nl
.rlim_max
= 64*1024;
1095 r
= setrlimit_closest(RLIMIT_NOFILE
, &nl
);
1097 return log_error_errno(r
, "Setting RLIMIT_NOFILE failed: %m");
1102 static void test_usr(void) {
1104 /* Check that /usr is not a separate fs */
1106 if (dir_is_empty("/usr") <= 0)
1109 log_warning("/usr appears to be on its own filesystem and is not already mounted. This is not a supported setup. "
1110 "Some things will probably break (sometimes even silently) in mysterious ways. "
1111 "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
1114 static int initialize_join_controllers(void) {
1115 /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
1116 * + "net_prio". We'd like to add "cpuset" to the mix, but
1117 * "cpuset" doesn't really work for groups with no initialized
1120 arg_join_controllers
= new(char**, 3);
1121 if (!arg_join_controllers
)
1124 arg_join_controllers
[0] = strv_new("cpu", "cpuacct", NULL
);
1125 if (!arg_join_controllers
[0])
1128 arg_join_controllers
[1] = strv_new("net_cls", "net_prio", NULL
);
1129 if (!arg_join_controllers
[1])
1132 arg_join_controllers
[2] = NULL
;
1136 arg_join_controllers
= strv_free_free(arg_join_controllers
);
1140 static int enforce_syscall_archs(Set
*archs
) {
1142 scmp_filter_ctx
*seccomp
;
1147 seccomp
= seccomp_init(SCMP_ACT_ALLOW
);
1151 SET_FOREACH(id
, arg_syscall_archs
, i
) {
1152 r
= seccomp_arch_add(seccomp
, PTR_TO_UINT32(id
) - 1);
1156 log_error_errno(r
, "Failed to add architecture to seccomp: %m");
1161 r
= seccomp_attr_set(seccomp
, SCMP_FLTATR_CTL_NNP
, 0);
1163 log_error_errno(r
, "Failed to unset NO_NEW_PRIVS: %m");
1167 r
= seccomp_load(seccomp
);
1169 log_error_errno(r
, "Failed to add install architecture seccomp: %m");
1172 seccomp_release(seccomp
);
1179 static int status_welcome(void) {
1180 _cleanup_free_
char *pretty_name
= NULL
, *ansi_color
= NULL
;
1183 r
= parse_env_file("/etc/os-release", NEWLINE
,
1184 "PRETTY_NAME", &pretty_name
,
1185 "ANSI_COLOR", &ansi_color
,
1188 r
= parse_env_file("/usr/lib/os-release", NEWLINE
,
1189 "PRETTY_NAME", &pretty_name
,
1190 "ANSI_COLOR", &ansi_color
,
1193 if (r
< 0 && r
!= -ENOENT
)
1194 log_warning_errno(r
, "Failed to read os-release file: %m");
1196 return status_printf(NULL
, false, false,
1197 "\nWelcome to \x1B[%sm%s\x1B[0m!\n",
1198 isempty(ansi_color
) ? "1" : ansi_color
,
1199 isempty(pretty_name
) ? "Linux" : pretty_name
);
1202 static int write_container_id(void) {
1206 c
= getenv("container");
1210 r
= write_string_file("/run/systemd/container", c
, WRITE_STRING_FILE_CREATE
);
1212 return log_warning_errno(r
, "Failed to write /run/systemd/container, ignoring: %m");
1217 static int bump_unix_max_dgram_qlen(void) {
1218 _cleanup_free_
char *qlen
= NULL
;
1222 /* Let's bump the net.unix.max_dgram_qlen sysctl. The kernel
1223 * default of 16 is simply too low. We set the value really
1224 * really early during boot, so that it is actually applied to
1225 * all our sockets, including the $NOTIFY_SOCKET one. */
1227 r
= read_one_line_file("/proc/sys/net/unix/max_dgram_qlen", &qlen
);
1229 return log_warning_errno(r
, "Failed to read AF_UNIX datagram queue length, ignoring: %m");
1231 r
= safe_atolu(qlen
, &v
);
1233 return log_warning_errno(r
, "Failed to parse AF_UNIX datagram queue length, ignoring: %m");
1235 if (v
>= DEFAULT_UNIX_MAX_DGRAM_QLEN
)
1239 if (asprintf(&qlen
, "%lu\n", DEFAULT_UNIX_MAX_DGRAM_QLEN
) < 0)
1242 r
= write_string_file("/proc/sys/net/unix/max_dgram_qlen", qlen
, 0);
1244 return log_full_errno(IN_SET(r
, -EROFS
, -EPERM
, -EACCES
) ? LOG_DEBUG
: LOG_WARNING
, r
,
1245 "Failed to bump AF_UNIX datagram queue length, ignoring: %m");
1250 int main(int argc
, char *argv
[]) {
1252 int r
, retval
= EXIT_FAILURE
;
1253 usec_t before_startup
, after_startup
;
1254 char timespan
[FORMAT_TIMESPAN_MAX
];
1256 bool reexecute
= false;
1257 const char *shutdown_verb
= NULL
;
1258 dual_timestamp initrd_timestamp
= DUAL_TIMESTAMP_NULL
;
1259 dual_timestamp userspace_timestamp
= DUAL_TIMESTAMP_NULL
;
1260 dual_timestamp kernel_timestamp
= DUAL_TIMESTAMP_NULL
;
1261 dual_timestamp security_start_timestamp
= DUAL_TIMESTAMP_NULL
;
1262 dual_timestamp security_finish_timestamp
= DUAL_TIMESTAMP_NULL
;
1263 static char systemd
[] = "systemd";
1264 bool skip_setup
= false;
1266 bool loaded_policy
= false;
1267 bool arm_reboot_watchdog
= false;
1268 bool queue_default_job
= false;
1269 bool empty_etc
= false;
1270 char *switch_root_dir
= NULL
, *switch_root_init
= NULL
;
1271 struct rlimit saved_rlimit_nofile
= RLIMIT_MAKE_CONST(0);
1272 const char *error_message
= NULL
;
1274 #ifdef HAVE_SYSV_COMPAT
1275 if (getpid() != 1 && strstr(program_invocation_short_name
, "init")) {
1276 /* This is compatibility support for SysV, where
1277 * calling init as a user is identical to telinit. */
1280 execv(SYSTEMCTL_BINARY_PATH
, argv
);
1281 log_error_errno(errno
, "Failed to exec " SYSTEMCTL_BINARY_PATH
": %m");
1286 dual_timestamp_from_monotonic(&kernel_timestamp
, 0);
1287 dual_timestamp_get(&userspace_timestamp
);
1289 /* Determine if this is a reexecution or normal bootup. We do
1290 * the full command line parsing much later, so let's just
1291 * have a quick peek here. */
1292 if (strv_find(argv
+1, "--deserialize"))
1295 /* If we have switched root, do all the special setup
1297 if (strv_find(argv
+1, "--switched-root"))
1300 /* If we get started via the /sbin/init symlink then we are
1301 called 'init'. After a subsequent reexecution we are then
1302 called 'systemd'. That is confusing, hence let's call us
1303 systemd right-away. */
1304 program_invocation_short_name
= systemd
;
1305 prctl(PR_SET_NAME
, systemd
);
1310 log_show_color(isatty(STDERR_FILENO
) > 0);
1311 log_set_upgrade_syslog_to_journal(true);
1313 /* Disable the umask logic */
1317 if (getpid() == 1 && detect_container() <= 0) {
1319 /* Running outside of a container as PID 1 */
1320 arg_running_as
= MANAGER_SYSTEM
;
1322 log_set_target(LOG_TARGET_KMSG
);
1326 initrd_timestamp
= userspace_timestamp
;
1329 mount_setup_early();
1330 dual_timestamp_get(&security_start_timestamp
);
1331 if (mac_selinux_setup(&loaded_policy
) < 0) {
1332 error_message
= "Failed to load SELinux policy";
1334 } else if (ima_setup() < 0) {
1335 error_message
= "Failed to load IMA policy";
1337 } else if (mac_smack_setup(&loaded_policy
) < 0) {
1338 error_message
= "Failed to load SMACK policy";
1341 dual_timestamp_get(&security_finish_timestamp
);
1344 if (mac_selinux_init(NULL
) < 0) {
1345 error_message
= "Failed to initialize SELinux policy";
1350 if (clock_is_localtime() > 0) {
1354 * The very first call of settimeofday() also does a time warp in the kernel.
1356 * In the rtc-in-local time mode, we set the kernel's timezone, and rely on
1357 * external tools to take care of maintaining the RTC and do all adjustments.
1358 * This matches the behavior of Windows, which leaves the RTC alone if the
1359 * registry tells that the RTC runs in UTC.
1361 r
= clock_set_timezone(&min
);
1363 log_error_errno(r
, "Failed to apply local time delta, ignoring: %m");
1365 log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min
);
1366 } else if (!in_initrd()) {
1368 * Do a dummy very first call to seal the kernel's time warp magic.
1370 * Do not call this this from inside the initrd. The initrd might not
1371 * carry /etc/adjtime with LOCAL, but the real system could be set up
1372 * that way. In such case, we need to delay the time-warp or the sealing
1373 * until we reach the real system.
1375 * Do no set the kernel's timezone. The concept of local time cannot
1376 * be supported reliably, the time will jump or be incorrect at every daylight
1377 * saving time change. All kernel local time concepts will be treated
1380 clock_reset_timewarp();
1384 /* Set the default for later on, but don't actually
1385 * open the logs like this for now. Note that if we
1386 * are transitioning from the initrd there might still
1387 * be journal fd open, and we shouldn't attempt
1388 * opening that before we parsed /proc/cmdline which
1389 * might redirect output elsewhere. */
1390 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG
);
1392 } else if (getpid() == 1) {
1393 /* Running inside a container, as PID 1 */
1394 arg_running_as
= MANAGER_SYSTEM
;
1395 log_set_target(LOG_TARGET_CONSOLE
);
1396 log_close_console(); /* force reopen of /dev/console */
1399 /* For the later on, see above... */
1400 log_set_target(LOG_TARGET_JOURNAL
);
1402 /* clear the kernel timestamp,
1403 * because we are in a container */
1404 kernel_timestamp
.monotonic
= 0ULL;
1405 kernel_timestamp
.realtime
= 0ULL;
1408 /* Running as user instance */
1409 arg_running_as
= MANAGER_USER
;
1410 log_set_target(LOG_TARGET_AUTO
);
1413 /* clear the kernel timestamp,
1414 * because we are not PID 1 */
1415 kernel_timestamp
= DUAL_TIMESTAMP_NULL
;
1418 /* Initialize default unit */
1419 r
= free_and_strdup(&arg_default_unit
, SPECIAL_DEFAULT_TARGET
);
1421 log_emergency_errno(r
, "Failed to set default unit %s: %m", SPECIAL_DEFAULT_TARGET
);
1422 error_message
= "Failed to set default unit";
1426 r
= initialize_join_controllers();
1428 error_message
= "Failed to initialize cgroup controllers";
1432 /* Mount /proc, /sys and friends, so that /proc/cmdline and
1433 * /proc/$PID/fd is available. */
1434 if (getpid() == 1) {
1436 /* Load the kernel modules early, so that we kdbus.ko is loaded before kdbusfs shall be mounted */
1440 r
= mount_setup(loaded_policy
);
1442 error_message
= "Failed to mount API filesystems";
1447 /* Reset all signal handlers. */
1448 (void) reset_all_signal_handlers();
1449 (void) ignore_signals(SIGNALS_IGNORE
, -1);
1451 if (parse_config_file() < 0) {
1452 error_message
= "Failed to parse config file";
1456 if (arg_running_as
== MANAGER_SYSTEM
) {
1457 r
= parse_proc_cmdline(parse_proc_cmdline_item
);
1459 log_warning_errno(r
, "Failed to parse kernel command line, ignoring: %m");
1462 /* Note that this also parses bits from the kernel command
1463 * line, including "debug". */
1464 log_parse_environment();
1466 if (parse_argv(argc
, argv
) < 0) {
1467 error_message
= "Failed to parse commandline arguments";
1471 if (arg_action
== ACTION_TEST
&&
1473 log_error("Don't run test mode as root.");
1477 if (arg_running_as
== MANAGER_USER
&&
1478 arg_action
== ACTION_RUN
&&
1480 log_error("Trying to run as user instance, but the system has not been booted with systemd.");
1484 if (arg_running_as
== MANAGER_SYSTEM
&&
1485 arg_action
== ACTION_RUN
&&
1486 running_in_chroot() > 0) {
1487 log_error("Cannot be run in a chroot() environment.");
1491 if (arg_action
== ACTION_TEST
)
1494 pager_open_if_enabled();
1496 if (arg_action
== ACTION_HELP
) {
1499 } else if (arg_action
== ACTION_VERSION
) {
1502 } else if (arg_action
== ACTION_DUMP_CONFIGURATION_ITEMS
) {
1503 unit_dump_config_items(stdout
);
1504 retval
= EXIT_SUCCESS
;
1506 } else if (arg_action
== ACTION_DONE
) {
1507 retval
= EXIT_SUCCESS
;
1511 if (arg_running_as
== MANAGER_USER
&&
1512 !getenv("XDG_RUNTIME_DIR")) {
1513 log_error("Trying to run as user instance, but $XDG_RUNTIME_DIR is not set.");
1517 assert_se(arg_action
== ACTION_RUN
|| arg_action
== ACTION_TEST
);
1519 /* Close logging fds, in order not to confuse fdset below */
1522 /* Remember open file descriptors for later deserialization */
1523 r
= fdset_new_fill(&fds
);
1525 log_emergency_errno(r
, "Failed to allocate fd set: %m");
1526 error_message
= "Failed to allocate fd set";
1529 fdset_cloexec(fds
, true);
1531 if (arg_serialization
)
1532 assert_se(fdset_remove(fds
, fileno(arg_serialization
)) >= 0);
1534 if (arg_running_as
== MANAGER_SYSTEM
)
1535 /* Become a session leader if we aren't one yet. */
1538 /* Move out of the way, so that we won't block unmounts */
1539 assert_se(chdir("/") == 0);
1541 /* Reset the console, but only if this is really init and we
1542 * are freshly booted */
1543 if (arg_running_as
== MANAGER_SYSTEM
&& arg_action
== ACTION_RUN
) {
1545 /* If we are init, we connect stdin/stdout/stderr to
1546 * /dev/null and make sure we don't have a controlling
1550 if (getpid() == 1 && !skip_setup
)
1554 /* Open the logging devices, if possible and necessary */
1557 if (arg_show_status
== _SHOW_STATUS_UNSET
)
1558 arg_show_status
= SHOW_STATUS_YES
;
1560 /* Make sure we leave a core dump without panicing the
1562 if (getpid() == 1) {
1563 install_crash_handler();
1565 r
= mount_cgroup_controllers(arg_join_controllers
);
1570 if (arg_running_as
== MANAGER_SYSTEM
) {
1573 log_info(PACKAGE_STRING
" running in %ssystem mode. (" SYSTEMD_FEATURES
")",
1574 arg_action
== ACTION_TEST
? "test " : "" );
1576 v
= detect_virtualization();
1578 log_info("Detected virtualization %s.", virtualization_to_string(v
));
1580 write_container_id();
1582 log_info("Detected architecture %s.", architecture_to_string(uname_architecture()));
1585 log_info("Running in initial RAM disk.");
1587 /* Let's check whether /etc is already populated. We
1588 * don't actually really check for that, but use
1589 * /etc/machine-id as flag file. This allows container
1590 * managers and installers to provision a couple of
1591 * files already. If the container manager wants to
1592 * provision the machine ID itself it should pass
1593 * $container_uuid to PID 1. */
1595 empty_etc
= access("/etc/machine-id", F_OK
) < 0;
1597 log_info("Running with unpopulated /etc.");
1599 _cleanup_free_
char *t
;
1601 t
= uid_to_name(getuid());
1602 log_debug(PACKAGE_STRING
" running in %suser mode for user "UID_FMT
"/%s. (" SYSTEMD_FEATURES
")",
1603 arg_action
== ACTION_TEST
? " test" : "", getuid(), t
);
1606 if (arg_running_as
== MANAGER_SYSTEM
&& !skip_setup
) {
1607 if (arg_show_status
> 0)
1611 machine_id_setup(NULL
);
1613 bump_unix_max_dgram_qlen();
1618 if (arg_running_as
== MANAGER_SYSTEM
&& arg_runtime_watchdog
> 0)
1619 watchdog_set_timeout(&arg_runtime_watchdog
);
1621 if (arg_timer_slack_nsec
!= NSEC_INFINITY
)
1622 if (prctl(PR_SET_TIMERSLACK
, arg_timer_slack_nsec
) < 0)
1623 log_error_errno(errno
, "Failed to adjust timer slack: %m");
1625 if (arg_capability_bounding_set_drop
) {
1626 r
= capability_bounding_set_drop_usermode(arg_capability_bounding_set_drop
);
1628 log_emergency_errno(r
, "Failed to drop capability bounding set of usermode helpers: %m");
1629 error_message
= "Failed to drop capability bounding set of usermode helpers";
1632 r
= capability_bounding_set_drop(arg_capability_bounding_set_drop
, true);
1634 log_emergency_errno(r
, "Failed to drop capability bounding set: %m");
1635 error_message
= "Failed to drop capability bounding set";
1640 if (arg_syscall_archs
) {
1641 r
= enforce_syscall_archs(arg_syscall_archs
);
1643 error_message
= "Failed to set syscall architectures";
1648 if (arg_running_as
== MANAGER_USER
)
1649 /* Become reaper of our children */
1650 if (prctl(PR_SET_CHILD_SUBREAPER
, 1) < 0)
1651 log_warning_errno(errno
, "Failed to make us a subreaper: %m");
1653 if (arg_running_as
== MANAGER_SYSTEM
) {
1654 bump_rlimit_nofile(&saved_rlimit_nofile
);
1657 r
= unit_file_preset_all(UNIT_FILE_SYSTEM
, false, NULL
, UNIT_FILE_PRESET_ENABLE_ONLY
, false, NULL
, 0);
1659 log_warning_errno(r
, "Failed to populate /etc with preset unit settings, ignoring: %m");
1661 log_info("Populated /etc with preset unit settings.");
1665 r
= manager_new(arg_running_as
, arg_action
== ACTION_TEST
, &m
);
1667 log_emergency_errno(r
, "Failed to allocate manager object: %m");
1668 error_message
= "Failed to allocate manager object";
1672 m
->confirm_spawn
= arg_confirm_spawn
;
1673 m
->runtime_watchdog
= arg_runtime_watchdog
;
1674 m
->shutdown_watchdog
= arg_shutdown_watchdog
;
1675 m
->userspace_timestamp
= userspace_timestamp
;
1676 m
->kernel_timestamp
= kernel_timestamp
;
1677 m
->initrd_timestamp
= initrd_timestamp
;
1678 m
->security_start_timestamp
= security_start_timestamp
;
1679 m
->security_finish_timestamp
= security_finish_timestamp
;
1681 manager_set_defaults(m
);
1682 manager_set_show_status(m
, arg_show_status
);
1683 manager_set_first_boot(m
, empty_etc
);
1685 /* Remember whether we should queue the default job */
1686 queue_default_job
= !arg_serialization
|| arg_switched_root
;
1688 before_startup
= now(CLOCK_MONOTONIC
);
1690 r
= manager_startup(m
, arg_serialization
, fds
);
1692 log_error_errno(r
, "Failed to fully start up daemon: %m");
1694 /* This will close all file descriptors that were opened, but
1695 * not claimed by any unit. */
1696 fds
= fdset_free(fds
);
1698 arg_serialization
= safe_fclose(arg_serialization
);
1700 if (queue_default_job
) {
1701 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1702 Unit
*target
= NULL
;
1703 Job
*default_unit_job
;
1705 log_debug("Activating default unit: %s", arg_default_unit
);
1707 r
= manager_load_unit(m
, arg_default_unit
, NULL
, &error
, &target
);
1709 log_error("Failed to load default target: %s", bus_error_message(&error
, r
));
1710 else if (target
->load_state
== UNIT_ERROR
|| target
->load_state
== UNIT_NOT_FOUND
)
1711 log_error_errno(target
->load_error
, "Failed to load default target: %m");
1712 else if (target
->load_state
== UNIT_MASKED
)
1713 log_error("Default target masked.");
1715 if (!target
|| target
->load_state
!= UNIT_LOADED
) {
1716 log_info("Trying to load rescue target...");
1718 r
= manager_load_unit(m
, SPECIAL_RESCUE_TARGET
, NULL
, &error
, &target
);
1720 log_emergency("Failed to load rescue target: %s", bus_error_message(&error
, r
));
1721 error_message
= "Failed to load rescue target";
1723 } else if (target
->load_state
== UNIT_ERROR
|| target
->load_state
== UNIT_NOT_FOUND
) {
1724 log_emergency_errno(target
->load_error
, "Failed to load rescue target: %m");
1725 error_message
= "Failed to load rescue target";
1727 } else if (target
->load_state
== UNIT_MASKED
) {
1728 log_emergency("Rescue target masked.");
1729 error_message
= "Rescue target masked";
1734 assert(target
->load_state
== UNIT_LOADED
);
1736 if (arg_action
== ACTION_TEST
) {
1737 printf("-> By units:\n");
1738 manager_dump_units(m
, stdout
, "\t");
1741 r
= manager_add_job(m
, JOB_START
, target
, JOB_ISOLATE
, false, &error
, &default_unit_job
);
1743 log_debug("Default target could not be isolated, starting instead: %s", bus_error_message(&error
, r
));
1745 r
= manager_add_job(m
, JOB_START
, target
, JOB_REPLACE
, false, &error
, &default_unit_job
);
1747 log_emergency("Failed to start default target: %s", bus_error_message(&error
, r
));
1748 error_message
= "Failed to start default target";
1752 log_emergency("Failed to isolate default target: %s", bus_error_message(&error
, r
));
1753 error_message
= "Failed to isolate default target";
1757 m
->default_unit_job_id
= default_unit_job
->id
;
1759 after_startup
= now(CLOCK_MONOTONIC
);
1760 log_full(arg_action
== ACTION_TEST
? LOG_INFO
: LOG_DEBUG
,
1761 "Loaded units and determined initial transaction in %s.",
1762 format_timespan(timespan
, sizeof(timespan
), after_startup
- before_startup
, 100 * USEC_PER_MSEC
));
1764 if (arg_action
== ACTION_TEST
) {
1765 printf("-> By jobs:\n");
1766 manager_dump_jobs(m
, stdout
, "\t");
1767 retval
= EXIT_SUCCESS
;
1773 r
= manager_loop(m
);
1775 log_emergency_errno(r
, "Failed to run main loop: %m");
1776 error_message
= "Failed to run main loop";
1780 switch (m
->exit_code
) {
1782 case MANAGER_RELOAD
:
1783 log_info("Reloading.");
1785 r
= parse_config_file();
1787 log_error("Failed to parse config file.");
1789 manager_set_defaults(m
);
1791 r
= manager_reload(m
);
1793 log_error_errno(r
, "Failed to reload: %m");
1796 case MANAGER_REEXECUTE
:
1798 if (prepare_reexecute(m
, &arg_serialization
, &fds
, false) < 0) {
1799 error_message
= "Failed to prepare for reexecution";
1804 log_notice("Reexecuting.");
1807 case MANAGER_SWITCH_ROOT
:
1808 /* Steal the switch root parameters */
1809 switch_root_dir
= m
->switch_root
;
1810 switch_root_init
= m
->switch_root_init
;
1811 m
->switch_root
= m
->switch_root_init
= NULL
;
1813 if (!switch_root_init
)
1814 if (prepare_reexecute(m
, &arg_serialization
, &fds
, true) < 0) {
1815 error_message
= "Failed to prepare for reexecution";
1820 log_notice("Switching root.");
1824 retval
= m
->return_value
;
1826 if (m
->running_as
== MANAGER_USER
) {
1832 case MANAGER_REBOOT
:
1833 case MANAGER_POWEROFF
:
1835 case MANAGER_KEXEC
: {
1836 static const char * const table
[_MANAGER_EXIT_CODE_MAX
] = {
1837 [MANAGER_EXIT
] = "exit",
1838 [MANAGER_REBOOT
] = "reboot",
1839 [MANAGER_POWEROFF
] = "poweroff",
1840 [MANAGER_HALT
] = "halt",
1841 [MANAGER_KEXEC
] = "kexec"
1844 assert_se(shutdown_verb
= table
[m
->exit_code
]);
1845 arm_reboot_watchdog
= m
->exit_code
== MANAGER_REBOOT
;
1847 log_notice("Shutting down.");
1852 assert_not_reached("Unknown exit code.");
1860 arg_shutdown_watchdog
= m
->shutdown_watchdog
;
1862 m
= manager_free(m
);
1864 for (j
= 0; j
< ELEMENTSOF(arg_default_rlimit
); j
++)
1865 arg_default_rlimit
[j
] = mfree(arg_default_rlimit
[j
]);
1867 arg_default_unit
= mfree(arg_default_unit
);
1868 arg_join_controllers
= strv_free_free(arg_join_controllers
);
1869 arg_default_environment
= strv_free(arg_default_environment
);
1870 arg_syscall_archs
= set_free(arg_syscall_archs
);
1872 mac_selinux_finish();
1876 unsigned i
, args_size
;
1878 /* Close and disarm the watchdog, so that the new
1879 * instance can reinitialize it, but doesn't get
1880 * rebooted while we do that */
1881 watchdog_close(true);
1883 /* Reset the RLIMIT_NOFILE to the kernel default, so
1884 * that the new systemd can pass the kernel default to
1885 * its child processes */
1886 if (saved_rlimit_nofile
.rlim_cur
> 0)
1887 (void) setrlimit(RLIMIT_NOFILE
, &saved_rlimit_nofile
);
1889 if (switch_root_dir
) {
1890 /* Kill all remaining processes from the
1891 * initrd, but don't wait for them, so that we
1892 * can handle the SIGCHLD for them after
1894 broadcast_signal(SIGTERM
, false, true);
1896 /* And switch root with MS_MOVE, because we remove the old directory afterwards and detach it. */
1897 r
= switch_root(switch_root_dir
, "/mnt", true, MS_MOVE
);
1899 log_error_errno(r
, "Failed to switch root, trying to continue: %m");
1902 args_size
= MAX(6, argc
+1);
1903 args
= newa(const char*, args_size
);
1905 if (!switch_root_init
) {
1906 char sfd
[DECIMAL_STR_MAX(int) + 1];
1908 /* First try to spawn ourselves with the right
1909 * path, and with full serialization. We do
1910 * this only if the user didn't specify an
1911 * explicit init to spawn. */
1913 assert(arg_serialization
);
1916 xsprintf(sfd
, "%i", fileno(arg_serialization
));
1919 args
[i
++] = SYSTEMD_BINARY_PATH
;
1920 if (switch_root_dir
)
1921 args
[i
++] = "--switched-root";
1922 args
[i
++] = arg_running_as
== MANAGER_SYSTEM
? "--system" : "--user";
1923 args
[i
++] = "--deserialize";
1927 /* do not pass along the environment we inherit from the kernel or initrd */
1928 if (switch_root_dir
)
1931 assert(i
<= args_size
);
1932 (void) execv(args
[0], (char* const*) args
);
1935 /* Try the fallback, if there is any, without any
1936 * serialization. We pass the original argv[] and
1937 * envp[]. (Well, modulo the ordering changes due to
1938 * getopt() in argv[], and some cleanups in envp[],
1939 * but let's hope that doesn't matter.) */
1941 arg_serialization
= safe_fclose(arg_serialization
);
1942 fds
= fdset_free(fds
);
1944 /* Reopen the console */
1945 (void) make_console_stdio();
1947 for (j
= 1, i
= 1; j
< (unsigned) argc
; j
++)
1948 args
[i
++] = argv
[j
];
1950 assert(i
<= args_size
);
1952 /* Reenable any blocked signals, especially important
1953 * if we switch from initial ramdisk to init=... */
1954 (void) reset_all_signal_handlers();
1955 (void) reset_signal_mask();
1957 if (switch_root_init
) {
1958 args
[0] = switch_root_init
;
1959 (void) execv(args
[0], (char* const*) args
);
1960 log_warning_errno(errno
, "Failed to execute configured init, trying fallback: %m");
1963 args
[0] = "/sbin/init";
1964 (void) execv(args
[0], (char* const*) args
);
1966 if (errno
== ENOENT
) {
1967 log_warning("No /sbin/init, trying fallback");
1969 args
[0] = "/bin/sh";
1971 (void) execv(args
[0], (char* const*) args
);
1972 log_error_errno(errno
, "Failed to execute /bin/sh, giving up: %m");
1974 log_warning_errno(errno
, "Failed to execute /sbin/init, giving up: %m");
1977 arg_serialization
= safe_fclose(arg_serialization
);
1978 fds
= fdset_free(fds
);
1980 #ifdef HAVE_VALGRIND_VALGRIND_H
1981 /* If we are PID 1 and running under valgrind, then let's exit
1982 * here explicitly. valgrind will only generate nice output on
1983 * exit(), not on exec(), hence let's do the former not the
1985 if (getpid() == 1 && RUNNING_ON_VALGRIND
)
1989 if (shutdown_verb
) {
1990 char log_level
[DECIMAL_STR_MAX(int) + 1];
1991 char exit_code
[DECIMAL_STR_MAX(uint8_t) + 1];
1992 const char* command_line
[11] = {
1993 SYSTEMD_SHUTDOWN_BINARY_PATH
,
1995 "--log-level", log_level
,
1999 _cleanup_strv_free_
char **env_block
= NULL
;
2001 assert(command_line
[pos
] == NULL
);
2002 env_block
= strv_copy(environ
);
2004 xsprintf(log_level
, "%d", log_get_max_level());
2006 switch (log_get_target()) {
2008 case LOG_TARGET_KMSG
:
2009 case LOG_TARGET_JOURNAL_OR_KMSG
:
2010 case LOG_TARGET_SYSLOG_OR_KMSG
:
2011 command_line
[pos
++] = "kmsg";
2014 case LOG_TARGET_NULL
:
2015 command_line
[pos
++] = "null";
2018 case LOG_TARGET_CONSOLE
:
2020 command_line
[pos
++] = "console";
2024 if (log_get_show_color())
2025 command_line
[pos
++] = "--log-color";
2027 if (log_get_show_location())
2028 command_line
[pos
++] = "--log-location";
2030 if (streq(shutdown_verb
, "exit")) {
2031 command_line
[pos
++] = "--exit-code";
2032 command_line
[pos
++] = exit_code
;
2033 xsprintf(exit_code
, "%d", retval
);
2036 assert(pos
< ELEMENTSOF(command_line
));
2038 if (arm_reboot_watchdog
&& arg_shutdown_watchdog
> 0) {
2041 /* If we reboot let's set the shutdown
2042 * watchdog and tell the shutdown binary to
2043 * repeatedly ping it */
2044 r
= watchdog_set_timeout(&arg_shutdown_watchdog
);
2045 watchdog_close(r
< 0);
2047 /* Tell the binary how often to ping, ignore failure */
2048 if (asprintf(&e
, "WATCHDOG_USEC="USEC_FMT
, arg_shutdown_watchdog
) > 0)
2049 (void) strv_push(&env_block
, e
);
2051 watchdog_close(true);
2053 /* Avoid the creation of new processes forked by the
2054 * kernel; at this point, we will not listen to the
2056 if (detect_container() <= 0)
2057 (void) cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER
);
2059 execve(SYSTEMD_SHUTDOWN_BINARY_PATH
, (char **) command_line
, env_block
);
2060 log_error_errno(errno
, "Failed to execute shutdown binary, %s: %m",
2061 getpid() == 1 ? "freezing" : "quitting");
2064 if (getpid() == 1) {
2066 manager_status_printf(NULL
, STATUS_TYPE_EMERGENCY
,
2067 ANSI_HIGHLIGHT_RED
"!!!!!!" ANSI_NORMAL
,
2068 "%s, freezing.", error_message
);