summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-09-17 17:42:13 +0200
committerLennart Poettering <lennart@poettering.net>2012-09-17 17:47:47 +0200
commita866073d35dea05e6f3e56328d3eb6436943e7e6 (patch)
tree8d8fbadda92216a862b9411d82d5bfb866939ed0 /src/core
parent72edcff5db936e54cfc322d9392ec46e2428fd9b (diff)
main: when transitioning from initrd to the main system log to kmsg
When the new PID is invoked the journal socket from the initrd might still be around. Due to the default log target being journal we'd log to that initially when the new main systemd initializes even if the kernel command line included a directive to redirect systemd's logging elsewhere. With this fix we initially always log to kmsg now, if we are PID1, and only after parsing the kernel cmdline try to open the journal if that's desired. (The effective benefit of this is that SELinux performance data is now logged again to kmsg like it used to be.)
Diffstat (limited to 'src/core')
-rw-r--r--src/core/main.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/src/core/main.c b/src/core/main.c
index 199383e636..9d2d55154c 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1285,10 +1285,15 @@ int main(int argc, char *argv[]) {
saved_argc = argc;
log_show_color(isatty(STDERR_FILENO) > 0);
- log_show_location(false);
- log_set_max_level(LOG_INFO);
- if (getpid() == 1) {
+ if (getpid() == 1 && detect_container(NULL) <= 0) {
+
+ /* Running outside of a container as PID 1 */
+ arg_running_as = MANAGER_SYSTEM;
+ make_null_stdio();
+ log_set_target(LOG_TARGET_KMSG);
+ log_open();
+
if (in_initrd()) {
char *rd_timestamp = NULL;
@@ -1302,11 +1307,6 @@ int main(int argc, char *argv[]) {
}
}
- arg_running_as = MANAGER_SYSTEM;
-
- make_null_stdio();
- log_set_target(detect_container(NULL) > 0 ? LOG_TARGET_JOURNAL : LOG_TARGET_JOURNAL_OR_KMSG);
-
if (!skip_setup) {
if (selinux_setup(&loaded_policy) < 0)
goto finish;
@@ -1314,8 +1314,6 @@ int main(int argc, char *argv[]) {
goto finish;
}
- log_open();
-
if (label_init(NULL) < 0)
goto finish;
@@ -1339,7 +1337,28 @@ int main(int argc, char *argv[]) {
log_error("Failed to set the kernel's time zone, ignoring: %s", strerror(-r));
}
}
+
+ /* Set the default for later on, but don't actually
+ * open the logs like this for now. Note that if we
+ * are transitioning from the initrd there might still
+ * be journal fd open, and we shouldn't attempt
+ * opening that before we parsed /proc/cmdline which
+ * might redirect output elsewhere. */
+ log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
+
+ } else if (getpid() == 1) {
+
+ /* Running inside a container, as PID 1 */
+ arg_running_as = MANAGER_SYSTEM;
+ log_set_target(LOG_TARGET_CONSOLE);
+ log_open();
+
+ /* For the later on, see above... */
+ log_set_target(LOG_TARGET_JOURNAL);
+
} else {
+
+ /* Running as user instance */
arg_running_as = MANAGER_USER;
log_set_target(LOG_TARGET_AUTO);
log_open();