#include "capability.h"
#include "killall.h"
#include "env-util.h"
-#include "hwclock.h"
+#include "clock-util.h"
#include "fileio.h"
#include "dbus-manager.h"
#include "bus-error.h"
}
} else if (streq(key, "quiet") && !value) {
-
if (arg_show_status == _SHOW_STATUS_UNSET)
arg_show_status = SHOW_STATUS_AUTO;
} else if (streq(key, "debug") && !value) {
-
- /* Log to kmsg, the journal socket will fill up before the
- * journal is started and tools running during that time
- * will block with every log message for for 60 seconds,
- * before they give up. */
log_set_max_level(LOG_DEBUG);
- log_set_target(detect_container(NULL) > 0 ? LOG_TARGET_CONSOLE : LOG_TARGET_KMSG);
+ if (detect_container(NULL) > 0)
+ log_set_target(LOG_TARGET_CONSOLE);
} else if (!in_initrd() && !value) {
unsigned i;
}
static void test_mtab(void) {
- char *p;
- /* Check that /etc/mtab is a symlink */
+ static const char ok[] =
+ "/proc/self/mounts\0"
+ "/proc/mounts\0"
+ "../proc/self/mounts\0"
+ "../proc/mounts\0";
- if (readlink_malloc("/etc/mtab", &p) >= 0) {
- bool b;
+ _cleanup_free_ char *p = NULL;
+ int r;
- b = streq(p, "/proc/self/mounts") || streq(p, "/proc/mounts");
- free(p);
+ /* Check that /etc/mtab is a symlink to the right place or
+ * non-existing. But certainly not a file, or a symlink to
+ * some weird place... */
- if (b)
- return;
- }
+ r = readlink_malloc("/etc/mtab", &p);
+ if (r == -ENOENT)
+ return;
+ if (r >= 0 && nulstr_contains(ok, p))
+ return;
log_warning("/etc/mtab is not a symlink or not pointing to /proc/self/mounts. "
"This is not supported anymore. "
"Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
}
-static void test_cgroups(void) {
-
- if (access("/proc/cgroups", F_OK) >= 0)
- return;
-
- log_warning("CONFIG_CGROUPS was not set when your kernel was compiled. "
- "Systems without control groups are not supported. "
- "We will now sleep for 10s, and then continue boot-up. "
- "Expect breakage and please do not file bugs. "
- "Instead fix your kernel and enable CONFIG_CGROUPS. "
- "Consult http://0pointer.de/blog/projects/cgroups-vs-cgroups.html for more information.");
-
- sleep(10);
-}
-
static int initialize_join_controllers(void) {
/* By default, mount "cpu" + "cpuacct" together, and "net_cls"
* + "net_prio". We'd like to add "cpuset" to the mix, but
"PRETTY_NAME", &pretty_name,
"ANSI_COLOR", &ansi_color,
NULL);
+ if (r == -ENOENT) {
+ r = parse_env_file("/usr/lib/os-release", NEWLINE,
+ "PRETTY_NAME", &pretty_name,
+ "ANSI_COLOR", &ansi_color,
+ NULL);
+ }
if (r < 0 && r != -ENOENT)
- log_warning("Failed to read /etc/os-release: %s", strerror(-r));
+ log_warning("Failed to read os-release file: %s", strerror(-r));
return status_printf(NULL, false, false,
"\nWelcome to \x1B[%sm%s\x1B[0m!\n",
isempty(pretty_name) ? "Linux" : pretty_name);
}
+static int write_container_id(void) {
+ const char *c;
+
+ c = getenv("container");
+ if (isempty(c))
+ return 0;
+
+ return write_string_file("/run/systemd/container", c);
+}
+
int main(int argc, char *argv[]) {
Manager *m = NULL;
int r, retval = EXIT_FAILURE;
goto finish;
if (!skip_setup) {
- if (hwclock_is_localtime() > 0) {
+ if (clock_is_localtime() > 0) {
int min;
/* The first-time call to settimeofday() does a time warp in the kernel */
- r = hwclock_set_timezone(&min);
+ r = clock_set_timezone(&min);
if (r < 0)
log_error("Failed to apply local time delta, ignoring: %s", strerror(-r));
else
* that way. In such case, we need to delay the time-warp or the sealing
* until we reach the real system.
*/
- hwclock_reset_timezone();
+ clock_reset_timezone();
/* Tell the kernel our timezone */
- r = hwclock_set_timezone(NULL);
+ r = clock_set_timezone(NULL);
if (r < 0)
log_error("Failed to set the kernel's timezone, ignoring: %s", strerror(-r));
}
if (virtualization)
log_info("Detected virtualization '%s'.", virtualization);
+ write_container_id();
+
log_info("Detected architecture '%s'.", architecture_to_string(uname_architecture()));
if (in_initrd())
test_mtab();
test_usr();
- test_cgroups();
}
if (arg_running_as == SYSTEMD_SYSTEM && arg_runtime_watchdog > 0)
if (reexecute) {
const char **args;
unsigned i, args_size;
+ sigset_t ss, o_ss;
/* Close and disarm the watchdog, so that the new
* instance can reinitialize it, but doesn't get
args[i++] = NULL;
assert(i <= args_size);
+ /* reenable any blocked signals, especially important
+ * if we switch from initial ramdisk to init=... */
+ sigemptyset(&ss);
+ sigprocmask(SIG_SETMASK, &ss, &o_ss);
+
if (switch_root_init) {
args[0] = switch_root_init;
execv(args[0], (char* const*) args);
log_error("Failed to execute /bin/sh, giving up: %m");
} else
log_warning("Failed to execute /sbin/init, giving up: %m");
+
+ sigprocmask(SIG_SETMASK, &o_ss, NULL);
}
if (arg_serialization) {