1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
27 #include <sys/mount.h>
28 #include <sys/prctl.h>
29 #include <sys/reboot.h>
35 #if HAVE_VALGRIND_VALGRIND_H
36 #include <valgrind/valgrind.h>
40 #include "sd-daemon.h"
42 #include "alloc-util.h"
43 #include "architecture.h"
45 #include "bus-error.h"
47 #include "capability-util.h"
48 #include "clock-util.h"
49 #include "conf-parser.h"
50 #include "cpu-set-util.h"
51 #include "dbus-manager.h"
53 #include "emergency-action.h"
58 #include "format-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 "path-util.h"
74 #include "proc-cmdline.h"
75 #include "process-util.h"
76 #include "raw-clone.h"
77 #include "rlimit-util.h"
79 #include "seccomp-util.h"
81 #include "selinux-setup.h"
82 #include "selinux-util.h"
83 #include "signal-util.h"
84 #include "smack-setup.h"
86 #include "stat-util.h"
87 #include "stdio-util.h"
89 #include "switch-root.h"
90 #include "terminal-util.h"
91 #include "umask-util.h"
92 #include "user-util.h"
101 ACTION_DUMP_CONFIGURATION_ITEMS
102 } arg_action
= ACTION_RUN
;
103 static char *arg_default_unit
= NULL
;
104 static bool arg_system
= false;
105 static bool arg_dump_core
= true;
106 static int arg_crash_chvt
= -1;
107 static bool arg_crash_shell
= false;
108 static bool arg_crash_reboot
= false;
109 static char *arg_confirm_spawn
= NULL
;
110 static ShowStatus arg_show_status
= _SHOW_STATUS_UNSET
;
111 static bool arg_switched_root
= false;
112 static bool arg_no_pager
= false;
113 static char ***arg_join_controllers
= NULL
;
114 static ExecOutput arg_default_std_output
= EXEC_OUTPUT_JOURNAL
;
115 static ExecOutput arg_default_std_error
= EXEC_OUTPUT_INHERIT
;
116 static usec_t arg_default_restart_usec
= DEFAULT_RESTART_USEC
;
117 static usec_t arg_default_timeout_start_usec
= DEFAULT_TIMEOUT_USEC
;
118 static usec_t arg_default_timeout_stop_usec
= DEFAULT_TIMEOUT_USEC
;
119 static usec_t arg_default_start_limit_interval
= DEFAULT_START_LIMIT_INTERVAL
;
120 static unsigned arg_default_start_limit_burst
= DEFAULT_START_LIMIT_BURST
;
121 static usec_t arg_runtime_watchdog
= 0;
122 static usec_t arg_shutdown_watchdog
= 10 * USEC_PER_MINUTE
;
123 static char **arg_default_environment
= NULL
;
124 static struct rlimit
*arg_default_rlimit
[_RLIMIT_MAX
] = {};
125 static uint64_t arg_capability_bounding_set
= CAP_ALL
;
126 static nsec_t arg_timer_slack_nsec
= NSEC_INFINITY
;
127 static usec_t arg_default_timer_accuracy_usec
= 1 * USEC_PER_MINUTE
;
128 static Set
* arg_syscall_archs
= NULL
;
129 static FILE* arg_serialization
= NULL
;
130 static bool arg_default_cpu_accounting
= false;
131 static bool arg_default_io_accounting
= false;
132 static bool arg_default_ip_accounting
= false;
133 static bool arg_default_blockio_accounting
= false;
134 static bool arg_default_memory_accounting
= false;
135 static bool arg_default_tasks_accounting
= true;
136 static uint64_t arg_default_tasks_max
= UINT64_MAX
;
137 static sd_id128_t arg_machine_id
= {};
138 static EmergencyAction arg_cad_burst_action
= EMERGENCY_ACTION_REBOOT_FORCE
;
140 noreturn
static void freeze_or_reboot(void) {
142 if (arg_crash_reboot
) {
143 log_notice("Rebooting in 10s...");
146 log_notice("Rebooting now...");
147 (void) reboot(RB_AUTOBOOT
);
148 log_emergency_errno(errno
, "Failed to reboot: %m");
151 log_emergency("Freezing execution.");
155 noreturn
static void crash(int sig
) {
159 if (getpid_cached() != 1)
160 /* Pass this on immediately, if this is not PID 1 */
162 else if (!arg_dump_core
)
163 log_emergency("Caught <%s>, not dumping core.", signal_to_string(sig
));
165 sa
= (struct sigaction
) {
166 .sa_handler
= nop_signal_handler
,
167 .sa_flags
= SA_NOCLDSTOP
|SA_RESTART
,
170 /* We want to wait for the core process, hence let's enable SIGCHLD */
171 (void) sigaction(SIGCHLD
, &sa
, NULL
);
173 pid
= raw_clone(SIGCHLD
);
175 log_emergency_errno(errno
, "Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig
));
177 /* Enable default signal handler for core dump */
179 sa
= (struct sigaction
) {
180 .sa_handler
= SIG_DFL
,
182 (void) sigaction(sig
, &sa
, NULL
);
184 /* Don't limit the coredump size */
185 (void) setrlimit(RLIMIT_CORE
, &RLIMIT_MAKE_CONST(RLIM_INFINITY
));
187 /* Just to be sure... */
190 /* Raise the signal again */
192 (void) kill(pid
, sig
); /* raise() would kill the parent */
194 assert_not_reached("We shouldn't be here...");
200 /* Order things nicely. */
201 r
= wait_for_terminate(pid
, &status
);
203 log_emergency_errno(r
, "Caught <%s>, waitpid() failed: %m", signal_to_string(sig
));
204 else if (status
.si_code
!= CLD_DUMPED
)
205 log_emergency("Caught <%s>, core dump failed (child "PID_FMT
", code=%s, status=%i/%s).",
206 signal_to_string(sig
),
207 pid
, sigchld_code_to_string(status
.si_code
),
209 strna(status
.si_code
== CLD_EXITED
210 ? exit_status_to_string(status
.si_status
, EXIT_STATUS_MINIMAL
)
211 : signal_to_string(status
.si_status
)));
213 log_emergency("Caught <%s>, dumped core as pid "PID_FMT
".", signal_to_string(sig
), pid
);
217 if (arg_crash_chvt
>= 0)
218 (void) chvt(arg_crash_chvt
);
220 sa
= (struct sigaction
) {
221 .sa_handler
= SIG_IGN
,
222 .sa_flags
= SA_NOCLDSTOP
|SA_NOCLDWAIT
|SA_RESTART
,
225 /* Let the kernel reap children for us */
226 (void) sigaction(SIGCHLD
, &sa
, NULL
);
228 if (arg_crash_shell
) {
229 log_notice("Executing crash shell in 10s...");
232 pid
= raw_clone(SIGCHLD
);
234 log_emergency_errno(errno
, "Failed to fork off crash shell: %m");
237 (void) make_console_stdio();
238 (void) execle("/bin/sh", "/bin/sh", NULL
, environ
);
240 log_emergency_errno(errno
, "execle() failed: %m");
243 log_info("Spawned crash shell as PID "PID_FMT
".", pid
);
244 (void) wait_for_terminate(pid
, NULL
);
251 static void install_crash_handler(void) {
252 static const struct sigaction sa
= {
254 .sa_flags
= SA_NODEFER
, /* So that we can raise the signal again from the signal handler */
258 /* We ignore the return value here, since, we don't mind if we
259 * cannot set up a crash handler */
260 r
= sigaction_many(&sa
, SIGNALS_CRASH_HANDLER
, -1);
262 log_debug_errno(r
, "I had trouble setting up the crash handler, ignoring: %m");
265 static int console_setup(void) {
266 _cleanup_close_
int tty_fd
= -1;
269 tty_fd
= open_terminal("/dev/console", O_WRONLY
|O_NOCTTY
|O_CLOEXEC
);
271 return log_error_errno(tty_fd
, "Failed to open /dev/console: %m");
273 /* We don't want to force text mode. plymouth may be showing
274 * pictures already from initrd. */
275 r
= reset_terminal_fd(tty_fd
, false);
277 return log_error_errno(r
, "Failed to reset /dev/console: %m");
282 static int parse_crash_chvt(const char *value
) {
285 if (safe_atoi(value
, &arg_crash_chvt
) >= 0)
288 b
= parse_boolean(value
);
293 arg_crash_chvt
= 0; /* switch to where kmsg goes */
295 arg_crash_chvt
= -1; /* turn off switching */
300 static int parse_confirm_spawn(const char *value
, char **console
) {
304 r
= value
? parse_boolean(value
) : 1;
310 if (r
> 0) /* on with default tty */
311 s
= strdup("/dev/console");
312 else if (is_path(value
)) /* on with fully qualified path */
314 else /* on with only a tty file name, not a fully qualified path */
315 s
= strjoin("/dev/", value
);
322 static int set_machine_id(const char *m
) {
326 if (sd_id128_from_string(m
, &t
) < 0)
329 if (sd_id128_is_null(t
))
336 static int parse_proc_cmdline_item(const char *key
, const char *value
, void *data
) {
342 if (STR_IN_SET(key
, "systemd.unit", "rd.systemd.unit")) {
344 if (proc_cmdline_value_missing(key
, value
))
347 if (!unit_name_is_valid(value
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
))
348 log_warning("Unit name specified on %s= is not valid, ignoring: %s", key
, value
);
349 else if (in_initrd() == !!startswith(key
, "rd.")) {
350 if (free_and_strdup(&arg_default_unit
, value
) < 0)
354 } else if (proc_cmdline_key_streq(key
, "systemd.dump_core")) {
356 r
= value
? parse_boolean(value
) : true;
358 log_warning("Failed to parse dump core switch %s. Ignoring.", value
);
362 } else if (proc_cmdline_key_streq(key
, "systemd.crash_chvt")) {
365 arg_crash_chvt
= 0; /* turn on */
366 else if (parse_crash_chvt(value
) < 0)
367 log_warning("Failed to parse crash chvt switch %s. Ignoring.", value
);
369 } else if (proc_cmdline_key_streq(key
, "systemd.crash_shell")) {
371 r
= value
? parse_boolean(value
) : true;
373 log_warning("Failed to parse crash shell switch %s. Ignoring.", value
);
377 } else if (proc_cmdline_key_streq(key
, "systemd.crash_reboot")) {
379 r
= value
? parse_boolean(value
) : true;
381 log_warning("Failed to parse crash reboot switch %s. Ignoring.", value
);
383 arg_crash_reboot
= r
;
385 } else if (proc_cmdline_key_streq(key
, "systemd.confirm_spawn")) {
388 r
= parse_confirm_spawn(value
, &s
);
390 log_warning_errno(r
, "Failed to parse confirm_spawn switch %s. Ignoring.", value
);
392 free(arg_confirm_spawn
);
393 arg_confirm_spawn
= s
;
396 } else if (proc_cmdline_key_streq(key
, "systemd.show_status")) {
399 r
= parse_show_status(value
, &arg_show_status
);
401 log_warning("Failed to parse show status switch %s. Ignoring.", value
);
403 arg_show_status
= SHOW_STATUS_YES
;
405 } else if (proc_cmdline_key_streq(key
, "systemd.default_standard_output")) {
407 if (proc_cmdline_value_missing(key
, value
))
410 r
= exec_output_from_string(value
);
412 log_warning("Failed to parse default standard output switch %s. Ignoring.", value
);
414 arg_default_std_output
= r
;
416 } else if (proc_cmdline_key_streq(key
, "systemd.default_standard_error")) {
418 if (proc_cmdline_value_missing(key
, value
))
421 r
= exec_output_from_string(value
);
423 log_warning("Failed to parse default standard error switch %s. Ignoring.", value
);
425 arg_default_std_error
= r
;
427 } else if (streq(key
, "systemd.setenv")) {
429 if (proc_cmdline_value_missing(key
, value
))
432 if (env_assignment_is_valid(value
)) {
435 env
= strv_env_set(arg_default_environment
, value
);
439 arg_default_environment
= env
;
441 log_warning("Environment variable name '%s' is not valid. Ignoring.", value
);
443 } else if (proc_cmdline_key_streq(key
, "systemd.machine_id")) {
445 if (proc_cmdline_value_missing(key
, value
))
448 r
= set_machine_id(value
);
450 log_warning("MachineID '%s' is not valid. Ignoring.", value
);
452 } else if (proc_cmdline_key_streq(key
, "systemd.default_timeout_start_sec")) {
454 if (proc_cmdline_value_missing(key
, value
))
457 r
= parse_sec(value
, &arg_default_timeout_start_usec
);
459 log_warning_errno(r
, "Failed to parse default start timeout: %s, ignoring.", value
);
461 if (arg_default_timeout_start_usec
<= 0)
462 arg_default_timeout_start_usec
= USEC_INFINITY
;
464 } else if (streq(key
, "quiet") && !value
) {
466 if (arg_show_status
== _SHOW_STATUS_UNSET
)
467 arg_show_status
= SHOW_STATUS_AUTO
;
469 } else if (streq(key
, "debug") && !value
) {
471 /* Note that log_parse_environment() handles 'debug'
472 * too, and sets the log level to LOG_DEBUG. */
474 if (detect_container() > 0)
475 log_set_target(LOG_TARGET_CONSOLE
);
480 /* SysV compatibility */
481 target
= runlevel_to_target(key
);
483 return free_and_strdup(&arg_default_unit
, target
);
489 #define DEFINE_SETTER(name, func, descr) \
490 static int name(const char *unit, \
491 const char *filename, \
493 const char *section, \
494 unsigned section_line, \
495 const char *lvalue, \
497 const char *rvalue, \
509 log_syntax(unit, LOG_ERR, filename, line, r, \
510 "Invalid " descr "'%s': %m", \
516 DEFINE_SETTER(config_parse_level2
, log_set_max_level_from_string
, "log level")
517 DEFINE_SETTER(config_parse_target
, log_set_target_from_string
, "target")
518 DEFINE_SETTER(config_parse_color
, log_show_color_from_string
, "color" )
519 DEFINE_SETTER(config_parse_location
, log_show_location_from_string
, "location")
521 static int config_parse_cpu_affinity2(
523 const char *filename
,
526 unsigned section_line
,
533 _cleanup_cpu_free_ cpu_set_t
*c
= NULL
;
536 ncpus
= parse_cpu_set_and_warn(rvalue
, &c
, unit
, filename
, line
, lvalue
);
540 if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus
), c
) < 0)
541 log_warning_errno(errno
, "Failed to set CPU affinity: %m");
546 static int config_parse_show_status(
548 const char *filename
,
551 unsigned section_line
,
559 ShowStatus
*b
= data
;
566 k
= parse_show_status(rvalue
, b
);
568 log_syntax(unit
, LOG_ERR
, filename
, line
, k
, "Failed to parse show status setting, ignoring: %s", rvalue
);
575 static int config_parse_crash_chvt(
577 const char *filename
,
580 unsigned section_line
,
593 r
= parse_crash_chvt(rvalue
);
595 log_syntax(unit
, LOG_ERR
, filename
, line
, r
, "Failed to parse CrashChangeVT= setting, ignoring: %s", rvalue
);
602 static int config_parse_join_controllers(const char *unit
,
603 const char *filename
,
606 unsigned section_line
,
613 const char *whole_rvalue
= rvalue
;
620 arg_join_controllers
= strv_free_free(arg_join_controllers
);
623 _cleanup_free_
char *word
= NULL
;
627 r
= extract_first_word(&rvalue
, &word
, NULL
, EXTRACT_QUOTES
);
629 log_syntax(unit
, LOG_ERR
, filename
, line
, r
, "Invalid value for %s: %s", lvalue
, whole_rvalue
);
635 l
= strv_split(word
, ",");
640 if (strv_length(l
) <= 1) {
645 if (!arg_join_controllers
) {
646 arg_join_controllers
= new(char**, 2);
647 if (!arg_join_controllers
) {
652 arg_join_controllers
[0] = l
;
653 arg_join_controllers
[1] = NULL
;
660 t
= new0(char**, n
+2);
668 for (a
= arg_join_controllers
; *a
; a
++) {
670 if (strv_overlap(*a
, l
)) {
671 if (strv_extend_strv(&l
, *a
, false) < 0) {
691 t
[n
++] = strv_uniq(l
);
693 strv_free_free(arg_join_controllers
);
694 arg_join_controllers
= t
;
697 if (!isempty(rvalue
))
698 log_syntax(unit
, LOG_ERR
, filename
, line
, 0, "Trailing garbage, ignoring.");
703 static int parse_config_file(void) {
705 const ConfigTableItem items
[] = {
706 { "Manager", "LogLevel", config_parse_level2
, 0, NULL
},
707 { "Manager", "LogTarget", config_parse_target
, 0, NULL
},
708 { "Manager", "LogColor", config_parse_color
, 0, NULL
},
709 { "Manager", "LogLocation", config_parse_location
, 0, NULL
},
710 { "Manager", "DumpCore", config_parse_bool
, 0, &arg_dump_core
},
711 { "Manager", "CrashChVT", /* legacy */ config_parse_crash_chvt
, 0, NULL
},
712 { "Manager", "CrashChangeVT", config_parse_crash_chvt
, 0, NULL
},
713 { "Manager", "CrashShell", config_parse_bool
, 0, &arg_crash_shell
},
714 { "Manager", "CrashReboot", config_parse_bool
, 0, &arg_crash_reboot
},
715 { "Manager", "ShowStatus", config_parse_show_status
, 0, &arg_show_status
},
716 { "Manager", "CPUAffinity", config_parse_cpu_affinity2
, 0, NULL
},
717 { "Manager", "JoinControllers", config_parse_join_controllers
, 0, &arg_join_controllers
},
718 { "Manager", "RuntimeWatchdogSec", config_parse_sec
, 0, &arg_runtime_watchdog
},
719 { "Manager", "ShutdownWatchdogSec", config_parse_sec
, 0, &arg_shutdown_watchdog
},
720 { "Manager", "CapabilityBoundingSet", config_parse_capability_set
, 0, &arg_capability_bounding_set
},
722 { "Manager", "SystemCallArchitectures", config_parse_syscall_archs
, 0, &arg_syscall_archs
},
724 { "Manager", "TimerSlackNSec", config_parse_nsec
, 0, &arg_timer_slack_nsec
},
725 { "Manager", "DefaultTimerAccuracySec", config_parse_sec
, 0, &arg_default_timer_accuracy_usec
},
726 { "Manager", "DefaultStandardOutput", config_parse_output
, 0, &arg_default_std_output
},
727 { "Manager", "DefaultStandardError", config_parse_output
, 0, &arg_default_std_error
},
728 { "Manager", "DefaultTimeoutStartSec", config_parse_sec
, 0, &arg_default_timeout_start_usec
},
729 { "Manager", "DefaultTimeoutStopSec", config_parse_sec
, 0, &arg_default_timeout_stop_usec
},
730 { "Manager", "DefaultRestartSec", config_parse_sec
, 0, &arg_default_restart_usec
},
731 { "Manager", "DefaultStartLimitInterval", config_parse_sec
, 0, &arg_default_start_limit_interval
}, /* obsolete alias */
732 { "Manager", "DefaultStartLimitIntervalSec",config_parse_sec
, 0, &arg_default_start_limit_interval
},
733 { "Manager", "DefaultStartLimitBurst", config_parse_unsigned
, 0, &arg_default_start_limit_burst
},
734 { "Manager", "DefaultEnvironment", config_parse_environ
, 0, &arg_default_environment
},
735 { "Manager", "DefaultLimitCPU", config_parse_limit
, RLIMIT_CPU
, arg_default_rlimit
},
736 { "Manager", "DefaultLimitFSIZE", config_parse_limit
, RLIMIT_FSIZE
, arg_default_rlimit
},
737 { "Manager", "DefaultLimitDATA", config_parse_limit
, RLIMIT_DATA
, arg_default_rlimit
},
738 { "Manager", "DefaultLimitSTACK", config_parse_limit
, RLIMIT_STACK
, arg_default_rlimit
},
739 { "Manager", "DefaultLimitCORE", config_parse_limit
, RLIMIT_CORE
, arg_default_rlimit
},
740 { "Manager", "DefaultLimitRSS", config_parse_limit
, RLIMIT_RSS
, arg_default_rlimit
},
741 { "Manager", "DefaultLimitNOFILE", config_parse_limit
, RLIMIT_NOFILE
, arg_default_rlimit
},
742 { "Manager", "DefaultLimitAS", config_parse_limit
, RLIMIT_AS
, arg_default_rlimit
},
743 { "Manager", "DefaultLimitNPROC", config_parse_limit
, RLIMIT_NPROC
, arg_default_rlimit
},
744 { "Manager", "DefaultLimitMEMLOCK", config_parse_limit
, RLIMIT_MEMLOCK
, arg_default_rlimit
},
745 { "Manager", "DefaultLimitLOCKS", config_parse_limit
, RLIMIT_LOCKS
, arg_default_rlimit
},
746 { "Manager", "DefaultLimitSIGPENDING", config_parse_limit
, RLIMIT_SIGPENDING
, arg_default_rlimit
},
747 { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit
, RLIMIT_MSGQUEUE
, arg_default_rlimit
},
748 { "Manager", "DefaultLimitNICE", config_parse_limit
, RLIMIT_NICE
, arg_default_rlimit
},
749 { "Manager", "DefaultLimitRTPRIO", config_parse_limit
, RLIMIT_RTPRIO
, arg_default_rlimit
},
750 { "Manager", "DefaultLimitRTTIME", config_parse_limit
, RLIMIT_RTTIME
, arg_default_rlimit
},
751 { "Manager", "DefaultCPUAccounting", config_parse_bool
, 0, &arg_default_cpu_accounting
},
752 { "Manager", "DefaultIOAccounting", config_parse_bool
, 0, &arg_default_io_accounting
},
753 { "Manager", "DefaultIPAccounting", config_parse_bool
, 0, &arg_default_ip_accounting
},
754 { "Manager", "DefaultBlockIOAccounting", config_parse_bool
, 0, &arg_default_blockio_accounting
},
755 { "Manager", "DefaultMemoryAccounting", config_parse_bool
, 0, &arg_default_memory_accounting
},
756 { "Manager", "DefaultTasksAccounting", config_parse_bool
, 0, &arg_default_tasks_accounting
},
757 { "Manager", "DefaultTasksMax", config_parse_tasks_max
, 0, &arg_default_tasks_max
},
758 { "Manager", "CtrlAltDelBurstAction", config_parse_emergency_action
, 0, &arg_cad_burst_action
},
762 const char *fn
, *conf_dirs_nulstr
;
765 PKGSYSCONFDIR
"/system.conf" :
766 PKGSYSCONFDIR
"/user.conf";
768 conf_dirs_nulstr
= arg_system
?
769 CONF_PATHS_NULSTR("systemd/system.conf.d") :
770 CONF_PATHS_NULSTR("systemd/user.conf.d");
772 (void) config_parse_many_nulstr(fn
, conf_dirs_nulstr
, "Manager\0", config_item_table_lookup
, items
, CONFIG_PARSE_WARN
, NULL
);
774 /* Traditionally "0" was used to turn off the default unit timeouts. Fix this up so that we used USEC_INFINITY
775 * like everywhere else. */
776 if (arg_default_timeout_start_usec
<= 0)
777 arg_default_timeout_start_usec
= USEC_INFINITY
;
778 if (arg_default_timeout_stop_usec
<= 0)
779 arg_default_timeout_stop_usec
= USEC_INFINITY
;
784 static void set_manager_defaults(Manager
*m
) {
788 m
->default_timer_accuracy_usec
= arg_default_timer_accuracy_usec
;
789 m
->default_std_output
= arg_default_std_output
;
790 m
->default_std_error
= arg_default_std_error
;
791 m
->default_timeout_start_usec
= arg_default_timeout_start_usec
;
792 m
->default_timeout_stop_usec
= arg_default_timeout_stop_usec
;
793 m
->default_restart_usec
= arg_default_restart_usec
;
794 m
->default_start_limit_interval
= arg_default_start_limit_interval
;
795 m
->default_start_limit_burst
= arg_default_start_limit_burst
;
796 m
->default_cpu_accounting
= arg_default_cpu_accounting
;
797 m
->default_io_accounting
= arg_default_io_accounting
;
798 m
->default_ip_accounting
= arg_default_ip_accounting
;
799 m
->default_blockio_accounting
= arg_default_blockio_accounting
;
800 m
->default_memory_accounting
= arg_default_memory_accounting
;
801 m
->default_tasks_accounting
= arg_default_tasks_accounting
;
802 m
->default_tasks_max
= arg_default_tasks_max
;
804 manager_set_default_rlimits(m
, arg_default_rlimit
);
805 manager_environment_add(m
, NULL
, arg_default_environment
);
808 static void set_manager_settings(Manager
*m
) {
812 m
->confirm_spawn
= arg_confirm_spawn
;
813 m
->runtime_watchdog
= arg_runtime_watchdog
;
814 m
->shutdown_watchdog
= arg_shutdown_watchdog
;
815 m
->cad_burst_action
= arg_cad_burst_action
;
817 manager_set_show_status(m
, arg_show_status
);
820 static int parse_argv(int argc
, char *argv
[]) {
823 ARG_LOG_LEVEL
= 0x100,
833 ARG_DUMP_CONFIGURATION_ITEMS
,
842 ARG_DEFAULT_STD_OUTPUT
,
843 ARG_DEFAULT_STD_ERROR
,
847 static const struct option options
[] = {
848 { "log-level", required_argument
, NULL
, ARG_LOG_LEVEL
},
849 { "log-target", required_argument
, NULL
, ARG_LOG_TARGET
},
850 { "log-color", optional_argument
, NULL
, ARG_LOG_COLOR
},
851 { "log-location", optional_argument
, NULL
, ARG_LOG_LOCATION
},
852 { "unit", required_argument
, NULL
, ARG_UNIT
},
853 { "system", no_argument
, NULL
, ARG_SYSTEM
},
854 { "user", no_argument
, NULL
, ARG_USER
},
855 { "test", no_argument
, NULL
, ARG_TEST
},
856 { "no-pager", no_argument
, NULL
, ARG_NO_PAGER
},
857 { "help", no_argument
, NULL
, 'h' },
858 { "version", no_argument
, NULL
, ARG_VERSION
},
859 { "dump-configuration-items", no_argument
, NULL
, ARG_DUMP_CONFIGURATION_ITEMS
},
860 { "dump-core", optional_argument
, NULL
, ARG_DUMP_CORE
},
861 { "crash-chvt", required_argument
, NULL
, ARG_CRASH_CHVT
},
862 { "crash-shell", optional_argument
, NULL
, ARG_CRASH_SHELL
},
863 { "crash-reboot", optional_argument
, NULL
, ARG_CRASH_REBOOT
},
864 { "confirm-spawn", optional_argument
, NULL
, ARG_CONFIRM_SPAWN
},
865 { "show-status", optional_argument
, NULL
, ARG_SHOW_STATUS
},
866 { "deserialize", required_argument
, NULL
, ARG_DESERIALIZE
},
867 { "switched-root", no_argument
, NULL
, ARG_SWITCHED_ROOT
},
868 { "default-standard-output", required_argument
, NULL
, ARG_DEFAULT_STD_OUTPUT
, },
869 { "default-standard-error", required_argument
, NULL
, ARG_DEFAULT_STD_ERROR
, },
870 { "machine-id", required_argument
, NULL
, ARG_MACHINE_ID
},
879 if (getpid_cached() == 1)
882 while ((c
= getopt_long(argc
, argv
, "hDbsz:", options
, NULL
)) >= 0)
887 r
= log_set_max_level_from_string(optarg
);
889 log_error("Failed to parse log level %s.", optarg
);
896 r
= log_set_target_from_string(optarg
);
898 log_error("Failed to parse log target %s.", optarg
);
907 r
= log_show_color_from_string(optarg
);
909 log_error("Failed to parse log color setting %s.", optarg
);
913 log_show_color(true);
917 case ARG_LOG_LOCATION
:
919 r
= log_show_location_from_string(optarg
);
921 log_error("Failed to parse log location setting %s.", optarg
);
925 log_show_location(true);
929 case ARG_DEFAULT_STD_OUTPUT
:
930 r
= exec_output_from_string(optarg
);
932 log_error("Failed to parse default standard output setting %s.", optarg
);
935 arg_default_std_output
= r
;
938 case ARG_DEFAULT_STD_ERROR
:
939 r
= exec_output_from_string(optarg
);
941 log_error("Failed to parse default standard error output setting %s.", optarg
);
944 arg_default_std_error
= r
;
948 r
= free_and_strdup(&arg_default_unit
, optarg
);
950 return log_error_errno(r
, "Failed to set default unit %s: %m", optarg
);
963 arg_action
= ACTION_TEST
;
971 arg_action
= ACTION_VERSION
;
974 case ARG_DUMP_CONFIGURATION_ITEMS
:
975 arg_action
= ACTION_DUMP_CONFIGURATION_ITEMS
;
980 arg_dump_core
= true;
982 r
= parse_boolean(optarg
);
984 return log_error_errno(r
, "Failed to parse dump core boolean: %s", optarg
);
990 r
= parse_crash_chvt(optarg
);
992 return log_error_errno(r
, "Failed to parse crash virtual terminal index: %s", optarg
);
995 case ARG_CRASH_SHELL
:
997 arg_crash_shell
= true;
999 r
= parse_boolean(optarg
);
1001 return log_error_errno(r
, "Failed to parse crash shell boolean: %s", optarg
);
1002 arg_crash_shell
= r
;
1006 case ARG_CRASH_REBOOT
:
1008 arg_crash_reboot
= true;
1010 r
= parse_boolean(optarg
);
1012 return log_error_errno(r
, "Failed to parse crash shell boolean: %s", optarg
);
1013 arg_crash_reboot
= r
;
1017 case ARG_CONFIRM_SPAWN
:
1018 arg_confirm_spawn
= mfree(arg_confirm_spawn
);
1020 r
= parse_confirm_spawn(optarg
, &arg_confirm_spawn
);
1022 return log_error_errno(r
, "Failed to parse confirm spawn option: %m");
1025 case ARG_SHOW_STATUS
:
1027 r
= parse_show_status(optarg
, &arg_show_status
);
1029 log_error("Failed to parse show status boolean %s.", optarg
);
1033 arg_show_status
= SHOW_STATUS_YES
;
1036 case ARG_DESERIALIZE
: {
1040 r
= safe_atoi(optarg
, &fd
);
1041 if (r
< 0 || fd
< 0) {
1042 log_error("Failed to parse deserialize option %s.", optarg
);
1046 (void) fd_cloexec(fd
, true);
1048 f
= fdopen(fd
, "r");
1050 return log_error_errno(errno
, "Failed to open serialization fd: %m");
1052 safe_fclose(arg_serialization
);
1053 arg_serialization
= f
;
1058 case ARG_SWITCHED_ROOT
:
1059 arg_switched_root
= true;
1062 case ARG_MACHINE_ID
:
1063 r
= set_machine_id(optarg
);
1065 return log_error_errno(r
, "MachineID '%s' is not valid.", optarg
);
1069 arg_action
= ACTION_HELP
;
1073 log_set_max_level(LOG_DEBUG
);
1079 /* Just to eat away the sysvinit kernel
1080 * cmdline args without getopt() error
1081 * messages that we'll parse in
1082 * parse_proc_cmdline_word() or ignore. */
1085 if (getpid_cached() != 1)
1091 assert_not_reached("Unhandled option code.");
1094 if (optind
< argc
&& getpid_cached() != 1) {
1095 /* Hmm, when we aren't run as init system
1096 * let's complain about excess arguments */
1098 log_error("Excess arguments.");
1105 static int help(void) {
1107 printf("%s [OPTIONS...]\n\n"
1108 "Starts up and maintains the system or user services.\n\n"
1109 " -h --help Show this help\n"
1110 " --version Show version\n"
1111 " --test Determine startup sequence, dump it and exit\n"
1112 " --no-pager Do not pipe output into a pager\n"
1113 " --dump-configuration-items Dump understood unit configuration items\n"
1114 " --unit=UNIT Set default unit\n"
1115 " --system Run a system instance, even if PID != 1\n"
1116 " --user Run a user instance\n"
1117 " --dump-core[=BOOL] Dump core on crash\n"
1118 " --crash-vt=NR Change to specified VT on crash\n"
1119 " --crash-reboot[=BOOL] Reboot on crash\n"
1120 " --crash-shell[=BOOL] Run shell on crash\n"
1121 " --confirm-spawn[=BOOL] Ask for confirmation when spawning processes\n"
1122 " --show-status[=BOOL] Show status updates on the console during bootup\n"
1123 " --log-target=TARGET Set log target (console, journal, kmsg, journal-or-kmsg, null)\n"
1124 " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
1125 " --log-color[=BOOL] Highlight important log messages\n"
1126 " --log-location[=BOOL] Include code location in log messages\n"
1127 " --default-standard-output= Set default standard output for services\n"
1128 " --default-standard-error= Set default standard error output for services\n",
1129 program_invocation_short_name
);
1134 static int prepare_reexecute(Manager
*m
, FILE **_f
, FDSet
**_fds
, bool switching_root
) {
1135 _cleanup_fdset_free_ FDSet
*fds
= NULL
;
1136 _cleanup_fclose_
FILE *f
= NULL
;
1143 r
= manager_open_serialization(m
, &f
);
1145 return log_error_errno(r
, "Failed to create serialization file: %m");
1147 /* Make sure nothing is really destructed when we shut down */
1149 bus_manager_send_reloading(m
, true);
1155 r
= manager_serialize(m
, f
, fds
, switching_root
);
1157 return log_error_errno(r
, "Failed to serialize state: %m");
1159 if (fseeko(f
, 0, SEEK_SET
) == (off_t
) -1)
1160 return log_error_errno(errno
, "Failed to rewind serialization fd: %m");
1162 r
= fd_cloexec(fileno(f
), false);
1164 return log_error_errno(r
, "Failed to disable O_CLOEXEC for serialization: %m");
1166 r
= fdset_cloexec(fds
, false);
1168 return log_error_errno(r
, "Failed to disable O_CLOEXEC for serialization fds: %m");
1179 static int bump_rlimit_nofile(struct rlimit
*saved_rlimit
) {
1183 _cleanup_free_
char *nr_open
= NULL
;
1185 assert(saved_rlimit
);
1187 /* Save the original RLIMIT_NOFILE so that we can reset it
1188 * later when transitioning from the initrd to the main
1189 * systemd or suchlike. */
1190 if (getrlimit(RLIMIT_NOFILE
, saved_rlimit
) < 0)
1191 return log_warning_errno(errno
, "Reading RLIMIT_NOFILE failed, ignoring: %m");
1193 /* Make sure forked processes get the default kernel setting */
1194 if (!arg_default_rlimit
[RLIMIT_NOFILE
]) {
1197 rl
= newdup(struct rlimit
, saved_rlimit
, 1);
1201 arg_default_rlimit
[RLIMIT_NOFILE
] = rl
;
1204 /* Get current RLIMIT_NOFILE maximum compiled into the kernel. */
1205 r
= read_one_line_file("/proc/sys/fs/nr_open", &nr_open
);
1207 r
= safe_atoi(nr_open
, &min_max
);
1208 /* If we fail, fallback to the hard-coded kernel limit of 1024 * 1024. */
1210 min_max
= 1024 * 1024;
1212 /* Bump up the resource limit for ourselves substantially */
1213 nl
.rlim_cur
= nl
.rlim_max
= min_max
;
1214 r
= setrlimit_closest(RLIMIT_NOFILE
, &nl
);
1216 return log_warning_errno(r
, "Setting RLIMIT_NOFILE failed, ignoring: %m");
1221 static int bump_rlimit_memlock(struct rlimit
*saved_rlimit
) {
1224 assert(saved_rlimit
);
1225 assert(getuid() == 0);
1227 /* BPF_MAP_TYPE_LPM_TRIE bpf maps are charged against RLIMIT_MEMLOCK, even though we have CAP_IPC_LOCK which
1228 * should normally disable such checks. We need them to implement IPAccessAllow= and IPAccessDeny=, hence let's
1229 * bump the value high enough for the root user. */
1231 if (getrlimit(RLIMIT_MEMLOCK
, saved_rlimit
) < 0)
1232 return log_warning_errno(errno
, "Reading RLIMIT_MEMLOCK failed, ignoring: %m");
1234 r
= setrlimit_closest(RLIMIT_MEMLOCK
, &RLIMIT_MAKE_CONST(1024ULL*1024ULL*16ULL));
1236 return log_warning_errno(r
, "Setting RLIMIT_MEMLOCK failed, ignoring: %m");
1241 static void test_usr(void) {
1243 /* Check that /usr is not a separate fs */
1245 if (dir_is_empty("/usr") <= 0)
1248 log_warning("/usr appears to be on its own filesystem and is not already mounted. This is not a supported setup. "
1249 "Some things will probably break (sometimes even silently) in mysterious ways. "
1250 "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
1253 static int initialize_join_controllers(void) {
1254 /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
1255 * + "net_prio". We'd like to add "cpuset" to the mix, but
1256 * "cpuset" doesn't really work for groups with no initialized
1259 arg_join_controllers
= new(char**, 3);
1260 if (!arg_join_controllers
)
1263 arg_join_controllers
[0] = strv_new("cpu", "cpuacct", NULL
);
1264 if (!arg_join_controllers
[0])
1267 arg_join_controllers
[1] = strv_new("net_cls", "net_prio", NULL
);
1268 if (!arg_join_controllers
[1])
1271 arg_join_controllers
[2] = NULL
;
1275 arg_join_controllers
= strv_free_free(arg_join_controllers
);
1279 static int enforce_syscall_archs(Set
*archs
) {
1283 if (!is_seccomp_available())
1286 r
= seccomp_restrict_archs(arg_syscall_archs
);
1288 return log_error_errno(r
, "Failed to enforce system call architecture restrication: %m");
1293 static int status_welcome(void) {
1294 _cleanup_free_
char *pretty_name
= NULL
, *ansi_color
= NULL
;
1297 r
= parse_env_file("/etc/os-release", NEWLINE
,
1298 "PRETTY_NAME", &pretty_name
,
1299 "ANSI_COLOR", &ansi_color
,
1302 r
= parse_env_file("/usr/lib/os-release", NEWLINE
,
1303 "PRETTY_NAME", &pretty_name
,
1304 "ANSI_COLOR", &ansi_color
,
1307 if (r
< 0 && r
!= -ENOENT
)
1308 log_warning_errno(r
, "Failed to read os-release file: %m");
1310 if (log_get_show_color())
1311 return status_printf(NULL
, false, false,
1312 "\nWelcome to \x1B[%sm%s\x1B[0m!\n",
1313 isempty(ansi_color
) ? "1" : ansi_color
,
1314 isempty(pretty_name
) ? "Linux" : pretty_name
);
1316 return status_printf(NULL
, false, false,
1317 "\nWelcome to %s!\n",
1318 isempty(pretty_name
) ? "Linux" : pretty_name
);
1321 static int write_container_id(void) {
1325 c
= getenv("container");
1329 RUN_WITH_UMASK(0022)
1330 r
= write_string_file("/run/systemd/container", c
, WRITE_STRING_FILE_CREATE
);
1332 return log_warning_errno(r
, "Failed to write /run/systemd/container, ignoring: %m");
1337 static int bump_unix_max_dgram_qlen(void) {
1338 _cleanup_free_
char *qlen
= NULL
;
1342 /* Let's bump the net.unix.max_dgram_qlen sysctl. The kernel
1343 * default of 16 is simply too low. We set the value really
1344 * really early during boot, so that it is actually applied to
1345 * all our sockets, including the $NOTIFY_SOCKET one. */
1347 r
= read_one_line_file("/proc/sys/net/unix/max_dgram_qlen", &qlen
);
1349 return log_warning_errno(r
, "Failed to read AF_UNIX datagram queue length, ignoring: %m");
1351 r
= safe_atolu(qlen
, &v
);
1353 return log_warning_errno(r
, "Failed to parse AF_UNIX datagram queue length, ignoring: %m");
1355 if (v
>= DEFAULT_UNIX_MAX_DGRAM_QLEN
)
1359 if (asprintf(&qlen
, "%lu\n", DEFAULT_UNIX_MAX_DGRAM_QLEN
) < 0)
1362 r
= write_string_file("/proc/sys/net/unix/max_dgram_qlen", qlen
, 0);
1364 return log_full_errno(IN_SET(r
, -EROFS
, -EPERM
, -EACCES
) ? LOG_DEBUG
: LOG_WARNING
, r
,
1365 "Failed to bump AF_UNIX datagram queue length, ignoring: %m");
1370 static int fixup_environment(void) {
1371 _cleanup_free_
char *term
= NULL
;
1374 /* We expect the environment to be set correctly
1375 * if run inside a container. */
1376 if (detect_container() > 0)
1379 /* When started as PID1, the kernel uses /dev/console
1380 * for our stdios and uses TERM=linux whatever the
1381 * backend device used by the console. We try to make
1382 * a better guess here since some consoles might not
1383 * have support for color mode for example.
1385 * However if TERM was configured through the kernel
1386 * command line then leave it alone. */
1388 r
= proc_cmdline_get_key("TERM", 0, &term
);
1392 term
= strdup(default_term_for_tty("/dev/console"));
1397 if (setenv("TERM", term
, 1) < 0)
1403 static void redirect_telinit(int argc
, char *argv
[]) {
1405 /* This is compatibility support for SysV, where calling init as a user is identical to telinit. */
1407 #if HAVE_SYSV_COMPAT
1408 if (getpid_cached() == 1)
1411 if (!strstr(program_invocation_short_name
, "init"))
1414 execv(SYSTEMCTL_BINARY_PATH
, argv
);
1415 log_error_errno(errno
, "Failed to exec " SYSTEMCTL_BINARY_PATH
": %m");
1420 static int become_shutdown(
1421 const char *shutdown_verb
,
1423 bool arm_reboot_watchdog
) {
1425 char log_level
[DECIMAL_STR_MAX(int) + 1],
1426 exit_code
[DECIMAL_STR_MAX(uint8_t) + 1];
1428 const char* command_line
[11] = {
1429 SYSTEMD_SHUTDOWN_BINARY_PATH
,
1431 "--log-level", log_level
,
1435 _cleanup_strv_free_
char **env_block
= NULL
;
1439 assert(command_line
[pos
] == NULL
);
1440 env_block
= strv_copy(environ
);
1442 xsprintf(log_level
, "%d", log_get_max_level());
1444 switch (log_get_target()) {
1446 case LOG_TARGET_KMSG
:
1447 case LOG_TARGET_JOURNAL_OR_KMSG
:
1448 case LOG_TARGET_SYSLOG_OR_KMSG
:
1449 command_line
[pos
++] = "kmsg";
1452 case LOG_TARGET_NULL
:
1453 command_line
[pos
++] = "null";
1456 case LOG_TARGET_CONSOLE
:
1458 command_line
[pos
++] = "console";
1462 if (log_get_show_color())
1463 command_line
[pos
++] = "--log-color";
1465 if (log_get_show_location())
1466 command_line
[pos
++] = "--log-location";
1468 if (streq(shutdown_verb
, "exit")) {
1469 command_line
[pos
++] = "--exit-code";
1470 command_line
[pos
++] = exit_code
;
1471 xsprintf(exit_code
, "%d", retval
);
1474 assert(pos
< ELEMENTSOF(command_line
));
1476 if (arm_reboot_watchdog
&& arg_shutdown_watchdog
> 0 && arg_shutdown_watchdog
!= USEC_INFINITY
) {
1479 /* If we reboot let's set the shutdown
1480 * watchdog and tell the shutdown binary to
1481 * repeatedly ping it */
1482 r
= watchdog_set_timeout(&arg_shutdown_watchdog
);
1483 watchdog_close(r
< 0);
1485 /* Tell the binary how often to ping, ignore failure */
1486 if (asprintf(&e
, "WATCHDOG_USEC="USEC_FMT
, arg_shutdown_watchdog
) > 0)
1487 (void) strv_push(&env_block
, e
);
1489 watchdog_close(true);
1491 /* Avoid the creation of new processes forked by the
1492 * kernel; at this point, we will not listen to the
1494 if (detect_container() <= 0)
1495 (void) cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER
);
1497 execve(SYSTEMD_SHUTDOWN_BINARY_PATH
, (char **) command_line
, env_block
);
1501 static void initialize_clock(void) {
1504 if (clock_is_localtime(NULL
) > 0) {
1508 * The very first call of settimeofday() also does a time warp in the kernel.
1510 * In the rtc-in-local time mode, we set the kernel's timezone, and rely on external tools to take care
1511 * of maintaining the RTC and do all adjustments. This matches the behavior of Windows, which leaves
1512 * the RTC alone if the registry tells that the RTC runs in UTC.
1514 r
= clock_set_timezone(&min
);
1516 log_error_errno(r
, "Failed to apply local time delta, ignoring: %m");
1518 log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min
);
1520 } else if (!in_initrd()) {
1522 * Do a dummy very first call to seal the kernel's time warp magic.
1524 * Do not call this from inside the initrd. The initrd might not carry /etc/adjtime with LOCAL, but the
1525 * real system could be set up that way. In such case, we need to delay the time-warp or the sealing
1526 * until we reach the real system.
1528 * Do no set the kernel's timezone. The concept of local time cannot be supported reliably, the time
1529 * will jump or be incorrect at every daylight saving time change. All kernel local time concepts will
1530 * be treated as UTC that way.
1532 (void) clock_reset_timewarp();
1535 r
= clock_apply_epoch();
1537 log_error_errno(r
, "Current system time is before build time, but cannot correct: %m");
1539 log_info("System time before build time, advancing clock.");
1542 static void initialize_coredump(bool skip_setup
) {
1544 if (getpid_cached() != 1)
1547 /* Don't limit the core dump size, so that coredump handlers such as systemd-coredump (which honour the limit)
1548 * will process core dumps for system services by default. */
1549 if (setrlimit(RLIMIT_CORE
, &RLIMIT_MAKE_CONST(RLIM_INFINITY
)) < 0)
1550 log_warning_errno(errno
, "Failed to set RLIMIT_CORE: %m");
1552 /* But at the same time, turn off the core_pattern logic by default, so that no coredumps are stored
1553 * until the systemd-coredump tool is enabled via sysctl. */
1555 (void) write_string_file("/proc/sys/kernel/core_pattern", "|/bin/false", 0);
1558 int main(int argc
, char *argv
[]) {
1560 int r
, retval
= EXIT_FAILURE
;
1561 usec_t before_startup
, after_startup
;
1562 char timespan
[FORMAT_TIMESPAN_MAX
];
1564 bool reexecute
= false;
1565 const char *shutdown_verb
= NULL
;
1566 dual_timestamp initrd_timestamp
= DUAL_TIMESTAMP_NULL
;
1567 dual_timestamp userspace_timestamp
= DUAL_TIMESTAMP_NULL
;
1568 dual_timestamp kernel_timestamp
= DUAL_TIMESTAMP_NULL
;
1569 dual_timestamp security_start_timestamp
= DUAL_TIMESTAMP_NULL
;
1570 dual_timestamp security_finish_timestamp
= DUAL_TIMESTAMP_NULL
;
1571 static char systemd
[] = "systemd";
1572 bool skip_setup
= false;
1574 bool loaded_policy
= false;
1575 bool arm_reboot_watchdog
= false;
1576 bool queue_default_job
= false;
1577 bool first_boot
= false;
1578 char *switch_root_dir
= NULL
, *switch_root_init
= NULL
;
1579 struct rlimit saved_rlimit_nofile
= RLIMIT_MAKE_CONST(0), saved_rlimit_memlock
= RLIMIT_MAKE_CONST((rlim_t
) -1);
1580 const char *error_message
= NULL
;
1582 redirect_telinit(argc
, argv
);
1584 dual_timestamp_from_monotonic(&kernel_timestamp
, 0);
1585 dual_timestamp_get(&userspace_timestamp
);
1587 /* Determine if this is a reexecution or normal bootup. We do
1588 * the full command line parsing much later, so let's just
1589 * have a quick peek here. */
1590 if (strv_find(argv
+1, "--deserialize"))
1593 /* If we have switched root, do all the special setup
1595 if (strv_find(argv
+1, "--switched-root"))
1598 /* If we get started via the /sbin/init symlink then we are
1599 called 'init'. After a subsequent reexecution we are then
1600 called 'systemd'. That is confusing, hence let's call us
1601 systemd right-away. */
1602 program_invocation_short_name
= systemd
;
1603 (void) prctl(PR_SET_NAME
, systemd
);
1608 log_set_upgrade_syslog_to_journal(true);
1610 if (getpid_cached() == 1) {
1611 /* Disable the umask logic */
1614 /* Always reopen /dev/console when running as PID 1 or one of its pre-execve() children. This is
1615 * important so that we never end up logging to any foreign stderr, for example if we have to log in a
1616 * child process right before execve()'ing the actual binary, at a point in time where socket
1617 * activation stderr/stdout area already set up. */
1618 log_set_always_reopen_console(true);
1621 if (getpid_cached() == 1 && detect_container() <= 0) {
1623 /* Running outside of a container as PID 1 */
1625 log_set_target(LOG_TARGET_KMSG
);
1629 initrd_timestamp
= userspace_timestamp
;
1632 r
= mount_setup_early();
1634 error_message
= "Failed to mount early API filesystems";
1638 dual_timestamp_get(&security_start_timestamp
);
1639 if (mac_selinux_setup(&loaded_policy
) < 0) {
1640 error_message
= "Failed to load SELinux policy";
1642 } else if (mac_smack_setup(&loaded_policy
) < 0) {
1643 error_message
= "Failed to load SMACK policy";
1645 } else if (ima_setup() < 0) {
1646 error_message
= "Failed to load IMA policy";
1649 dual_timestamp_get(&security_finish_timestamp
);
1652 if (mac_selinux_init() < 0) {
1653 error_message
= "Failed to initialize SELinux policy";
1660 /* Set the default for later on, but don't actually
1661 * open the logs like this for now. Note that if we
1662 * are transitioning from the initrd there might still
1663 * be journal fd open, and we shouldn't attempt
1664 * opening that before we parsed /proc/cmdline which
1665 * might redirect output elsewhere. */
1666 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG
);
1668 } else if (getpid_cached() == 1) {
1669 /* Running inside a container, as PID 1 */
1671 log_set_target(LOG_TARGET_CONSOLE
);
1672 log_close_console(); /* force reopen of /dev/console */
1675 /* For later on, see above... */
1676 log_set_target(LOG_TARGET_JOURNAL
);
1678 /* clear the kernel timestamp,
1679 * because we are in a container */
1680 kernel_timestamp
= DUAL_TIMESTAMP_NULL
;
1682 /* Running as user instance */
1684 log_set_target(LOG_TARGET_AUTO
);
1687 /* clear the kernel timestamp,
1688 * because we are not PID 1 */
1689 kernel_timestamp
= DUAL_TIMESTAMP_NULL
;
1692 initialize_coredump(skip_setup
);
1695 if (fixup_environment() < 0) {
1696 error_message
= "Failed to fix up PID1 environment";
1700 /* Try to figure out if we can use colors with the console. No
1701 * need to do that for user instances since they never log
1702 * into the console. */
1703 log_show_color(colors_enabled());
1704 r
= make_null_stdio();
1706 log_warning_errno(r
, "Failed to redirect standard streams to /dev/null: %m");
1709 r
= initialize_join_controllers();
1711 error_message
= "Failed to initialize cgroup controllers";
1715 /* Mount /proc, /sys and friends, so that /proc/cmdline and
1716 * /proc/$PID/fd is available. */
1717 if (getpid_cached() == 1) {
1719 /* Load the kernel modules early. */
1723 r
= mount_setup(loaded_policy
);
1725 error_message
= "Failed to mount API filesystems";
1730 /* Reset all signal handlers. */
1731 (void) reset_all_signal_handlers();
1732 (void) ignore_signals(SIGNALS_IGNORE
, -1);
1734 arg_default_tasks_max
= system_tasks_max_scale(DEFAULT_TASKS_MAX_PERCENTAGE
, 100U);
1736 if (parse_config_file() < 0) {
1737 error_message
= "Failed to parse config file";
1742 r
= proc_cmdline_parse(parse_proc_cmdline_item
, NULL
, 0);
1744 log_warning_errno(r
, "Failed to parse kernel command line, ignoring: %m");
1747 /* Note that this also parses bits from the kernel command
1748 * line, including "debug". */
1749 log_parse_environment();
1751 if (parse_argv(argc
, argv
) < 0) {
1752 error_message
= "Failed to parse commandline arguments";
1756 /* Initialize default unit */
1757 if (!arg_default_unit
) {
1758 arg_default_unit
= strdup(SPECIAL_DEFAULT_TARGET
);
1759 if (!arg_default_unit
) {
1761 error_message
= "Failed to set default unit";
1766 if (arg_action
== ACTION_TEST
&&
1768 log_error("Don't run test mode as root.");
1773 arg_action
== ACTION_RUN
&&
1775 log_error("Trying to run as user instance, but the system has not been booted with systemd.");
1780 arg_action
== ACTION_RUN
&&
1781 running_in_chroot() > 0) {
1782 log_error("Cannot be run in a chroot() environment.");
1786 if (IN_SET(arg_action
, ACTION_TEST
, ACTION_HELP
)) {
1787 pager_open(arg_no_pager
, false);
1791 if (arg_action
== ACTION_HELP
) {
1794 } else if (arg_action
== ACTION_VERSION
) {
1797 } else if (arg_action
== ACTION_DUMP_CONFIGURATION_ITEMS
) {
1798 pager_open(arg_no_pager
, false);
1799 unit_dump_config_items(stdout
);
1800 retval
= EXIT_SUCCESS
;
1805 !getenv("XDG_RUNTIME_DIR")) {
1806 log_error("Trying to run as user instance, but $XDG_RUNTIME_DIR is not set.");
1810 assert_se(IN_SET(arg_action
, ACTION_RUN
, ACTION_TEST
));
1812 /* Close logging fds, in order not to confuse fdset below */
1815 /* Remember open file descriptors for later deserialization */
1816 if (arg_action
== ACTION_RUN
) {
1817 r
= fdset_new_fill(&fds
);
1819 log_emergency_errno(r
, "Failed to allocate fd set: %m");
1820 error_message
= "Failed to allocate fd set";
1823 fdset_cloexec(fds
, true);
1825 if (arg_serialization
)
1826 assert_se(fdset_remove(fds
, fileno(arg_serialization
)) >= 0);
1829 /* Become a session leader if we aren't one yet. */
1833 /* Move out of the way, so that we won't block unmounts */
1834 assert_se(chdir("/") == 0);
1836 /* Reset the console, but only if this is really init and we
1837 * are freshly booted */
1838 if (arg_system
&& arg_action
== ACTION_RUN
) {
1840 /* If we are init, we connect stdin/stdout/stderr to
1841 * /dev/null and make sure we don't have a controlling
1845 if (getpid_cached() == 1 && !skip_setup
)
1849 /* Open the logging devices, if possible and necessary */
1852 if (arg_show_status
== _SHOW_STATUS_UNSET
)
1853 arg_show_status
= SHOW_STATUS_YES
;
1855 /* Make sure we leave a core dump without panicing the
1857 if (getpid_cached() == 1) {
1858 install_crash_handler();
1860 r
= mount_cgroup_controllers(arg_join_controllers
);
1868 log_info(PACKAGE_STRING
" running in %ssystem mode. (" SYSTEMD_FEATURES
")",
1869 arg_action
== ACTION_TEST
? "test " : "" );
1871 v
= detect_virtualization();
1873 log_info("Detected virtualization %s.", virtualization_to_string(v
));
1875 write_container_id();
1877 log_info("Detected architecture %s.", architecture_to_string(uname_architecture()));
1880 log_info("Running in initial RAM disk.");
1882 /* Let's check whether we are in first boot, i.e. whether /etc is still unpopulated. We use
1883 * /etc/machine-id as flag file, for this: if it exists we assume /etc is populated, if it
1884 * doesn't it's unpopulated. This allows container managers and installers to provision a
1885 * couple of files already. If the container manager wants to provision the machine ID itself
1886 * it should pass $container_uuid to PID 1. */
1888 first_boot
= access("/etc/machine-id", F_OK
) < 0;
1890 log_info("Running with unpopulated /etc.");
1893 _cleanup_free_
char *t
;
1895 t
= uid_to_name(getuid());
1896 log_debug(PACKAGE_STRING
" running in %suser mode for user " UID_FMT
"/%s. (" SYSTEMD_FEATURES
")",
1897 arg_action
== ACTION_TEST
? " test" : "", getuid(), strna(t
));
1900 if (arg_action
== ACTION_RUN
) {
1901 if (arg_system
&& !skip_setup
) {
1902 if (arg_show_status
> 0)
1906 machine_id_setup(NULL
, arg_machine_id
, NULL
);
1908 bump_unix_max_dgram_qlen();
1913 if (arg_system
&& arg_runtime_watchdog
> 0 && arg_runtime_watchdog
!= USEC_INFINITY
)
1914 watchdog_set_timeout(&arg_runtime_watchdog
);
1916 if (arg_timer_slack_nsec
!= NSEC_INFINITY
)
1917 if (prctl(PR_SET_TIMERSLACK
, arg_timer_slack_nsec
) < 0)
1918 log_error_errno(errno
, "Failed to adjust timer slack: %m");
1920 if (arg_system
&& !cap_test_all(arg_capability_bounding_set
)) {
1921 r
= capability_bounding_set_drop_usermode(arg_capability_bounding_set
);
1923 log_emergency_errno(r
, "Failed to drop capability bounding set of usermode helpers: %m");
1924 error_message
= "Failed to drop capability bounding set of usermode helpers";
1927 r
= capability_bounding_set_drop(arg_capability_bounding_set
, true);
1929 log_emergency_errno(r
, "Failed to drop capability bounding set: %m");
1930 error_message
= "Failed to drop capability bounding set";
1935 if (arg_syscall_archs
) {
1936 r
= enforce_syscall_archs(arg_syscall_archs
);
1938 error_message
= "Failed to set syscall architectures";
1944 /* Become reaper of our children */
1945 if (prctl(PR_SET_CHILD_SUBREAPER
, 1) < 0)
1946 log_warning_errno(errno
, "Failed to make us a subreaper: %m");
1949 /* Bump up RLIMIT_NOFILE for systemd itself */
1950 (void) bump_rlimit_nofile(&saved_rlimit_nofile
);
1951 (void) bump_rlimit_memlock(&saved_rlimit_memlock
);
1955 r
= manager_new(arg_system
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
1956 arg_action
== ACTION_TEST
? MANAGER_TEST_FULL
: 0,
1959 log_emergency_errno(r
, "Failed to allocate manager object: %m");
1960 error_message
= "Failed to allocate manager object";
1964 m
->userspace_timestamp
= userspace_timestamp
;
1965 m
->kernel_timestamp
= kernel_timestamp
;
1966 m
->initrd_timestamp
= initrd_timestamp
;
1967 m
->security_start_timestamp
= security_start_timestamp
;
1968 m
->security_finish_timestamp
= security_finish_timestamp
;
1970 set_manager_defaults(m
);
1971 set_manager_settings(m
);
1972 manager_set_first_boot(m
, first_boot
);
1974 /* Remember whether we should queue the default job */
1975 queue_default_job
= !arg_serialization
|| arg_switched_root
;
1977 before_startup
= now(CLOCK_MONOTONIC
);
1979 r
= manager_startup(m
, arg_serialization
, fds
);
1981 log_error_errno(r
, "Failed to fully start up daemon: %m");
1985 /* This will close all file descriptors that were opened, but
1986 * not claimed by any unit. */
1987 fds
= fdset_free(fds
);
1989 arg_serialization
= safe_fclose(arg_serialization
);
1991 if (queue_default_job
) {
1992 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
1993 Unit
*target
= NULL
;
1994 Job
*default_unit_job
;
1996 log_debug("Activating default unit: %s", arg_default_unit
);
1998 r
= manager_load_unit(m
, arg_default_unit
, NULL
, &error
, &target
);
2000 log_error("Failed to load default target: %s", bus_error_message(&error
, r
));
2001 else if (IN_SET(target
->load_state
, UNIT_ERROR
, UNIT_NOT_FOUND
))
2002 log_error_errno(target
->load_error
, "Failed to load default target: %m");
2003 else if (target
->load_state
== UNIT_MASKED
)
2004 log_error("Default target masked.");
2006 if (!target
|| target
->load_state
!= UNIT_LOADED
) {
2007 log_info("Trying to load rescue target...");
2009 r
= manager_load_unit(m
, SPECIAL_RESCUE_TARGET
, NULL
, &error
, &target
);
2011 log_emergency("Failed to load rescue target: %s", bus_error_message(&error
, r
));
2012 error_message
= "Failed to load rescue target";
2014 } else if (IN_SET(target
->load_state
, UNIT_ERROR
, UNIT_NOT_FOUND
)) {
2015 log_emergency_errno(target
->load_error
, "Failed to load rescue target: %m");
2016 error_message
= "Failed to load rescue target";
2018 } else if (target
->load_state
== UNIT_MASKED
) {
2019 log_emergency("Rescue target masked.");
2020 error_message
= "Rescue target masked";
2025 assert(target
->load_state
== UNIT_LOADED
);
2027 if (arg_action
== ACTION_TEST
) {
2028 printf("-> By units:\n");
2029 manager_dump_units(m
, stdout
, "\t");
2032 r
= manager_add_job(m
, JOB_START
, target
, JOB_ISOLATE
, &error
, &default_unit_job
);
2034 log_debug("Default target could not be isolated, starting instead: %s", bus_error_message(&error
, r
));
2036 sd_bus_error_free(&error
);
2038 r
= manager_add_job(m
, JOB_START
, target
, JOB_REPLACE
, &error
, &default_unit_job
);
2040 log_emergency("Failed to start default target: %s", bus_error_message(&error
, r
));
2041 error_message
= "Failed to start default target";
2045 log_emergency("Failed to isolate default target: %s", bus_error_message(&error
, r
));
2046 error_message
= "Failed to isolate default target";
2050 m
->default_unit_job_id
= default_unit_job
->id
;
2052 after_startup
= now(CLOCK_MONOTONIC
);
2053 log_full(arg_action
== ACTION_TEST
? LOG_INFO
: LOG_DEBUG
,
2054 "Loaded units and determined initial transaction in %s.",
2055 format_timespan(timespan
, sizeof(timespan
), after_startup
- before_startup
, 100 * USEC_PER_MSEC
));
2057 if (arg_action
== ACTION_TEST
) {
2058 printf("-> By jobs:\n");
2059 manager_dump_jobs(m
, stdout
, "\t");
2060 retval
= EXIT_SUCCESS
;
2066 r
= manager_loop(m
);
2068 log_emergency_errno(r
, "Failed to run main loop: %m");
2069 error_message
= "Failed to run main loop";
2073 switch (m
->exit_code
) {
2075 case MANAGER_RELOAD
:
2076 log_info("Reloading.");
2078 r
= parse_config_file();
2080 log_error("Failed to parse config file.");
2082 set_manager_defaults(m
);
2084 r
= manager_reload(m
);
2086 log_error_errno(r
, "Failed to reload: %m");
2089 case MANAGER_REEXECUTE
:
2091 if (prepare_reexecute(m
, &arg_serialization
, &fds
, false) < 0) {
2092 error_message
= "Failed to prepare for reexecution";
2097 log_notice("Reexecuting.");
2100 case MANAGER_SWITCH_ROOT
:
2101 /* Steal the switch root parameters */
2102 switch_root_dir
= m
->switch_root
;
2103 switch_root_init
= m
->switch_root_init
;
2104 m
->switch_root
= m
->switch_root_init
= NULL
;
2106 if (!switch_root_init
)
2107 if (prepare_reexecute(m
, &arg_serialization
, &fds
, true) < 0) {
2108 error_message
= "Failed to prepare for reexecution";
2113 log_notice("Switching root.");
2117 retval
= m
->return_value
;
2119 if (MANAGER_IS_USER(m
)) {
2125 case MANAGER_REBOOT
:
2126 case MANAGER_POWEROFF
:
2128 case MANAGER_KEXEC
: {
2129 static const char * const table
[_MANAGER_EXIT_CODE_MAX
] = {
2130 [MANAGER_EXIT
] = "exit",
2131 [MANAGER_REBOOT
] = "reboot",
2132 [MANAGER_POWEROFF
] = "poweroff",
2133 [MANAGER_HALT
] = "halt",
2134 [MANAGER_KEXEC
] = "kexec"
2137 assert_se(shutdown_verb
= table
[m
->exit_code
]);
2138 arm_reboot_watchdog
= m
->exit_code
== MANAGER_REBOOT
;
2140 log_notice("Shutting down.");
2145 assert_not_reached("Unknown exit code.");
2153 arg_shutdown_watchdog
= m
->shutdown_watchdog
;
2155 m
= manager_free(m
);
2157 for (j
= 0; j
< ELEMENTSOF(arg_default_rlimit
); j
++)
2158 arg_default_rlimit
[j
] = mfree(arg_default_rlimit
[j
]);
2160 arg_default_unit
= mfree(arg_default_unit
);
2161 arg_confirm_spawn
= mfree(arg_confirm_spawn
);
2162 arg_join_controllers
= strv_free_free(arg_join_controllers
);
2163 arg_default_environment
= strv_free(arg_default_environment
);
2164 arg_syscall_archs
= set_free(arg_syscall_archs
);
2166 mac_selinux_finish();
2170 unsigned i
, args_size
;
2172 /* Close and disarm the watchdog, so that the new
2173 * instance can reinitialize it, but doesn't get
2174 * rebooted while we do that */
2175 watchdog_close(true);
2177 /* Reset the RLIMIT_NOFILE to the kernel default, so
2178 * that the new systemd can pass the kernel default to
2179 * its child processes */
2180 if (saved_rlimit_nofile
.rlim_cur
> 0)
2181 (void) setrlimit(RLIMIT_NOFILE
, &saved_rlimit_nofile
);
2182 if (saved_rlimit_memlock
.rlim_cur
!= (rlim_t
) -1)
2183 (void) setrlimit(RLIMIT_MEMLOCK
, &saved_rlimit_memlock
);
2185 if (switch_root_dir
) {
2186 /* Kill all remaining processes from the
2187 * initrd, but don't wait for them, so that we
2188 * can handle the SIGCHLD for them after
2190 broadcast_signal(SIGTERM
, false, true);
2192 /* And switch root with MS_MOVE, because we remove the old directory afterwards and detach it. */
2193 r
= switch_root(switch_root_dir
, "/mnt", true, MS_MOVE
);
2195 log_error_errno(r
, "Failed to switch root, trying to continue: %m");
2198 args_size
= MAX(6, argc
+1);
2199 args
= newa(const char*, args_size
);
2201 if (!switch_root_init
) {
2202 char sfd
[DECIMAL_STR_MAX(int) + 1];
2204 /* First try to spawn ourselves with the right
2205 * path, and with full serialization. We do
2206 * this only if the user didn't specify an
2207 * explicit init to spawn. */
2209 assert(arg_serialization
);
2212 xsprintf(sfd
, "%i", fileno(arg_serialization
));
2215 args
[i
++] = SYSTEMD_BINARY_PATH
;
2216 if (switch_root_dir
)
2217 args
[i
++] = "--switched-root";
2218 args
[i
++] = arg_system
? "--system" : "--user";
2219 args
[i
++] = "--deserialize";
2223 assert(i
<= args_size
);
2226 * We want valgrind to print its memory usage summary before reexecution.
2227 * Valgrind won't do this is on its own on exec(), but it will do it on exit().
2228 * Hence, to ensure we get a summary here, fork() off a child, let it exit() cleanly,
2229 * so that it prints the summary, and wait() for it in the parent, before proceeding into the exec().
2231 valgrind_summary_hack();
2233 (void) execv(args
[0], (char* const*) args
);
2236 /* Try the fallback, if there is any, without any
2237 * serialization. We pass the original argv[] and
2238 * envp[]. (Well, modulo the ordering changes due to
2239 * getopt() in argv[], and some cleanups in envp[],
2240 * but let's hope that doesn't matter.) */
2242 arg_serialization
= safe_fclose(arg_serialization
);
2243 fds
= fdset_free(fds
);
2245 /* Reopen the console */
2246 (void) make_console_stdio();
2248 for (j
= 1, i
= 1; j
< (unsigned) argc
; j
++)
2249 args
[i
++] = argv
[j
];
2251 assert(i
<= args_size
);
2253 /* Reenable any blocked signals, especially important
2254 * if we switch from initial ramdisk to init=... */
2255 (void) reset_all_signal_handlers();
2256 (void) reset_signal_mask();
2258 if (switch_root_init
) {
2259 args
[0] = switch_root_init
;
2260 (void) execv(args
[0], (char* const*) args
);
2261 log_warning_errno(errno
, "Failed to execute configured init, trying fallback: %m");
2264 args
[0] = "/sbin/init";
2265 (void) execv(args
[0], (char* const*) args
);
2267 manager_status_printf(NULL
, STATUS_TYPE_EMERGENCY
,
2268 ANSI_HIGHLIGHT_RED
" !! " ANSI_NORMAL
,
2269 "Failed to execute /sbin/init");
2271 if (errno
== ENOENT
) {
2272 log_warning("No /sbin/init, trying fallback");
2274 args
[0] = "/bin/sh";
2276 (void) execv(args
[0], (char* const*) args
);
2277 log_error_errno(errno
, "Failed to execute /bin/sh, giving up: %m");
2279 log_warning_errno(errno
, "Failed to execute /sbin/init, giving up: %m");
2281 error_message
= "Failed to execute fallback shell";
2284 arg_serialization
= safe_fclose(arg_serialization
);
2285 fds
= fdset_free(fds
);
2287 #if HAVE_VALGRIND_VALGRIND_H
2288 /* If we are PID 1 and running under valgrind, then let's exit
2289 * here explicitly. valgrind will only generate nice output on
2290 * exit(), not on exec(), hence let's do the former not the
2292 if (getpid_cached() == 1 && RUNNING_ON_VALGRIND
)
2296 if (shutdown_verb
) {
2297 r
= become_shutdown(shutdown_verb
, retval
, arm_reboot_watchdog
);
2299 log_error_errno(r
, "Failed to execute shutdown binary, %s: %m", getpid_cached() == 1 ? "freezing" : "quitting");
2300 error_message
= "Failed to execute shutdown binary";
2303 if (getpid_cached() == 1) {
2305 manager_status_printf(NULL
, STATUS_TYPE_EMERGENCY
,
2306 ANSI_HIGHLIGHT_RED
"!!!!!!" ANSI_NORMAL
,
2307 "%s, freezing.", error_message
);